Fehler beim Arbeiten mit Adress-Arrays?

Ich habe den folgenden Vertrag, der Adressarrays behandelt:

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];
        }
    }
}

Der Code läuft gut auf Browser-Solidity , kann aber die Adress-Arrays nicht initialisieren, wenn er lokal (auf einem privaten Testnetz) ausgeführt wird:

    > 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"
    > 

Ist das ein Bug in Geth ? Ich verwende Version 1.3.5.

Ich habe auf Version 1.4 aktualisiert, aber jetzt sind alle Befehlszeilenargumente ungültig. Wenn ich die folgende Instanz ausführe:

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

Ich bekomme den Fehler:

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

Bearbeiten:

Gibt es einen bestimmten Grund für die Ablehnung?

Da gab es schon einige Probleme mit der alten 1.3.5 Version ... vielleicht upgraden? Hier gibt es Tutorials wie es geht...
Ich habe geth aktualisiert, aber jetzt sind alle Befehlszeilenargumente ungültig. Wissen Sie, wo ich einige Details zum Init-Argument finden kann? Die Erklärung hier github.com/ethereum/go-ethereum/wiki/Command-Line-Options#init ist nicht sehr intuitiv.
Gibt es einen Grund für die Ablehnung?
@Sebi Hast du deine Befehlszeile zum Laufen gebracht? Wenn nicht, ist es eine separate Frage.
@Sebi, sorry, ich muss mich verklickt haben.

Antworten (1)

Ich glaube nicht, dass das ein Bug ist. Diese Zeilen in initAddrzeigen an, dass es einen Schreibvorgang ausführt (Zustandsänderung). goodAddr.push(0x029ddf2082bc96d321c9769ec8e27e10b3cb16ee); badAddr.push(0x115744603fedb255e5ab4765cc1dc6c832639fd5);

Wahrscheinlich müssen Sie verwenden .sendTransaction(), um die initAddr aufzurufen. Und entfernen Sie das constantaus dieser Funktion, nur dann werden die Änderungen in Arrays widergespiegelt. Code gibt den standardmäßigen Anfangswert des Adressdatentyps zurück. Lassen Sie mich das Ergebnis wissen, nachdem Sie dies implementiert haben.
> c.getBadAddr(0); "0x0000000000000000000000000000000000000000"

Nein, habe ich nicht, da ich einen Vertragsgegenstand habe.
Ich habe dich nicht verstanden
Sie brauchen sendTransaction() nicht, um Vertragsprozeduren aufzurufen.
Bitte stimmen Sie nicht ab, ohne Ihren Grund anzugeben.
Diese Antwort scheint richtig zu sein. initAddr()sollte nicht sein, constantda es den Zustand ändert. Der Code funktioniert in Browser Solidity, da der Solidity-Compiler noch keine Konstante erzwingt, sodass eine Transaktion verwendet wird, wenn sie initAddraufgerufen wird.
Das Problem war, dass ich keinen mit dieser Methode verbundenen Saldo gesendet habe, daher wurde sie nicht ausgeführt.
Ich weiß nicht, warum die Leute auch die Frage und Antwort abgelehnt haben. Wir sind hier, um zu diskutieren.