El almacenamiento del contrato no cambia en la función de llamada

contract SimpleStorage {
    mapping(bytes32 => string) storedData;

    function set(bytes32 key, string value) {
        storedData[key] = value;
    }

    function get(bytes32 key) constant returns (string retVal) {
        return storedData[key];
    } 
}

En la consola geth:

  1. mySource = 'contract SimpleStorage { mapping(bytes32 => string) storedData; function set(bytes32 key, string value) { storedData[key] = value;} function get(bytes32 key) constant returns (string retVal) { return storedData[key];}}'

  2. myCompiled = web3.eth.compile.solidity(mySource)

  3. myContract = web3.eth.contract(myCompiled.SimpleStorage.info.abiDefinition);

  4. SimpleStorage = myContract.new({from:web3.eth.accounts[0], data: myCompiled.SimpleStorage.code, gas: 10000000})

  5. miner.start()

  6. SimpleStorage.address (I get "0x03b6676ec81168749af1a92783e67bf3b065add3")

  7. SimpleStorage.set.sendTransaction("hash", "value", {from: eth.accounts[0]})

  8. miner.start()

  9. miner.stop()

  10. eth.getStorageAt("0x03b6676ec81168749af1a92783e67bf3b065add3")

Yo obtengo:

0x00000000000000000000000000000000000000000000000000000000000000000

¿Por qué no ha cambiado el contrato de almacenamiento?

¿Por qué no simplemente llamas a getla función?

Respuestas (1)

El contrato de almacenamiento cambió, solo debe probar el siguiente comando:eth.getStorageAt("0x03b6676ec81168749af1a92783e67bf3b065add3",web3.sha3(0x68617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,{"encoding":"hex"}))

El primer argumento es la dirección de su contrato, mientras que el segundo es la posición de almacenamiento donde se almacena su valor. En este caso, el valor se calcula como sha3(key+pos)donde +está la concatenación, keyes 0x6861736800000000000000000000000000000000000000000000000000000000(este es el resultado web3.fromAscii("hash")y se completa con 256 bits), mientras que poses 0000000000000000000000000000000000000000000000000000000000000000.

Obtendrá 0x76616c756500000000000000000000000000000000000000000000000000000a, que es "valor" pero en formato hexadecimal.

Puede encontrar más información sobre el diseño del almacenamiento aquí .