跳转至

Web3 API

原文:https://web3py.readthedocs.io/en/stable/web3.main.html

```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函数在提供的valueabi_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 


回到顶部