Ошибка Geth при работе с адресными массивами?

У меня есть следующий контракт, который обрабатывает массивы адресов:

contract C {

    address[] goodAddr;
    address[] badAddr;

    function initAddr() constant {

        if(goodAddr.length == 0) {
            goodAddr.push(0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee);
        }

        if(badAddr.length == 0) {
            badAddr.push(0x115744603fedb255e5ab4765cc1dc6c832639fd5);
        }

        if(goodAddr.length == 1 && badAddr.length == 1) {
            return;
        }

        for(uint256 i = 0; i < goodAddr.length; i++) {
            if(goodAddr[i] == 0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee)
                return;
        }

        for(i = 0; i < badAddr.length; i++) {
            if(badAddr[i] == 0x115744603fedb255e5ab4765cc1dc6c832639fd5)
                return;
        }

        goodAddr.push(0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee);
        badAddr.push(0x115744603fedb255e5ab4765cc1dc6c832639fd5);
    }

    function getGoodAddr(uint256 i) constant returns (address) {
        if(i < 0 || i >= goodAddr.length) {
            return 0x0000000000000000000000000000000000000000;
        } else {
            return goodAddr[i];
        }
    }

    function getBadAddr(uint256 i) constant returns (address) {
        if(i < 0 || i >= badAddr.length) {
            return 0x0000000000000000000000000000000000000000;
        } else {
            return badAddr[i];
        }
    }
}

Код отлично работает в надежном браузере, но не может инициализировать массивы адресов при локальном запуске (в частной тестовой сети):

    > eth.accounts
["0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee", "0x115744603fedb255e5ab4765cc1dc6c832639fd5"]
    > checkAllBalances();
  eth.accounts[0]: 0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee   balance: 55922.95 ether
  eth.accounts[1]: 0x115744603fedb255e5ab4765cc1dc6c832639fd5   balance: 1337 ether
undefined
    > var c = cContract.new(
    ..    {
    ......      from: web3.eth.accounts[0], 
    ...... {0600101610568565b5090565b5b5050509190906000526020600020900160005b73115744603fedb255e5ab4765cc1dc6c832639fd5909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff02191690830217905550505b5056', 
    ......      gas: 4700000
    ......    }, function (e, contract){
    ......     console.log(e, contract);
    ......     if (typeof contract.address !== 'undefined') {
    ..........          console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    ..........     }
    ......  });
    Unlock account 029ddf2082bc96d321c9769ec8e27e10b3cb16ee
    Passphrase: 
    null [object Object]
    undefined
    > null [object Object]
    Contract mined! address: 0xb43c8d6c6ee366358f170553602f2a0fc8ebe1d6 transactionHash: 0x8741c2ccae448a1cc647bdc03883e9136dadcec7adf942832f46bdcbe02e2eae

    > c
    {
      address: "0xb43c8d6c6ee366358f170553602f2a0fc8ebe1d6",
      transactionHash: "0x8741c2ccae448a1cc647bdc03883e9136dadcec7adf942832f46bdcbe02e2eae",
      allEvents: function(),
      getBadAddr: function(),
      getGoodAddr: function(),
      initAddr: function()
    }
    > c.initAddr.call();
    []
    > c.getBadAddr(0);
    "0x0000000000000000000000000000000000000000"
    > c.getGoodAddr(0);
    "0x0000000000000000000000000000000000000000"
    > 

Это ошибка в гете ? Я использую версию 1.3.5.

Я обновился до версии 1.4, но теперь все аргументы командной строки недействительны. Когда я запускаю следующий экземпляр:

 geth --datadir "./datadir" --networkid 13 --rpcapi eth,web3,personal --rpc --maxpeers 0 init "gen.json" --etherbase "0x0000000000000000000000000000000000000000" --mine --minerthreads 2

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

Incorrect Usage.

init [arguments...]

The init command initialises a new genesis block and definition for the network.
This is a destructive action and changes the network in which you will be
participating.


flag provided but not defined: -etherbase

Редактировать:

Какая-то конкретная причина для понижения?

Там, где уже несколько проблем со старой версией 1.3.5 ... может быть, обновить? здесь есть уроки как это сделать...
Я обновил geth, но теперь все аргументы командной строки недействительны. Вы знаете, где я могу найти некоторые подробности об аргументе инициализации? Объяснение здесь github.com/ethereum/go-ethereum/wiki/Command-Line-Options#init не очень интуитивно понятно.
Любая причина для понижения?
@Sebi У тебя заработала командная строка? Если нет, то это отдельный вопрос.
@Sebi, извините, я, должно быть, ошибся.

Ответы (1)

Я не думаю, что это ошибка. Эти строки initAddrозначают, что выполняется операция записи (изменение состояния). goodAddr.push(0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee); badAddr.push(0x115744603fedb255e5ab4765cc1dc6c832639fd5);

Вероятно, вам нужно использовать .sendTransaction()для вызова initAddr. И уберите constantиз этой функции, только тогда изменения отразятся в массивах. Код возвращает начальное значение по умолчанию для типа данных адреса. Сообщите мне результат после реализации этого.
> c.getBadAddr(0); "0x0000000000000000000000000000000000000000"

Нет, так как у меня есть объект контракта.
я не понял тебя
Вам не нужно sendTransaction() для вызова контрактных процедур.
Пройдитесь по нему: github.com/ethereum/go-ethereum/wiki/…
Пожалуйста, не минусуйте, не указав причину.
Этот ответ кажется правильным. initAddr()не должно быть, constantтак как он меняет состояние. Код работает в Browser Solidity, поскольку компилятор Solidity еще не применяет константу, поэтому при initAddrвызове используется транзакция.
Проблема заключалась в том, что я не отправил баланс, связанный с этим методом, поэтому он не был выполнен.
Я не знаю, почему люди также проголосовали за вопрос и ответ. Мы здесь, чтобы обсудить.