ABI 类型
原文:# t0]https://web 3 py . readthedocs . io/en/stable/ABI _ types . html
Web3 库遵循以下约定。
字节与文本
- 术语字节用于指代字符串的二进制表示。
- 术语文本用于指代字符串的 unicode 表示。
十六进制表示
- 所有十六进制值将以文本形式返回。
- 所有十六进制值都将以
0x
为前缀。
以太坊地址
所有地址必须以三种方式之一提供:
- 当连接到 mainnet 时,以太坊名称服务名称(通常以
myname.eth
的形式) - 一个 20 字节的十六进制数,使用 EIP-55 规范进行校验和。
- 20 字节的二进制地址。
严格字节类型检查
注意
在版本 6 中,这将是默认行为
web3 上有一个方法可以实现更严格的字节类型检查。默认情况下允许 Python 字符串,并允许小于指定字节大小的字节字符串。要启用更严格的检查,请使用w3.enable_strict_bytes_type_checking()
。如果在没有“0x”前缀的情况下传递 Python 字符串,此方法将导致 web3 实例引发错误。如果字节字符串或十六进制字符串不是 ABI 类型指定的确切字节数,也会引发错误。参见 启用字节类型严格检查 部分的示例和更多详细信息。
示例类型
让我们使用一个虚构的合约来演示 Web3.py 中的输入类型:
contract ManyTypes {
// booleans
bool public b;
// unsigned ints
uint8 public u8;
uint256 public u256;
uint256[] public u256s;
// signed ints
int8 public i8;
// addresses
address public addr;
address[] public addrs;
// bytes
bytes1 public b1;
// structs
struct S {
address sa;
bytes32 sb;
}
mapping(address => S) addrStructs;
function updateBool(bool x) public { b = x; }
function updateUint8(uint8 x) public { u8 = x; }
function updateUint256(uint256 x) public { u256 = x; }
function updateUintArray(uint256[] memory x) public { u256s = x; }
function updateInt8(int8 x) public { i8 = x; }
function updateAddr(address x) public { addr = x; }
function updateBytes1(bytes1 x) public { b1 = x; }
function updateMapping(S memory x) public { addrStructs[x.sa] = x; }
}
布尔运算
contract_instance.functions.updateBool(True).transact()
无符号整数
contract_instance.functions.updateUint8(255).transact()
contract_instance.functions.updateUint256(2**256 - 1).transact()
contract_instance.functions.updateUintArray([1, 2, 3]).transact()
有符号整数
contract_instance.functions.updateInt8(-128).transact()
地址
contract_instance.functions.updateAddr("0x0000000000000000000000000000000000000000").transact()
字节
contract_instance.functions.updateBytes1(HexBytes(255)).transact()
结构
contract_instance.functions.updateMapping({"sa": "0x0000000000000000000000000000000000000000", "sb": HexBytes(123)}).transact()