值HexBytes(*十六进制字符串*)是97个字节,但在使用Contract.transact()时应为32个字节

时间:2017-11-06 04:39:19

标签: python solidity web3

我做了一个简单的智能合约,在

之下
pragma solidity ^0.4.15;

contract ECDS {

Computer[] public computer;

event gotComputers(string _msg);
event addedComputer(string _msg, uint _cores, uint _cache, uint _coresVM, bool _mining);

struct Computer {
    uint cores;
    uint cache;
    uint coresVM;
    bool mining;
}

function addComputer(uint _cores, uint _cache, uint _coresVM, bool _mining) returns (bool success){
    Computer memory newComputer;

    newComputer.cores = _cores;
    newComputer.cache = _cache;
    newComputer.coresVM = _coresVM;
    newComputer.mining = _mining;

    computer.push(newComputer);
    addedComputer("A computer was added", _cores, _cache, _coresVM, _mining);
    return true;   
}

function getComputer() constant returns (uint[],uint[],uint[],bool[]){
    uint length = computer.length;

    uint[] memory coresList = new uint[](length);
    uint[] memory cacheList = new uint[](length);
    uint[] memory coresVMList = new uint[](length);
    bool[] memory miningList = new bool[](length);

    for(uint i = 0; i < length; i++){
        Computer memory currentComputer;
        currentComputer = computer[i];

        coresList[i] = currentComputer.cores;
        cacheList[i] = currentComputer.cache;
        coresVMList[i] = currentComputer.coresVM;
        miningList[i] = currentComputer.mining;
    }

    gotComputers("Got the list of computers");
    return (coresList, cacheList, coresVMList, miningList);
}

function availableFreeCores() constant returns (uint[]){
    uint length = computer.length;

    uint[] memory freeCoresList = new uint[](length);
    for(uint i = 0; i < length; i++){
        Computer memory currentComputer;
        currentComputer = computer[i];

        uint freeCores = currentComputer.cores - (currentComputer.cache / 2);

        freeCoresList[i] = freeCores;
    }
    return freeCoresList;
}
}

然后我在python程序中成功使用了call()。getComputer(),但是在使用transact()。addComputer(cores,cache,coresVM,True)时出现错误。 Python如下所示。

from web3 import Web3, HTTPProvider, IPCProvider
import json

contractAdress = '0x2343A6d7c85Ab43f94E50C128A7d3109A3647a1D'
web3 = Web3(HTTPProvider('52.169.42.101:30303'))
with open('factory.json', 'r') as abi_definition:
    abi = json.load(abi_definition)
web3 = Web3(IPCProvider())

fContract = web3.eth.contract(contractAdress, abi=abi)
cores = 12
cache = 15
coresVM = 0
mining = True
fContract.transact().addComputer(cores, cache, coresVM, True)
print('Computers',fContract.call().getComputer())

如果我注释掉transact()。addComputer它会成功运行并返回正确的值。但是它包含在程序中,我得到的完整错误是:

 Traceback (most recent call last):
 File "ECDS.py", line 15, in <module>
fContract.transact().addComputer(cores, cache, coresVM, True)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/contract.py", line 821, in transact_with_contract_function
txn_hash = contract.web3.eth.sendTransaction(transact_transaction)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/eth.py", line 211, in sendTransaction
get_buffered_gas_estimate(self.web3, transaction),
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/utils/transactions.py", line 160, in get_buffered_gas_estimate
gas_limit = get_block_gas_limit(web3)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/utils/transactions.py", line 151, in get_block_gas_limit
block = web3.eth.getBlock(block_identifier)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/eth.py", line 127, in getBlock
[block_identifier, full_transactions],
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/manager.py", line 74, in request_blocking
response = self._make_request(method, params)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/manager.py", line 57, in _make_request
return request_func(method, params)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/middleware/attrdict.py", line 20, in middleware
response = make_request(method, params)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/middleware/formatting.py", line 32, in middleware
formatter(response['result']),
 File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__ (cytoolz/functoolz.c:3996)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/utils/formatters.py", line 62, in apply_formatter_if
return formatter(value)
 File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__ (cytoolz/functoolz.c:3996)
 File "/usr/local/lib/python3.5/dist-packages/ethereum_utils-0.5.1-py3.5.egg/eth_utils/functional.py", line 33, in inner
return callback(fn(*args, **kwargs))
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/utils/formatters.py", line 72, in apply_formatters_to_dict
yield key, formatters[key](item)
 File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__ (cytoolz/functoolz.c:3996)
 File "/usr/local/lib/python3.5/dist-packages/web3-3.16.1-py3.5.egg/web3/middleware/pythonic.py", line 111, in to_hexbytes
result, len(result), num_bytes
ValueError: The value HexBytes('0xd783010703846765746887676f312e392e31856c696e7578000000000000000019905343b07339c85f1797c521d65dc9238743fdc52261c5ee4a4bd39004426e4b06c492df58bfbb037151d294187535732d23b5c768a83f452ceda2d5b6128400') is 97 bytes, but should be 32

我尝试将Hex解码为ascii,我得知它与geth go客户端有关,但我还没有发现修复错误。任何帮助或建议尝试将不胜感激!

1 个答案:

答案 0 :(得分:1)

在节点安装或启动时似乎是一个错误,其中某些东西没有正确运行。我最终重新安装了所有相关组件,现在它似乎正在运行!