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];
}
}
На гет-консоли:
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];}}'
myCompiled = web3.eth.compile.solidity(mySource)
myContract = web3.eth.contract(myCompiled.SimpleStorage.info.abiDefinition);
SimpleStorage = myContract.new({from:web3.eth.accounts[0], data: myCompiled.SimpleStorage.code, gas: 10000000})
miner.start()
SimpleStorage.address (I get "0x03b6676ec81168749af1a92783e67bf3b065add3")
SimpleStorage.set.sendTransaction("hash", "value", {from: eth.accounts[0]})
miner.start()
miner.stop()
eth.getStorageAt("0x03b6676ec81168749af1a92783e67bf3b065add3")
Я получил:
0x0000000000000000000000000000000000000000000000000000000000000000000
Почему не изменилось хранилище контрактов?
Хранилище контрактов изменилось, вам нужно просто попробовать следующую команду:eth.getStorageAt("0x03b6676ec81168749af1a92783e67bf3b065add3",web3.sha3(0x68617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,{"encoding":"hex"}))
Первый аргумент — это адрес вашего контракта, а второй — позиция в хранилище, где хранится ваше значение. В этом случае значение вычисляется как sha3(key+pos)
где +
конкатенация, key
есть 0x6861736800000000000000000000000000000000000000000000000000000000
(это результат web3.fromAscii("hash")
и дополнено до 256 бит), а pos
есть 0000000000000000000000000000000000000000000000000000000000000000
.
Вы получите 0x76616c756500000000000000000000000000000000000000000000000000000a
, что является «значением», но в шестнадцатеричном формате.
Подробнее о схеме хранения можно узнать здесь .
Лакшмана
get
функцию?