Solidity

使用 web3.py 與乙太坊智能合約互動時出錯

  • January 22, 2018

我正在使用 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 界面部署契約時,一切正常。

這強烈表明在您的部署過程中出現了您尚未確定的問題。目前,問題中沒有足夠的資訊來調試部署。

引用自:https://ethereum.stackexchange.com/questions/37012