web3py

概述

官方文檔:https://web3py.readthedocs.io/en/stable/overview.html

配置

通過pip安裝完web3后,除了默認(rèn)值之外,你還需要指定provider和一些中間件。

providers

providers是web3連接區(qū)塊鏈的方式。web3庫有以下內(nèi)置幾個(gè)providers:

  • web3.IPCProvider:用于連接基于ipc套接字的 JSON-RPC 服務(wù)器
  • web3.HTTPProvider:用于連接基于http和https的 JSON-RPC 服務(wù)器
  • web3.WebsockerProvider:用于連接基于ws和wss的websocker的 JSON-RPC服務(wù)器
>>> from web3 import Web3

## IPCProvider:
>>> w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))

## HTTPProvider:
>>> w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))

## WebsocketProvider:
>>> w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))

>>> w3.isConnected()
True

更多信息(如連接到遠(yuǎn)程節(jié)點(diǎn);provider自動(dòng)檢測;使用測試provider)參考(https://web3py.readthedocs.io/en/stable/providers.html#providers)

中間件

可以通過中間件配置web3實(shí)例。
就像剝洋蔥一樣,每一層中間件都可能影響入?yún)equest出參。
該文檔包含了一些可視化的東西。

有些中間件是默認(rèn)加載的。
你可以 添加/注入/替換 任何一個(gè)中間件,也可以 禁用/刪除/清除 任何一個(gè)中間件。

你的keys

想要進(jìn)行交易,那么 私鑰 必不可少。你 密鑰的安全方式 將決定你在web3中如何 創(chuàng)建交易發(fā)送交易。

Geth這種的本地節(jié)點(diǎn),會(huì)幫你管理你的密鑰。你可以通過使用 web3.eth.account 來引用你的密鑰。

Infura這樣的托管(遠(yuǎn)程)節(jié)點(diǎn),不知道你的密鑰是多少。這種情況下,你需要使用你本地的私鑰簽署事務(wù)

關(guān)于密鑰之間的區(qū)別,可參考這里

基礎(chǔ)api

Web3類包含很多實(shí)用的函數(shù)。

編碼解碼函數(shù)

  • Web3.is_encodable()
  • Web3.toBytes()
  • Web3.toHex()
  • Web3.toInt()
  • Web3.toJSON()
  • Web3.toText()

地址函數(shù)

  • Web3.isAddress()
  • Web3.isChecksumAddress()
  • Web3.toChecksumAddress()

貨幣換算

  • Web3.fromWei()
  • Web3.toWei()

加密哈希

  • Web3.keccak()
  • Web3.solidityKeccak()

eth的api

與以太坊交互的最常用的api可以在web3.eth命名空間下找到。完整示例參考

獲取數(shù)據(jù)

查看帳戶余額(getBalance)、事務(wù)(getTransaction)和塊數(shù)據(jù)(getBlock)是Web3.py中最常見的起點(diǎn)。

  • web3.eth.getBalance()
  • web3.eth.getBlock()
  • web3.eth.getBlockTransactionCount()
  • web3.eth.getCode()
  • web3.eth.getProof()
  • web3.eth.getStorageAt()
  • web3.eth.getTransaction()
  • web3.eth.getTransactionByBlock()
  • web3.eth.getTransactionCount()
  • web3.eth.getUncleByBlock()
  • web3.eth.getUncleCount()

執(zhí)行交易

最常用的有 sendTransaction 或者 signTransaction 和 sendRawTransaction 的組合。
如果與智能合約進(jìn)行交互,則存在專用的API。參考

  • web3.eth.sendTransaction()
  • web3.eth.signTransaction()
  • web3.eth.sendRawTransaction()
  • web3.eth.replaceTransaction()
  • web3.eth.modifyTransaction()
  • web3.eth.waitForTransactionReceipt()
  • web3.eth.getTransactionReceipt()
  • web3.eth.sign()
  • web3.eth.signTypedData()
  • web3.eth.estimateGas()
  • web3.eth.generateGasPrice()
  • web3.eth.setGasPriceStrategy()

合約

合約最常用是:在已部署的合約上部署執(zhí)行功能。
部署合約需要先編譯,這個(gè)編譯不一定要在本地完成,可以使用:

  • 本地solidity編譯器,如:本地安裝solc編譯器(apt install solc)
  • 在線編輯器Remix
  • 開發(fā)框架,如Brownie

一旦合約對(duì)象被實(shí)例化了,可調(diào)用構(gòu)造函數(shù)contructor的transact方法來發(fā)布一個(gè)合約實(shí)例,如下:

## 聲明合約對(duì)象
ExampleContract = w3.eth.contract(abi=abi, bytecode=bytecode)

## 發(fā)布合約,得到交易hash
tx_hash = ExampleContract.constructor().transact()

## 發(fā)起等待交易,得到等待交易的對(duì)象
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

## 等待交易的地址
tx_receipt.contractAddress

一旦加載到合約對(duì)象中,已發(fā)布的合約對(duì)象的方法在w3.eth命名空間中可用,具體表現(xiàn)如下:

## 根據(jù)待交易的地址和abi獲取合約對(duì)象
deployed_contract = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)

deployed_contract.functions.myFunction(42).transact()

如果你想從合約中獲取數(shù)據(jù)(或者在本地查看事務(wù)結(jié)果,而不是在網(wǎng)絡(luò)上執(zhí)行),你可以使用:
ContractFunction.call方法
或者
ContractCaller方法

deployed_contract.functions.getMyValue().call()
## 或者
deployed_contract.caller().getMyValue()

想要了解更多,參考 https://web3py.readthedocs.io/en/stable/contracts.html#contracts

  • web3.eth.contract()
  • Contract.address
  • Contract.abi
  • Contract.bytecode
  • Contract.bytecode_runtime
  • Contract.functions
  • Contract.events
  • Contract.fallback
  • Contract.constructor()
  • Contract.encodeABI()
  • web3.contract.ContractFunction
  • web3.contract.ContractEvents

日志和過濾器

當(dāng) 新塊被挖出 或者 合約發(fā)出特定的事件 時(shí),你想做出一些反應(yīng),可以用web3過濾器。

## 刷選新塊
new_filter = web3.eth.filter('latest')

## 合同事件(名為“MyEvent”)過濾器
new_filter = deployed_contract.events.MyEvent.createFilter(fromBlock='latest')

## 檢索結(jié)果過濾
new_filter.get_all_entries()
new_filter.get_new_entries()

想要了解更多,參考 https://web3py.readthedocs.io/en/stable/filters.html#filtering

  • web3.eth.filter()
  • web3.eth.getFilterChanges()
  • web3.eth.getFilterLogs()
  • web3.eth.uninstallFilter()
  • web3.eth.getLogs()
  • Contract.events.your_event_name.createFilter()
  • Contract.events.your_event_name.build_filter()
  • Filter.get_new_entries()
  • Filter.get_all_entries()
  • Filter.format_entry()
  • Filter.is_valid_entry()

Net API

一些基本的網(wǎng)絡(luò)屬性,可用web3.net查看

  • web3.net.listening
  • web3.net.peer_count
  • web3.net.version

ethPM

ENS

Ethereum Name Service (ENS) 提供了人類可讀地址的結(jié)構(gòu)。如:你可以把資金發(fā)送到ethereumfoundation.eth。web3支持ens,詳細(xì)參考:https://web3py.readthedocs.io/en/stable/ens_overview.html#ens-overview

快速開始

官方網(wǎng)站:https://web3py.readthedocs.io/en/stable/quickstart.html

安裝

使用pip命令安裝:

$ pip install web3

使用

該庫依賴于以太坊節(jié)點(diǎn)的連接,如:本地開發(fā)的時(shí)候,啟動(dòng)的一個(gè)ganache-cli。
我們稱這些連接providers,并且有很多方式可以去配置他們。具體參考(https://web3py.readthedocs.io/en/stable/providers.html#providers)

provider: 本地Geth節(jié)點(diǎn)

顯示指定連接方式

顯示的連接本地Geth節(jié)點(diǎn)有三種方式,分別如下

IPC連接

最安全的

from web3 import Web3
w3 = Web3(Web3.IPCProvider('./path/to/geth.ipc'))
HTTP連接

端口8545

from web3 import Web3
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
websocket連接

端口8546

from web3 import Web3
w3 = Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))

隱式自動(dòng)連接

如果你堅(jiān)持使用 默認(rèn)端口 或者 本地IPC文件,可以自動(dòng)檢測provider。參考:(https://web3py.readthedocs.io/en/stable/providers.html#automatic-provider)

from web3.auto import w3

查看連接狀態(tài)

w3.isConnected()

provider: Infura

在實(shí)際生產(chǎn)環(huán)境中,要與 以太坊區(qū)塊鏈 交互的最快的方式,是使用 遠(yuǎn)程節(jié)點(diǎn),如:Infura。你可以通過指定節(jié)點(diǎn)(當(dāng)你創(chuàng)建了一個(gè)賬戶后,有Infura提供)與遠(yuǎn)程節(jié)點(diǎn)連接,如:

顯示連接

from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/<infura-project-id>'))

隱式連接

先將你的Infura項(xiàng)目id設(shè)置為環(huán)境變量

$ export WEB3_INFURA_PROJECT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

from web3.auto.infura import w3
w3.eth.blockNumber

獲取區(qū)塊鏈信息

可以使用w3與以太坊區(qū)塊鏈進(jìn)行交互。
web3可以幫助你:

  • 讀取塊數(shù)據(jù)
  • 簽署
  • 發(fā)送事務(wù)
  • 合約部署
  • 合約交互
  • 等等...

使用w3.eth做很多事情

如果你想 進(jìn)入合約/部署合約,請(qǐng)查看(https://web3py.readthedocs.io/en/stable/contracts.html#contracts)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容