2 сопоставленные структуры с массивом адресов - push не работает

Может кто-нибудь помочь мне понять, почему функция 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 для uint8.

Ответы (1)

Резюме

Работает отлично. Я получаю сообщение ["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], подождите некоторое время, а затем повторите попытку.

Привет. Я проверил рабочие инструкции, и они работают нормально. Используя следующие инструкции,