1. 程式人生 > >愛鏈筆記-以太坊連接

愛鏈筆記-以太坊連接

Vegas 但是 price 字符 合約 python 2014年 sse 數組

為了達到寫的話語可以在互聯網上源遠流長,我選擇把它寫到區塊鏈上。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/查詢獲得,這樣以太坊交互最簡單的應用就完成啦。

愛鏈筆記-以太坊連接