Получение ошибки «неправильный код операции»

Прежде всего, извините за код на португальском, это был выбор команды, и я не говорил об этом.

Я пишу Billet Manager, код выглядит следующим образом:

contract GerenciadorBoletos {

     struct Boleto {
         uint codigoBarra;
         uint codigoBarraDigitavel;
         uint cpfOuCnpjBeneficiario;
         uint cpfOuCnpjPagador;
         uint valorOriginal;
         uint dataVencimento;
     }

     mapping(uint => Boleto) registroBoletos;

     function inserirBoleto(
         uint codigoBarra,
         uint codigoBarraDigitavel,
         uint cpfOuCnpjBeneficiario,
         uint cpfOuCnpjPagador,
         uint valorOriginal,
         uint dataVencimento
     ) {
         Boleto memory b = Boleto(
             codigoBarra,
             codigoBarraDigitavel,
             cpfOuCnpjBeneficiario,
             cpfOuCnpjPagador,
             valorOriginal,
             dataVencimento
         );

         // I need to do some validations before store it, but there is no code yet

         registroBoletos[b.codigoBarra] = b;
     }
}

Я тестирую его с помощью TestRPC и Mocha:

 describe('1. Inserção', function(){
     it('Deve ter inserido um boleto com os dados válidos com sucesso', function(done){
         var boletoParaInserir = gerarBoletoValido();
         console.log(boletoParaInserir);

         gerenciadorBoleto.inserirBoleto.sendTransaction(
             9872387128, 987128382, 91289312, 81273818, 50, Date.now() + 3*24*3600,
             {
                 from: web3.eth.accounts[0],
                 gas: 3000000,
             },
             function(e, result) {
                 expect(e).to.not.exist;

                 expect(result).to.exist;
                 result.should.be.above(0);
             }
         );
     });
 });

Я получаю следующую ошибку:

Uncaught AssertionError: expected [Error: Error: VM Exception while 
    executing transaction: invalid opcode

Изменить

Это, похоже, проблема с TestRPC.

Я открыл вопрос в github.

6 голосов | спросил Henrique Barcelos 5 Mayam16 2016, 02:00:49

1 ответ


3

Резюме

Ошибка при вводе кода в код geth и выполняется.

Можете ли вы попробовать вставить свой код в geth и посмотреть, не исчезла ли у вас ошибка geth «неправильный код операции».

В ответе OPs в комментарии проблема с «недопустимым кодом операции» вызвана синхронизацией тестового примера.



Подробнее

Изменен код

Я немного изменил ваш код, изменив комментарий // в /* ... */ и добавил публикацию к вашей структуре сопоставления:

contract GerenciadorBoletos {

    struct Boleto {
        uint codigoBarra;
        uint codigoBarraDigitavel;
        uint cpfOuCnpjBeneficiario;
        uint cpfOuCnpjPagador;
        uint valorOriginal;
        uint dataVencimento;
    }

    mapping(uint => Boleto) public registroBoletos;

    function inserirBoleto(
        uint codigoBarra,
        uint codigoBarraDigitavel,
        uint cpfOuCnpjBeneficiario,
        uint cpfOuCnpjPagador,
        uint valorOriginal,
        uint dataVencimento
    ) {
        Boleto memory b = Boleto(
            codigoBarra,
            codigoBarraDigitavel,
            cpfOuCnpjBeneficiario,
            cpfOuCnpjPagador,
            valorOriginal,
            dataVencimento
        );

        /* I need to do some validations before store it, but there is no code yet */

        registroBoletos[b.codigoBarra] = b;
    }
}


Запуск 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 gerenciadorBoletosSource='contract GerenciadorBoletos { struct Boleto { uint codigoBarra; uint codigoBarraDigitavel; uint cpfOuCnpjBeneficiario; uint cpfOuCnpjPagador; uint valorOriginal; uint dataVencimento; } mapping(uint => Boleto) public registroBoletos; function inserirBoleto( uint codigoBarra, uint codigoBarraDigitavel, uint cpfOuCnpjBeneficiario, uint cpfOuCnpjPagador, uint valorOriginal, uint dataVencimento ) { Boleto memory b = Boleto( codigoBarra, codigoBarraDigitavel, cpfOuCnpjBeneficiario, cpfOuCnpjPagador, valorOriginal, dataVencimento ); /* I need to do some validations before store it, but there is no code yet */ registroBoletos[b.codigoBarra] = b; }}'


Скомпилированный код

Я скомпилировал ваш код, используя следующую команду:

> var gerenciadorBoletosCompiled = web3.eth.compile.solidity(gerenciadorBoletosSource);


Вставьте свой код в блок-цепочку

Я использовал следующие команды для вставки кода в цепочку:

var gerenciadorBoletosContract = web3.eth.contract(gerenciadorBoletosCompiled.GerenciadorBoletos.info.abiDefinition);
var gerenciadorBoletos = gerenciadorBoletosContract.new({from:web3.eth.accounts[0], data: gerenciadorBoletosCompiled.GerenciadorBoletos.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: 0x9e550b10e770b050d6ec9af80c5fdb6540089803


Отправленная транзакция для добавления данных

Я скопировал основную часть вашего sendTransaction, чтобы вставить ваши данные образца в цепочку:

> gerenciadorBoletos.inserirBoleto.sendTransaction(
    9872387128, 987128382, 91289312, 81273818, 50, Date.now() + 3*24*3600,
    {
      from: web3.eth.accounts[0],
      gas: 3000000,
    },
    function(e, result) {
      expect(e).to.not.exist;
      expect(result).to.exist;
      result.should.be.above(0);
    }
  );

И ожидал, что транзакция будет добыта.


Проверка данных после ввода данных

> gerenciadorBoletos.registroBoletos(9872387128)
[9872387128, 987128382, 91289312, 81273818, 50, 1462459836202]


Недействительный код операции

Я дважды проверил сообщения geth, и я не получил сообщение «неверный код операции».

ответил The Officious BokkyPooBah 5 Maypm16 2016, 16:56:40

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

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

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