Web3 API
```py class web3.Web3(provider)
每个`Web3`实例公开了以下 API。
## [供应商](#id1)
```py
Web3.HTTPProvider
访问 web3.providers.rpc.HTTPProvider
的便捷 API
Web3.IPCProvider
访问 web3.providers.ipc.IPCProvider
的便捷 API
属性
Web3.api
返回当前的 Web3 版本。
>>> web3.api
"4.7.0"
Web3.clientVersion
- 委托给
web3_clientVersion
RPC 方法
返回当前客户端版本。
>>> web3.clientVersion
'Geth/v1.4.11-stable-fed692f6/darwin/go1.7'
## 编码和解码助手
Web3.toHex(*primitive=None*, *hexstr=None*, *text=None*)
接受各种输入,并以十六进制表示形式返回。它遵循 JSON-RPC 规范中转换为十六进制的规则
>>> Web3.toHex(0)
'0x0'
>>> Web3.toHex(1)
'0x1'
>>> Web3.toHex(0x0)
'0x0'
>>> Web3.toHex(0x000F)
'0xf'
>>> Web3.toHex(b'')
'0x'
>>> Web3.toHex(b'\x00\x0F')
'0x000f'
>>> Web3.toHex(False)
'0x0'
>>> Web3.toHex(True)
'0x1'
>>> Web3.toHex(hexstr='0x000F')
'0x000f'
>>> Web3.toHex(hexstr='000F')
'0x000f'
>>> Web3.toHex(text='')
'0x'
>>> Web3.toHex(text='cowmö')
'0x636f776dc3b6'
Web3.toText(*primitive=None*, *hexstr=None*, *text=None*)
接受各种输入并返回其等效字符串。文本被解码为 UTF 8。
>>> Web3.toText(0x636f776dc3b6)
'cowmö'
>>> Web3.toText(b'cowm\xc3\xb6')
'cowmö'
>>> Web3.toText(hexstr='0x636f776dc3b6')
'cowmö'
>>> Web3.toText(hexstr='636f776dc3b6')
'cowmö'
>>> Web3.toText(text='cowmö')
'cowmö'
Web3.toBytes(*primitive=None*, *hexstr=None*, *text=None*)
接受各种输入并返回其等效字节。文本被编码为 UTF 8。
>>> Web3.toBytes(0)
b'\x00'
>>> Web3.toBytes(0x000F)
b'\x0f'
>>> Web3.toBytes(b'')
b''
>>> Web3.toBytes(b'\x00\x0F')
b'\x00\x0f'
>>> Web3.toBytes(False)
b'\x00'
>>> Web3.toBytes(True)
b'\x01'
>>> Web3.toBytes(hexstr='0x000F')
b'\x00\x0f'
>>> Web3.toBytes(hexstr='000F')
b'\x00\x0f'
>>> Web3.toBytes(text='')
b''
>>> Web3.toBytes(text='cowmö')
b'cowm\xc3\xb6'
Web3.toInt(*primitive=None*, *hexstr=None*, *text=None*)
接受各种输入并返回其等效整数。
>>> Web3.toInt(0)
0
>>> Web3.toInt(0x000F)
15
>>> Web3.toInt(b'\x00\x0F')
15
>>> Web3.toInt(False)
0
>>> Web3.toInt(True)
1
>>> Web3.toInt(hexstr='0x000F')
15
>>> Web3.toInt(hexstr='000F')
15
Web3.toJSON(*obj*)
接受各种输入并返回它的 JSON 等价物。
>>> Web3.toJSON(3)
'3'
>>> Web3.toJSON({'one': 1})
'{"one": 1}'
``` ## [货币兑换](#id4)
```py
Web3.toWei(*value*, *currency*)
返回由currency
参数指定的面值中转换为魏的值。
>>> Web3.toWei(1, 'ether')
1000000000000000000
Web3.fromWei(*value*, *currency*)
返回转换为给定货币的魏值。该值作为一个Decimal
返回,以确保精确到魏。
>>> Web3.fromWei(1000000000000000000, 'ether')
Decimal('1')
``` ## [地址](#id5)
```py
Web3.isAddress(*value*)
如果值是可识别的地址格式之一,则返回True
。
- 允许有前缀和无前缀的值。
- 如果地址包含混合的大小写字符,该函数还根据 EIP55 检查地址校验和是否有效
>>> Web3.isAddress('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
True
Web3.isChecksumAddress(*value*)
如果该值是有效的 EIP55 校验和地址,则返回True
>>> Web3.isChecksumAddress('0xd3CdA913deB6f67967B99D67aCDFa1712C293601')
True
>>> Web3.isChecksumAddress('0xd3cda913deb6f67967b99d67acdfa1712c293601')
False
Web3.toChecksumAddress(*value*)
返回带有 EIP55 校验和的给定地址。
>>> Web3.toChecksumAddress('0xd3cda913deb6f67967b99d67acdfa1712c293601')
'0xd3CdA913deB6f67967B99D67aCDFa1712C293601'
``` ## [密码散列法](#id6)
```py
*classmethod* Web3.keccak(*primitive=None*, *hexstr=None*, *text=None*)
返回给定值的 Keccak-256。在计算哈希之前,文本被编码为 UTF-8,就像 Solidity 一样。以下任何一项都是有效和等效的:
>>> Web3.keccak(0x747874)
>>> Web3.keccak(b'\x74\x78\x74')
>>> Web3.keccak(hexstr='0x747874')
>>> Web3.keccak(hexstr='747874')
>>> Web3.keccak(text='txt')
HexBytes('0xd7278090a36507640ea6b7a0034b69b0d240766fa3f98e3722be93c613b29d2e')
*classmethod* Web3.solidityKeccak(*abi_types*, *value*)
返回 Keccak-256,因为它将由 solidity keccak
函数对value
列表内容的打包 ABI 编码进行计算。abi_types
参数应该是对应于每个提供的值的实体类型字符串的列表。
>>> Web3.solidityKeccak(['bool'], [True])
HexBytes("0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2")
>>> Web3.solidityKeccak(['uint8', 'uint8', 'uint8'], [97, 98, 99])
HexBytes("0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
>>> Web3.solidityKeccak(['uint8[]'], [[97, 98, 99]])
HexBytes("0x233002c671295529bcc50b76a2ef2b0de2dac2d93945fca745255de1a9e4017e")
>>> Web3.solidityKeccak(['address'], ["0x49EdDD3769c0712032808D86597B84ac5c2F5614"])
HexBytes("0x2ff37b5607484cd4eecf6d13292e22bd6e5401eaffcc07e279583bc742c68882")
>>> Web3.solidityKeccak(['address'], ["ethereumfoundation.eth"])
HexBytes("0x913c99ea930c78868f1535d34cd705ab85929b2eaaf70fcd09677ecd6e5d75e9")
可比坚固性用法:
bytes32 data1 = keccak256(abi.encodePacked(true)); assert(data1 == hex"5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2"); bytes32 data2 = keccak256(abi.encodePacked(uint8(97), uint8(98), uint8(99))); assert(data2 == hex"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45");
*classmethod* Web3.sha3(*primitive=None*, *hexstr=None*, *text=None*)
警告
对于 keccak()
这种方法已经被弃用
返回给定值的 Keccak SHA256。在计算哈希之前,文本被编码为 UTF-8,就像 Solidity 一样。以下任何一项都是有效和等效的:
>>> Web3.sha3(0x747874)
>>> Web3.sha3(b'\x74\x78\x74')
>>> Web3.sha3(hexstr='0x747874')
>>> Web3.sha3(hexstr='747874')
>>> Web3.sha3(text='txt')
HexBytes('0xd7278090a36507640ea6b7a0034b69b0d240766fa3f98e3722be93c613b29d2e')
*classmethod* Web3.soliditySha3(*abi_types*, *value*)
警告
对于 solidityKeccak()
这种方法已经被弃用
返回 sha3,因为它将由 solidity sha3
函数在提供的value
和abi_types
上计算。abi_types
值应该是与每个提供的值相对应的实度类型字符串列表。
>>> Web3.soliditySha3(['bool'], [True])
HexBytes("0x5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2")
>>> Web3.soliditySha3(['uint8', 'uint8', 'uint8'], [97, 98, 99])
HexBytes("0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45")
>>> Web3.soliditySha3(['uint8[]'], [[97, 98, 99]])
HexBytes("0x233002c671295529bcc50b76a2ef2b0de2dac2d93945fca745255de1a9e4017e")
>>> Web3.soliditySha3(['address'], ["0x49EdDD3769c0712032808D86597B84ac5c2F5614"])
HexBytes("0x2ff37b5607484cd4eecf6d13292e22bd6e5401eaffcc07e279583bc742c68882")
>>> Web3.soliditySha3(['address'], ["ethereumfoundation.eth"])
HexBytes("0x913c99ea930c78868f1535d34cd705ab85929b2eaaf70fcd09677ecd6e5d75e9")
检查可编码性
w3.is_encodable(*_type*, *value*)
如果一个值可以被编码为给定的类型,则返回True
。否则返回False
。
```py
from web3.auto.gethdev import w3 w3.is_encodable('bytes2', b'12') True w3.is_encodable('bytes2', b'1') True w3.is_encodable('bytes2', '0x1234') True w3.is_encodable('bytes2', b'123') False ```
T6】
w3.enable_strict_bytes_type_checking()
启用更严格的字节类型检查。更多示例见 启用字节类型的严格检查
```py
from web3.auto.gethdev import w3 w3.enable_strict_bytes_type_checking() w3.is_encodable('bytes2', b'12') True w3.is_encodable('bytes2', b'1') False ```
T6】
RPC API 模块
每个Web3
实例也公开这些命名空间的 API 模块。
Web3.eth
参见 web3.eth API
Web3.miner
参见 矿工 API
Web3.pm
参见 包管理器 API
Web3.geth
参见 Geth API
Web3.parity
参见 奇偶校验 API
这些内部模块继承自web3.module.Module
类,这给了它们一些 web3.py 库内部的配置。
外部模块
外部模块可用于向您的Web3
实例引入定制或第三方 API。外部模块是简单的类,其方法和属性可以在Web3
实例中使用。可选地,外部模块可以通过接受父Web3
实例作为__init__
函数中的第一个参数来利用它:
>>> class ExampleModule:
... def __init__(self, w3):
... self.w3 = w3
...
... def print_balance_of_shaq(self):
... print(self.w3.eth.get_balance('shaq.eth'))
警告
考虑到外部模块的灵活性,请谨慎使用,并且只从可信的第三方和您审查过的开源代码中导入模块!
配置外部模块可以在实例化Web3
实例时进行,也可以通过使用attach_modules()
方法进行。要用外部模块实例化Web3
实例,请使用external_modules
关键字参数:
>>> from web3 import Web3, HTTPProvider
>>> from external_module_library import (
... ModuleClass1,
... ModuleClass2,
... ModuleClass3,
... ModuleClass4,
... ModuleClass5,
... )
>>> w3 = Web3(
... HTTPProvider(provider_uri),
... external_modules={
... 'module1': ModuleClass1,
... 'module2': (ModuleClass2, {
... 'submodule1': ModuleClass3,
... 'submodule2': (ModuleClass4, {
... 'submodule2a': ModuleClass5, # submodule children may be nested further if necessary
... })
... })
... }
... )
# `return_zero`, in this case, is an example attribute of the `ModuleClass1` object
>>> w3.module1.return_zero()
0
>>> w3.module2.submodule1.return_one()
1
>>> w3.module2.submodule2.submodule2a.return_two()
2
w3.attach_modules(*modules*)
在实例化了Web3
之后,可以使用attach_modules()
方法来附加外部模块。
模块通过一个字典连接,模块名作为关键字。如果没有子模块,这些值可以是模块类本身,或者是两项元组,其中模块类作为第 0 个索引,类似构建的字典包含子模块信息作为第 1 个索引。这种模式可以根据需要重复。
>>> from web3 import Web3, HTTPProvider
>>> from external_module_library import (
... ModuleClass1,
... ModuleClass2,
... ModuleClass3,
... ModuleClass4,
... ModuleClass5,
... )
>>> w3 = Web3(HTTPProvider(provider_uri))
>>> w3.attach_modules({
... 'module1': ModuleClass1, # the module class itself may be used for a single module with no submodules
... 'module2': (ModuleClass2, { # a tuple with module class and corresponding submodule dict may be used for modules with submodules
... 'submodule1': ModuleClass3,
... 'submodule2': (ModuleClass4, { # this pattern may be repeated as necessary
... 'submodule2a': ModuleClass5,
... })
... })
... })
>>> w3.module1.return_zero()
0
>>> w3.module2.submodule1.return_one()
1
>>> w3.module2.submodule2.submodule2a.return_two()
2