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

Может кто-нибудь помочь мне понять, почему функция 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);
    }
}
5 голосов | спросил Rodrigo Plata 2 Maypm16 2016, 19:59:59

1 ответ


4

Резюме

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

ответил The Officious BokkyPooBah 6 Mayam16 2016, 11:49:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132