为什么 mapping(bytes32 => uint8) 的值似乎在事务调用之间发生变化?
Why does the value of a mapping(bytes32 => uint8) seem to change between transaction calls?
合约代码:
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'
不使用 .call
试试这个 deployed_contract.Set("akey", 5)
因为 .call 在你的 setter 方法上
executes a message call transaction, which is directly executed in the
VM of the node, but never mined into the blockchain.
地图的价值不变。我打赌 0 是没有设置时的默认值
顺便尝试使用 online compiler 你会很快看到问题是出在合同上还是你与它与 web3 交互的方式上。
合约代码:
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'
不使用 .call
试试这个deployed_contract.Set("akey", 5)
因为 .call 在你的 setter 方法上
executes a message call transaction, which is directly executed in the VM of the node, but never mined into the blockchain.
地图的价值不变。我打赌 0 是没有设置时的默认值
顺便尝试使用 online compiler 你会很快看到问题是出在合同上还是你与它与 web3 交互的方式上。