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 oldestAddress
does not match ist tmpAddress
.
Kann das bitte jemand bestätigen?
Danke
Ist es nicht contract.address == "0x0000000000000000000000000000000000000000"
?
FrenchieiSverige
"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?Xavier Leprêtre B9lab
address public lastSCAddress;
eingestellt ist0
, dann ist der Test, den ich Ihnen gegeben habe, richtig. Andere Verträge spielen keine Rolle.FrenchieiSverige
Xavier Leprêtre B9lab
Test
Welchen Wert hat ? bei der erstmaligen BereitstellunglastSCAddress
?FrenchieiSverige
null
?Xavier Leprêtre B9lab
Test
BlätternlastSCAddress
um0
. Das ist der Hinweis, von dem ich in der Antwort gesprochen habe.FrenchieiSverige
"0x0x0000000000000000000000000000000000000000"
?Xavier Leprêtre B9lab
FrenchieiSverige
Xavier Leprêtre B9lab
0x000...
ist 10^-48.