跳转至

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() 


回到顶部