End-Loop-Bedingung zum Abrufen meines geschürften Smart Contracts mit Backlink?

Ich möchte alle meine Smart Contracts abrufen und mit ihnen interagieren, ohne die Blockchain immer wieder scannen zu müssen.

Dazu lasse ich mich von einer einfachen, aber cleveren Eigenschaft der Blockchain inspirieren: dem Backlink. Ich speichere die Adresse meines vorherigen Smart-Vertrags jedes Mal, wenn ich einen neuen bereitstelle:

pragma solidity ^0.4.2;

contract Test {

    address public scAddress; //current address of the smart contract
    address public lastSCAddress; // address of the previous smart contract

}

Also erstelle ich meine eigene intelligente Vertragskette innerhalb der Blockchain. Mein Problem ist, wenn ich es abrufen und mit ihnen interagieren möchte: mit web3.js:

function retrieveSmartcontract(lastKnownAddress) {
  for(var i = 0; i < (until it reaches the oldest one); i++) {
    var documentContract = web3.eth.contract(abiArray);
    var sc = documentContract.at(lastKnownAddress);
    var result = sc.getData.call();
    console.log('Data: '+ result)

    var newaddress = sc.getLastSCAddress().call();
    var sc[i] = documentContract.at(newaddress);
    var result[i] = sc2.getData.call();
    console.log('Data2: '+ result[i]);

}
}) 

Betrachten Sie es eher als Pseudo-Code. Ich werde es immer wissen lastKnownAddress. Ich weiß nicht, was die Endbedingung für meine Schleife ist. Ich habe darüber nachgedacht contract.address == unfinied, bin mir aber nicht sicher.

Vielen Dank für Ihre wertvolle Zeit und Hilfe.

EDIT: Kann es dadurch gelöst werden?

Da ich die Adresse des letzten eingesetzten Smart Contracts kenne, ist beim Initiieren dieses Prozesses die letzte Smart Contract-Adresse auch gleich der "ältesten". Ich muss es nur in einem anderen Smart Contract speichern.

pragma solidity ^0.4.2;

contract Test {

   address public lastSCAddress; // address of the previous smart contract
   string name;

}

Hier ist der Code des neuen Smart Contracts:

pragma solidity ^0.4.2;

contract Test2 {

   address public lastSCAddress; // address of the last contract mined
     address public oldestSCAddress; // address of the first ever smart contract deployed
   string name;

}

Zuletzt mein Code für die Schleife:

function retrieveSmartcontract(lastKnownAddress) { 
    // interacting with test2.sol

    var test2 = web3.eth.contract(abiArray);
    var sc = test2.at(lastKnownAddress);
    var oldestAddress = sc.getOldestSCAddress.call();
    var tmpAddress = lastKnownAddress;

  while(oldestAddress!== tmpAddress) {
    // interacting with test.sol

    var test = web3.eth.contract(abiArray);
    var sc2 = test.at(lastSCAddress);
    var result = sc2.getData.call();
    console.log('Data: '+ result)
    var tmp = sc2.getLastAddress.call();
    tmpAddress = tmp;
}
}) 

Ich hoffe, ich kann hier die While-Schleife verwenden. Im Grunde wird also getLastAddress aufgerufen, bis oldestAddressdoes not match ist tmpAddress.

Kann das bitte jemand bestätigen?

Danke

Antworten (1)

Ist es nicht contract.address == "0x0000000000000000000000000000000000000000"?

Vielleicht ist Ihre Antwort richtig, wenn ich meine Smart Contracts auf einer neuen und frischen Blockchain einsetze. Aber stellen wir uns vor, ich verwende das Testnet-Netzwerk, ich glaube nicht, dass dies der Fall sein wird, "0x0000000000000000000000000000000000000000"da ich einem Netzwerk beitrete, das bereits Hunderte von Blöcken und Smart Contracts abgebaut hat. Aber als ich dir diese Antwort schrieb, hatte ich eine Idee, ich werde meinen eigenen Beitrag bearbeiten. Können Sie mir bestätigen, ob das funktioniert?
Wenn Ihr erster Vertrag auf address public lastSCAddress;eingestellt ist 0, dann ist der Test, den ich Ihnen gegeben habe, richtig. Andere Verträge spielen keine Rolle.
Bitte schau dir mein EDIT an. Ich denke, es ist im Grunde dasselbe. Eine Bestätigung wird mir wirklich helfen. Danke
TestWelchen Wert hat ? bei der erstmaligen Bereitstellung lastSCAddress?
Kann es er selbst sein? Oohhh ja, ich sehe, welches Problem kommt. Es wird nicht in die Schleife eintreten, oder? Oder kann ich diese Variable vielleicht als belassen null?
Nein. Der erste Einsatz von TestBlättern lastSCAddressum 0. Das ist der Hinweis, von dem ich in der Antwort gesprochen habe.
Wird es nicht stören, wenn andere Smart Contracts abgebaut werden "0x0x0000000000000000000000000000000000000000"?
Sie haben eine Chance von 10^-48, dass dies passiert. Also, nein.
Nur eine letzte Frage: Warum so? Und dann verspreche ich, dass ich aufgehört habe, dich zu stören :)
Eine Adresse ist 20 Byte lang, also 160 Bit. Es gibt also 2^160 Adressen. Aber 2^10 = 1024 = ± 10^3. Also 2^160 =± 10^48. Also für einen Vertrag zu sein 0x000...ist 10^-48.