为什么映射的值(bytes32 => uint8)似乎在事务调用之间发生变化?

时间:2017-05-30 20:24:07

标签: ethereum solidity

合同代码:

pragma solidity ^0.4.10;

contract Test {
    mapping (bytes32 => uint8) private dict;

    function Test() {}

    function Set(bytes32 key, uint8 val) returns (uint8) {
        dict[key] = val;
        return dict[key];
    }

    function Get(bytes32 key) returns (uint8) {
        return dict[key];
    }

}

我在testrpc上运行:

contract_file = 'test/test.sol'
contract_name = ':Test'

Solc = require('solc')
Web3 = require('web3')

web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
source_code = fs.readFileSync(contract_file).toString()

compiledContract = Solc.compile(source_code)
abi = compiledContract.contracts[contract_name].interface
bytecode = compiledContract.contracts[contract_name].bytecode;
ContractClass =  web3.eth.contract(JSON.parse(abi))

contract_init_data = {
    data: bytecode,
    from: web3.eth.accounts[0],
    gas: 1000000,
}

deployed_contract = ContractClass.new(contract_init_data)

deployed_contract.Set.call("akey", 5)
deployed_contract.Get.call("akey")

奇怪的是,这是我在节点终端中得到的输出:

> deployed_contract.Set.call("akey", 5)
{ [String: '5'] s: 1, e: 0, c: [ 5 ] }
> deployed_contract.Get.call("akey")
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }

这个结果是长时间调试会议的结果......发生了什么?看起来很明显就像在这里打破了一些东西,但是我跟着a tutorial做了一些看起来很有效的东西......

也:

> Solc.version()
'0.4.11+commit.68ef5810.Emscripten.clang'

1 个答案:

答案 0 :(得分:2)

在没有.call

的情况下试试这个deployed_contract.Set("akey", 5)

因为.call在你的setter方法上

  

执行一个消息调用事务,它直接在   节点的VM,但从未开采过区块链。

doc

地图的价值不会改变。我敢打赌0是没有设置的默认值

顺便说一下,尝试使用online compiler,您将很快看到问题是在合同上,还是与web3进行交互的方式。