Geth+Web3.py 搭建ETH私鏈併發起交易

寫在前面

  • 最近打了場Hackthon區塊鏈主題,成功進擊幣圈,結果還行拿了第一,如今來總結一下,省得之後忘了;
  • 整體本文將介紹Web3.py+geth如何實現;
  • 1.搭建ETH私鏈測試環境 2.Python代碼與ETH互通即發起交易獲取交易信息;

GETH

Geth 又名Go Ethereum.
是以太坊協議的三種實現之一,由Go語言開發,徹底開源的項目。
Geth 能夠被安裝在不少操做系統上,包括Windows、Linux、Mac的OSX、Android或者IOS系統python

Geth官網:點擊我
Geth的Github地址:點擊我
git

官網中有下載安裝的相關教程。
github

測試私鏈搭建

  1. 在目錄下新建genesis.json
{
	"config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
	 "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x020000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "alloc"      : {}
  }
複製代碼

參數的簡單介紹
config.chainId // 以太鏈的ID,用來惟一標記一條以太鏈 不用管
coinbase // 礦工帳號,第一個區塊挖出後將給這個礦工帳號發送獎勵 不用管
difficulty // 難度值,越大越難 當前值爲最輕鬆的狀況
extraData // 附加信息隨便填 不用管
gasLimit // gas 的消耗總量限制,用來限制區塊能包含的交易信息總和,由於咱們是私有鏈,因此填最大 gas和寫入數據成正比寫入越多gas越貴
nonce // 一個 64 位隨機數
mixhash // 與 nonce 配合用於挖礦,由上一個區塊的一部分生成的 hash
parentHash // 上一個區塊的 hash 值
alloc // 預設帳號以及帳號的以太幣數量,這裏不作配置
2. 執行 geth --datadir "./" init genesis.json
開始在當前目錄生成ETH私鏈
關於運行後面再說,先說Web3.py
web

Web3.py

Web3是一個經過RPC連接來間接經過geth發起交易獲取區塊鏈信息的python庫
須要python 3.5+ 的環境支持 pip install web3
web3文檔shell

Web+Geth

帶參數啓動geth

./geth --identity "HDetherum" --rpc --rpccorsdomain "*" --datadir "./" --port "30303" --rpcapi "db,personal,eth,net,web3" --networkid 95520 -nodiscover --verbosity=5 console 2>>geth.logjson

--identity 表示ETH標識ID
--rpccorsdomain 容許哪些URL接入當前區塊
--datadir 區塊鏈數據存放的地址
--rpcapi 全部可能被用到的RPC API都須要進行聲明
--networkid 網絡標識符(整型, 1=Frontier, 2=Morden (棄用), 3=Ropsten, 4=Rinkeby) 測試網絡只要不和前幾個重複就行了
api

這句命令主要是用來啓動geth 並暴露出接口給Web3進行連接調用
執行完成後會出現geth.log在當前目錄下。
下面給幾個geth上經常使用的基本方法
網絡

eth.accounts //獲取當前鏈上全部帳戶
personal.newAccount("123456") //建立一個密碼爲123456的錢包帳戶
miner.satrt() //開始挖礦
miner.stop() //結束挖礦
複製代碼

關於web3

發起交易和獲取交易信息各一個例子cors

發起交易dom

form web3.auto import w3

# 返回值爲區塊hash地址
# 0x6d2629b8693d35ffd735d67d0e823108f1fc168b4162950900e22214732e386c
def set_trans(data=None):
    accounts = w3.eth.accounts
    w3.personal.unlockAccount(w3.eth.accounts[0], '7723')
    trans_id = w3.eth.sendTransaction({'to': w3.toChecksumAddress(accounts[1]), 'from': w3.eth.coinbase, 'value': 12345})
    print(trans_id)
    return trans_id
複製代碼

得到交易信息

# 若是爲None則礦工還沒挖到該交易
# AttributeDict({
# 'blockHash': HexBytes('0x0000000000000000000000000000000000000000000000000000000000000000'),
# 'blockNumber': None,
# 'from': '0xE6829A20492D11A5C84b7B0F3240A99971d1FbFF',
# 'gas': 121680, 'gasPrice': 18000000000,
# 'hash': HexBytes('0x6d2629b8693d35ffd735d67d0e823108f1fc168b4162950900e22214732e386c'),
# 'input': '0x48656c6c6f576f726c64',
# 'nonce': 0, 'to': '0x2e8AAf37736C4CeAc8d0366Ffa97aA7B62957b72', 'transactionIndex': 0,
# 'value': 12345, 'v': 56, 'r': HexBytes('0x750bc8a9ef4f20e129c2a71a0c9d496aaacafd49f1d514c0c4d380887590fefc'),
# 's': HexBytes('0x37bbe55ef6363ee98d66e131fc862d9e8451353c8b1e2a5c8f3533304db72b42')})
def get_trans_detail(trans_id=None):
    information = w3.eth.getTransaction(trans_id)
    return information
複製代碼

具體Web3的調用 查看文檔 寫的很詳細 (又成功水了一篇 yes√)

相關文章
相關標籤/搜索