概述
官方文檔:https://web3py.readthedocs.io/en/stable/overview.html
配置
通過pip安裝完web3后,除了默認值之外婶希,你還需要指定provider和一些中間件榕暇。
providers
providers是web3連接區(qū)塊鏈的方式。web3庫有以下內(nèi)置幾個providers:
web3.IPCProvider:用于連接基于ipc套接字的 JSON-RPC 服務器
web3.HTTPProvider:用于連接基于http和https的 JSON-RPC 服務器
web3.WebsockerProvider:用于連接基于ws和wss的websocker的 JSON-RPC服務器
>>>from web3 importWeb3## 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
更多信息(如連接到遠程節(jié)點;provider自動檢測彤枢;使用測試provider)參考(https://web3py.readthedocs.io/en/stable/providers.html#providers)
中間件
可以通過中間件配置web3實例狰晚。
就像剝洋蔥一樣,每一層中間件都可能影響入?yún)equest和出參缴啡。
該文檔包含了一些可視化的東西壁晒。
有些中間件是默認加載的。
你可以添加/注入/替換任何一個中間件业栅,也可以禁用/刪除/清除任何一個中間件秒咐。
你的keys
想要進行交易,那么私鑰必不可少碘裕。你密鑰的安全方式將決定你在web3中如何創(chuàng)建交易和發(fā)送交易携取。
像Geth這種的本地節(jié)點,會幫你管理你的密鑰帮孔。你可以通過使用web3.eth.account來引用你的密鑰雷滋。
像Infura這樣的托管(遠程)節(jié)點,不知道你的密鑰是多少文兢。這種情況下晤斩,你需要使用你本地的私鑰來簽署事務。
關于密鑰之間的區(qū)別禽作,可參考這里
基礎api
Web3類包含很多實用的函數(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)旷偿、事務(getTransaction)和塊數(shù)據(jù)(getBlock)是Web3.py中最常見的起點烹俗。
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 的組合。
如果與智能合約進行交互萍程,則存在專用的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í)行功能。
部署合約需要先編譯茫负,這個編譯不一定要在本地完成蕉鸳,可以使用:
本地solidity編譯器,如:本地安裝solc編譯器(apt install solc)
在線編輯器Remix
開發(fā)框架忍法,如Brownie
一旦合約對象被實例化了潮尝,可調(diào)用構(gòu)造函數(shù)contructor的transact方法來發(fā)布一個合約實例,如下:
## 聲明合約對象ExampleContract = w3.eth.contract(abi=abi, bytecode=bytecode)## 發(fā)布合約饿序,得到交易hashtx_hash = ExampleContract.constructor().transact()## 發(fā)起等待交易勉失,得到等待交易的對象tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)## 等待交易的地址tx_receipt.contractAddress
一旦加載到合約對象中,已發(fā)布的合約對象的方法在w3.eth命名空間中可用原探,具體表現(xiàn)如下:
## 根據(jù)待交易的地址和abi獲取合約對象deployed_contract = w3.eth.contract(address=tx_receipt.contractAddress, abi=abi)deployed_contract.functions.myFunction(42).transact()
如果你想從合約中獲取數(shù)據(jù)(或者在本地查看事務結(jié)果乱凿,而不是在網(wǎng)絡上執(zhí)行)顽素,你可以使用:
或者
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
日志和過濾器
當新塊被挖出或者合約發(fā)出特定的事件時徒蟆,你想做出一些反應胁出,可以用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)絡屬性全蝶,可用web3.net查看
web3.net.listening
web3.net.peer_count
web3.net.version
ethPM
打包合同,以重復使用
使用另一個受信任的注冊表中的合同
想要了解更多戚哎,參考:https://web3py.readthedocs.io/en/stable/ethpm.html#ethpm
ENS
Ethereum Name Service (ENS)提供了人類可讀地址的結(jié)構(gòu)裸诽。如:你可以把資金發(fā)送到ethereumfoundation.eth嫂用。web3支持ens型凳,詳細參考: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é)點的連接,如:本地開發(fā)的時候嘱函,啟動的一個ganache-cli甘畅。
我們稱這些連接為providers,并且有很多方式可以去配置他們往弓。具體參考(https://web3py.readthedocs.io/en/stable/providers.html#providers)
provider: 本地Geth節(jié)點
顯示指定連接方式
顯示的連接本地Geth節(jié)點有三種方式疏唾,分別如下
IPC連接
最安全的
fromweb3importWeb3w3=Web3(Web3.IPCProvider('./path/to/geth.ipc'))
HTTP連接
端口8545
fromweb3importWeb3w3=Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
websocket連接
端口8546
fromweb3importWeb3w3=Web3(Web3.WebsocketProvider('ws://127.0.0.1:8546'))
隱式自動連接
如果你堅持使用默認端口或者本地IPC文件,可以自動檢測provider函似。參考:(https://web3py.readthedocs.io/en/stable/providers.html#automatic-provider)
from web3.autoimport w3
查看連接狀態(tài)
w3.isConnected()
provider: Infura
在實際生產(chǎn)環(huán)境中槐脏,要與 以太坊區(qū)塊鏈 交互的最快的方式,是使用遠程節(jié)點撇寞,如:Infura顿天。你可以通過指定節(jié)點(當你創(chuàng)建了一個賬戶后,有Infura提供)與遠程節(jié)點連接蔑担,如:
顯示連接
fromweb3importWeb3w3=Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/<infura-project-id>'))
隱式連接
先將你的Infura項目id設置為環(huán)境變量
$ export WEB3_INFURA_PROJECT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
from web3.auto.infura import w3w3.eth.blockNumber
獲取區(qū)塊鏈信息
可以使用w3與以太坊區(qū)塊鏈進行交互牌废。
web3可以幫助你:
讀取塊數(shù)據(jù)
簽署
發(fā)送事務
合約部署
合約交互
等等...
使用w3.eth做很多事情
如果你想 進入合約/部署合約,請查看(https://web3py.readthedocs.io/en/stable/contracts.html#contracts)
作者:hflsp
鏈接:http://www.reibang.com/p/d7e599a7845f
來源:簡書