web3py

概述

官方文檔: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í)行)顽素,你可以使用:

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

日志和過濾器

新塊被挖出或者合約發(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

來源:簡書

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啤握,一起剝皮案震驚了整個濱河市鸟缕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌排抬,老刑警劉巖懂从,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹲蒲,居然都是意外死亡番甩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門悠鞍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來对室,“玉大人模燥,你說我怎么就攤上這事⊙谝耍” “怎么了蔫骂?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牺汤。 經(jīng)常有香客問我辽旋,道長,這世上最難降的妖魔是什么檐迟? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任补胚,我火速辦了婚禮,結(jié)果婚禮上追迟,老公的妹妹穿的比我還像新娘溶其。我一直安慰自己,他們只是感情好敦间,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布瓶逃。 她就那樣靜靜地躺著,像睡著了一般廓块。 火紅的嫁衣襯著肌膚如雪厢绝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天带猴,我揣著相機與錄音昔汉,去河邊找鬼。 笑死拴清,一個胖子當著我的面吹牛靶病,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贷掖,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嫡秕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苹威?” 一聲冷哼從身側(cè)響起昆咽,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牙甫,沒想到半個月后掷酗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡窟哺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年泻轰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片且轨。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡浮声,死狀恐怖虚婿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泳挥,我是刑警寧澤然痊,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站屉符,受9級特大地震影響剧浸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矗钟,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一唆香、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨艇,春花似錦躬它、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碑宴。三九已至软啼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間延柠,已是汗流浹背祸挪。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贞间,地道東北人贿条。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像增热,于是被迫代替她去往敵國和親整以。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容