使用Web3.py連接Ethereum

畢業設計做了相關區塊鏈的項目,在考慮了Hyperledger和Ethereum之後選擇使用了Ethereum,因爲在Ethereum上用智能合約,代幣等更方便。然而對於Ethereum,國內對於Python來開發的教程還不夠多,我就想把畢設中踩得坑記錄下來。 本文提供的代碼上傳至https://github.com/crazylnx/bupt-homework/tree/master/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E4%BB%A3%E7%A0%81

環境選擇

我現在只是將Python與Ethereum的模擬軟件Ganache相連。

  • 系統:Windows 10
  • Python version 3.7.3
  • Solidity version 0.5.0
  • Ganache version 2.0.1
  • Pycharm version 2019.1.1

Python庫選擇

  • Web3.py version 4.9.1
  • Easysolc version 0.1.4

步驟

上述軟件的安裝,自行百度。

庫安裝,需要注意Easysolc庫需要安裝solc這個solidity編譯工具,具體步驟爲,去https://github.com/ethereum/solidity/releases 尋找solidity-windows.zip,並將其解壓,獲得solc.exe,將solc.exe保存到Pycharm你的項目的根目錄。

  1. Python利用Web3.py連接Ganache軟件。
    from web3 import Web3, HTTPProvider
    w3 = Web3(HTTPProvider("http://localhost:8545")) #有疑問請看web3.py官網
    
  1. Python利用easysolc編譯並部署solidity文件
    from easysolc import Solc #放在文件最上面

    w3.eth.defaultAccount = w3.eth.accounts[0]//使用賬戶0來部署。
    solc = Solc()
    # 編譯智能合約並放在當前目錄
    solc.compile('..\\你的合約文件.sol', output_dir='.')
    # 獲取智能合約實例 其中abi和bin文件爲編譯後生成的文件,可以去你的項目目錄下找。
    contract = solc.get_contract_instance(w3=w3, abi_file='.\\你的合約.abi', bytecode_file='.\\你的合約.bin') 
    # 部署智能合約
    tx_hash = contract.constructor().transact()
    tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)#等待挖礦過程
    # 獲得智能合約部署在鏈上的地址
    contractAddr = tx_receipt.contractAddress
  1. Python利用合約地址獲取合約實例。(有時候知道合約的地址,想用合約中的函數。)
    from easysolc import Solc #放在文件最上面
    from web3 import Web3, HTTPProvider
    w3 = Web3(HTTPProvider("http://localhost:8545")) #有疑問請看web3.py官網
    solc = Solc()
    contract = solc.get_contract_instance(w3=w3, abi_file='.\\你的合約.abi', bytecode_file='.\\你的合約.bin',address=contractAddr)
  1. Python使用智能合約函數
    - 調用函數
    tx_hash = contract.functions.addNewCar(_no,w3.eth.accounts[_no]).transact() #tx_hash爲transaction的hash值。
    w3.eth.waitForTransactionReceipt(tx_hash) #等待hash值爲tx_hash的transaction寫入塊(挖礦成功)。

    - 調用public的變量
    tx_hash=contract.call().函數名(參數)#查看變量不會產生gas消耗。
  1. Web3.py給合約打錢
    非常重要
    對於智能合約內部的轉賬操作,需要合約能夠具備一定的ether,所以就需要先給合約充值,一般爲智能合約擁有者給合約充值。
w3.eth.sendTransaction({"from": w3.eth.accounts[0], "to": contractAddr, "value": 50342342300000000000});#from:充值的賬戶,to:充值到的地方,value:單位爲wei。(1ether=1000000000000000000 Wei)

充值需要智能合約中有 fallback()函數,自行百度,很簡單。
  1. Web3.py切換賬戶
    w3.eth.defaultAccount = w3.eth.accounts[0]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章