愛鏈筆記-以太坊連接
為了達到寫的話語可以在互聯網上源遠流長,我選擇把它寫到區塊鏈上。Eth又是其中的佼佼者,而且它發布於2014年,到今天已經有很多工具了。
開始我以為全節點才可以記賬,不過那個賬本文件太大了,不合適,後來我想到我自己使用的metamask錢包,小小一個插件就把錢包的功能實現了,這給我了希望。於是我就又搜索了一下,發現了可以使用web3連接遠程節點實現。
首先,申請遠程節點。在https://infura.io/上註冊,然後就可以申請遠程節點了。搞定了你就有和以太坊交互的接口了。
接下來是使用web3來和它交互,但是網上一般是web3.js的教程,而我們使用的是web3.py,所以在這裏還是說一說。
首先用pip安裝web3,結果報錯了,說什麽Importing web3 python module results in assert keccak(‘‘) in eth_utils/crypto.py,我看著很懵,上網看還真有和我一樣的,解決方法是:
pip uninstall sha3 or pip uninstall pysha3 or sudo ... //卸載sha3或pysha3,然後重新安裝web3
pip install web3
就這樣順利的安裝上了web3.py。
然後就是使用web3來和以太坊交互啦,因為網上都是web3.js的,所以這裏我就簡單的說一下我用到的方法。
Web3.py連接以太坊使用語句:w3 = Web3(Web3.HTTPProvider(‘https://mainnet.infura.io/xxxxxxx‘))(http連接infura遠程節點)
接下來就是自己賬戶的地址了,這裏我使用私鑰來得到賬戶地址,使用的方法為Account.privateKeyToAccount,在使用前不要忘記from eth_account import Account
這裏我要提一點,就是私鑰的存儲。開始的時候我不知道會把代碼放到github的公有倉庫,所以在代碼裏明晃晃的把私鑰放裏面,不出一天賬戶就被盜了,還好沒多少,損失了幾百。開始以為是黑客工攻擊使用重裝了後臺,還好我說再看看代碼,才發現居然放github裏面了,我覺得是有人在用程序掃描github看看有沒有人把私鑰放上面,不然也不會這麽快就發現,我覺得大概五分鐘吧,真是吃一塹啊。不過私鑰是一定要有的,為了這個目的,我們想了想,把私鑰放在後臺的環境變量裏面了,代碼如下:
priv_key = env_dist[‘BLOCK_KEY‘] #愛鏈的eth賬戶的私鑰
account = Account.privateKeyToAccount(priv_key) #通過私鑰得到公鑰也就是賬戶地址
接下來就是得到防止重放攻擊的數字,使用 nonce = w3.eth.getTransactionCount(account.address) #通過返回指定地址發起的交易數,得到防止重放攻擊的數字 得到。
然後就到了重中之重了,把文字信息附到交易裏面,首先要把文字信息轉換為16進制編碼,使用方法:data=Web3.toHex(str.encode(text+‘——‘+name))#交易附加的信息,需要將字符串轉換為16進制編碼,需要前端傳遞來需要保存的數據。
一切都搞定啦就可以把他們打包了,得到:
payload = { | |
‘to‘: ‘0x8Fe2Af03Ed1d362371261AB33C400F24fBB82D8f‘, | |
‘value‘: 0, | |
‘gas‘: 200000, #運算步數的上限 | |
‘gasPrice‘: Web3.toWei(3,‘gwei‘),#每一步運算耗費的Eth | |
‘nonce‘: nonce, | |
‘data‘:data | |
} |
然後就可以生成裸交易,將信息上鏈啦。具體步驟如下:
signed = account.signTransaction(payload) #簽名
之後tx_hash = w3.eth.sendRawTransaction(signed.rawTransaction)#生成裸交易,得到交易號
不過得到的交易號還需要16進制轉義,具體方法:tx_hash=‘‘.join([‘%02x‘% b for b in tx_hash])
這樣整個交易就完成啦。
上鏈之後還可以查詢它的狀態,使用receipt = w3.eth.getTransactionReceipt(tx_hash)獲得交易收據,
交易收據是一個AttributeDict對象,因此你可以直接使用.來訪問以下屬性:
- transactionHash: 交易哈希
- transactionIndex: 交易在塊內的索引序號
- blockHash: 交易所在塊的哈希
- blockNumber: 交易所在塊的編號
- cumulativeGasUsed: 交易所在塊消耗的gas總量
- gasUsed: 本次交易消耗的gas用量
- contractAddress: 對於合約創建交易,該值為新創建的合約地址,否則為null
- logs: 本次交易生成的日誌對象數組
按照以太坊的出塊速度,大約最快需要15秒交易才可能得到確認,因此我們需要 周期性地檢查交易收據。
web3.py的Eth類也提供了waitForTransactionReceipt()方法來等待 交易收據,它在一個單獨的 線程裏等待收據。例如,下面的代碼設置超時時長為60s:
receipt = w3.eth.waitForTransactionReceipt(tx_hash,60)
最後,在說說如何確定gasPrice,可以通過https://ethgasstation.info/查詢獲得,這樣以太坊交互最簡單的應用就完成啦。
愛鏈筆記-以太坊連接