Solidity
使用 web3.py 與乙太坊智能合約互動時出錯
我正在使用 web3.py 與乙太坊智能合約進行互動,該合約是:
pragma solidity ^0.4.0; contract Coin { address public minter; string public name; mapping (address => uint) public balances; event Sent(address from, address to, uint amount); function Coin() public { minter = msg.sender; name = 'MyCoin'; } // Create new Tokens function mint(address _reciever, uint _amount) public { if (msg.sender != minter) return; balances[_reciever] += _amount; } // Send tokens function send(address _reciever, uint _amount) public { if (balances[msg.sender] < _amount) return; balances[msg.sender] -= _amount; balances[_reciever] += _amount; Sent(msg.sender, _reciever, _amount); } function getBalance(address _user) public view returns (uint){ return balances[_user]; } function balances(address _account) public view returns (uint, string) { return (balances[_account], name); } }
編譯、部署、生成ABI和合約地址均成功。但是,當我嘗試使用 web3.py 訪問已部署的智能合約時,我
balances()
在智能合約中呼叫該函式時遇到了一個奇怪的異常。eth_abi.exceptions.InsufficientDataBytes: Tried to read 32 bytes. Only got 0 bytes
我使用
geth
了自定義創世塊和parity
鏈開發節點,但沒有任何成功。這是我的 Python 程式碼:
import json from web3 import Web3, RPCProvider from web3.contract import ConciseContract import time RPC_IP = '127.0.0.1' RPC_PORT = '8545' # read the contract informations then convert them into a Python dict with open('contract_informations.json', 'r') as f: data = json.loads(f.read()) ABI = data.get('abi') CONTARCT_ADDRESS = data.get('contract_address') w3 = Web3(RPCProvider(RPC_IP, RPC_PORT)) contract_instance = w3.eth.contract(ABI, CONTARCT_ADDRESS, ContractFactoryClass=ConciseContract) contract_instance.mint('0x00a329c0648769A73afAc7F9381E08FB43dBEA72', 1000, transact={'from': w3.eth.accounts[0]}) print(contract_instance.getBalance('0x00a329c0648769A73afAc7F9381E08FB43dBEA72'))
當我執行 Python 程式碼時,有兩個例外:
web3.exceptions.BadFunctionCallOutput: Could not transact with/call contract function, is contract deployed correctly and chain synced?
和
eth_abi.exceptions.InsufficientDataBytes: Tried to read 32 bytes. Only got 0 bytes
但是,當我使用 Web 界面部署契約時
Parity
,一切正常。有,
web3.py
有一些限制還是我錯過了什麼?感謝您的回答。
編譯、部署、生成ABI和合約地址均成功。
你怎麼知道部署成功了?您可以在等待交易完成然後檢索合約地址的位置添加程式碼嗎?
對於它的價值,典型的編譯器會將您的公共映射轉換為 ABI 中的一個函式,該函式與
getBalance
您編寫的完全等效。所以你也可以呼叫contract_instance.balances('0x00a329c0648769A73afAc7F9381E08FB43dBEA72')
.但是,當我使用 Parity Web 界面部署契約時,一切正常。
這強烈表明在您的部署過程中出現了您尚未確定的問題。目前,問題中沒有足夠的資訊來調試部署。