2017-05-30 1 views
1

Le code du contrat:Pourquoi la valeur d'un mappage (bytes32 => uint8) semble-t-elle changer entre les appels de transaction?

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]; 
    } 

} 

et je lance sur 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") 

bizarrement, c'est la sortie que je reçois dans le terminal de noeud:

> 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 ] } 

Ce résultat est le résultat d'une longue séance de débogage ... que se passe-t-il? Il semble distinctement quelque chose est cassé, mais je l'ai suivi a tutorial qui a fait quelque chose de très similaire qui semble fonctionner ...

aussi:

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

Répondre

2

Essayez cette deployed_contract.Set("akey", 5) sans .call

Parce que. faire appel à votre méthode setter

exécute une transaction d'appel de message, qui est directement exécuté dans la machine virtuelle du noeud, mais jamais miné dans la blockchain.

doc

La valeur de la carte ne change pas. Je parie 0 est la valeur par défaut quand rien n'est

Par ailleurs, essayez d'utiliser le online compiler, vous verrez rapidement si le problème est sur le contrat ou la façon dont vous interagissez avec web3.