Может кто-нибудь помочь мне понять, почему функция add
в контракте один не работает, а в контракте два есть?
Оба добываются и вставляются в блокчейн.
Спасибо.
Не рабочий договор
contract one {
struct A {
address[] count;
}
struct B {
uint8[] count;
}
mapping (address => A) a;
mapping (address => B) b;
function add(address c, uint8 g) {
a[msg.sender].count.push(c);
b[msg.sender].count.push(g);
}
}
Рабочий контракт
contract two {
struct A {
address[] count;
}
mapping (address => A) a;
function add(address c) {
a[msg.sender].count.push(c);
}
}
Работает отлично. Я получаю сообщение ["0x", 0], если я вызываю функции get1()
и get2()
сразу после отправки add(...)
транзакции. Но после некоторого ожидания функции get1()
и get2()
возвращают ожидаемые значения.
Я изменил ваш код, чтобы добавить некоторые функции для просмотра вставленных данных:
contract TwoStructs {
struct A {
address[] count;
}
struct B {
uint8[] count;
}
mapping (address => A) a;
mapping (address => B) b;
function add(address c, uint8 g) {
a[msg.sender].count.push(c);
b[msg.sender].count.push(g);
}
function get1(address sender) constant returns (address, uint8) {
return (a[sender].count[0], b[sender].count[0]);
}
function get2() constant returns (address, uint8) {
return (a[msg.sender].count[0], b[msg.sender].count[0]);
}
function getMsgSender() constant returns (address) {
return msg.sender;
}
}
geth
Я запускаю блокчейн Dev, используя следующие параметры:
geth --datadir /home/user/DevData --dev --nodiscover \
--mine --minerthreads 1 --port 30301 --maxpeers 0 \
--verbosity 3 --rpc console
Вы можете использовать такой сервис, как Line Break Removal Tool , чтобы удалить разрывы строк, или посмотреть, как загрузить исходный файл Solidity в geth для некоторых альтернатив.
Я сгладил ваш код, присвоил его переменной и вставил в geth
:
> var twoStructsSource='contract TwoStructs { struct A { address[] count; } struct B { uint8[] count; } mapping (address => A) a; mapping (address => B) b; function add(address c, uint8 g) { a[msg.sender].count.push(c); b[msg.sender].count.push(g); } function get1(address sender) constant returns (address, uint8) { return (a[sender].count[0], b[sender].count[0]); } function get2() constant returns (address, uint8) { return (a[msg.sender].count[0], b[msg.sender].count[0]); } function getMsgSender() constant returns (address) { return msg.sender; }}'
Я скомпилировал ваш код с помощью следующей команды:
> var twoStructsCompiled = web3.eth.compile.solidity(twoStructsSource);
Я использовал следующие команды, чтобы вставить ваш код в блокчейн:
> var twoStructsContract = web3.eth.contract(twoStructsCompiled.TwoStructs.info.abiDefinition);
> var twoStructs = twoStructsContract.new({from:web3.eth.accounts[0], data: twoStructsCompiled.TwoStructs.code, gas: 1000000},
function(e, contract) {
if (!e) {
if (!contract.address) {
console.log("Contract transaction send: TransactionHash: " +
contract.transactionHash + " waiting to be mined...");
} else {
console.log("Contract mined! Address: " + contract.address);
console.log(contract);
}
}
}
)
И дождался следующего сообщения:
Contract mined! Address: 0xe924f5c2240bfb2a78d46a8ebfb2bc149cfeeff0
Я вставил некоторые образцы данных в блокчейн, используя следующую команду:
> twoStructs.add(eth.accounts[0], 123, {
from:web3.eth.accounts[0],
data: twoStructsCompiled.TwoStructs.code,
gas: 1000000
});
И ждал, пока транзакция будет заминирована.
"0xe4966cb845f5e929eb554c772e9982a2e1c5f3da3190a13cca5994a4f11f4143"
Если я сразу запускаю twoStructs.get1(eth.accounts[0])
, я получаю следующие результаты:
> twoStructs.get1(eth.accounts[0])
...
PC 00000104: JUMPI GAS: 49977033 COST: 10 ERROR: invalid jump destination (PUSH1) 2
...
["0x", 0]
Если я хочу еще несколько секунд:
> twoStructs.get1(eth.accounts[0])
["0xa485ab3ad17cd9aca6fd5343a53a513685c7e0ed", 123]
> twoStructs.get2()
["0xa485ab3ad17cd9aca6fd5343a53a513685c7e0ed", 123]
> twoStructs.getMsgSender()
"0xa485ab3ad17cd9aca6fd5343a53a513685c7e0ed"
как и ожидалось. Если вы получили ["0x", 0]
, подождите некоторое время, а затем повторите попытку.
Жоэль
Родриго Плата