Хранилище контракта не меняется при вызове функции

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

На гет-консоли:

  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")

Я получил:

0x0000000000000000000000000000000000000000000000000000000000000000000

Почему не изменилось хранилище контрактов?

Почему бы вам просто не вызвать getфункцию?

Ответы (1)

Хранилище контрактов изменилось, вам нужно просто попробовать следующую команду:eth.getStorageAt("0x03b6676ec81168749af1a92783e67bf3b065add3",web3.sha3(0x68617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,{"encoding":"hex"}))

Первый аргумент — это адрес вашего контракта, а второй — позиция в хранилище, где хранится ваше значение. В этом случае значение вычисляется как sha3(key+pos)где +конкатенация, keyесть 0x6861736800000000000000000000000000000000000000000000000000000000(это результат web3.fromAscii("hash")и дополнено до 256 бит), а posесть 0000000000000000000000000000000000000000000000000000000000000000.

Вы получите 0x76616c756500000000000000000000000000000000000000000000000000000a, что является «значением», но в шестнадцатеричном формате.

Подробнее о схеме хранения можно узнать здесь .