Условие конечного цикла для получения моего добытого смарт-контракта с использованием обратной ссылки?

Я хочу получить все свои смарт-контракты и взаимодействовать с ними без необходимости многократного сканирования блокчейна.

Для этого я вдохновляюсь простым, но умным свойством блокчейна: обратной ссылкой. Я сохраняю адрес своего предыдущего смарт-контракта каждый раз, когда буду развертывать новый:

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

}

Поэтому я создаю свою собственную цепочку смарт-контрактов внутри блокчейна. Моя проблема заключается в том, что я хочу получить его и взаимодействовать с ними: используя 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]);

}
}) 

Воспринимайте это скорее как псевдокод. Я всегда буду знать lastKnownAddress. Я не знаю, что является конечным условием для моего цикла. Я думал об contract.address == unfiniedэтом, но я не уверен в этом.

Спасибо за ваше драгоценное время и помощь.

РЕДАКТИРОВАТЬ: Можно ли это решить этим?

Поскольку я знаю адрес последнего развернутого смарт-контракта, когда я инициирую этот процесс, последний адрес смарт-контракта также равен «самому старому». Мне просто нужно сохранить его в другом смарт-контракте.

pragma solidity ^0.4.2;

contract Test {

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

}

Вот код нового смарт-контракта:

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;

}

Наконец, мой код для цикла:

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

Я надеюсь, что смогу использовать здесь цикл while. Таким образом, он будет вызывать getLastAddress до тех пор, пока oldestAddressне будет найдено совпадение tmpAddress.

Может ли кто-нибудь подтвердить это, пожалуйста?

Спасибо

Ответы (1)

не так ли contract.address == "0x0000000000000000000000000000000000000000"?

Возможно, ваш ответ правильный, когда я развертываю свои смарт-контракты на новой и свежей цепочке блоков. Но давайте представим, я использую сеть testnet, я не думаю, что это будет, "0x0000000000000000000000000000000000000000"так как я присоединяюсь к сети, в которой уже добыты сотни блоков и смарт-контрактов. Но когда я написал вам этот ответ, у меня появилась идея, я отредактирую свой собственный пост. Можете ли вы подтвердить меня, если это сработает?
Если ваш первый контракт address public lastSCAddress;установлен на 0, то тест, который я вам дал, верен. Другие контракты не имеют значения.
Пожалуйста, взгляните на мой РЕДАКТИРОВАТЬ. Я думаю, что это в основном одно и то же. Подтверждение действительно поможет мне. Спасибо
Когда вы развертываете Testв первый раз, каково значение lastSCAddress?
Может быть он сам? Oohhh да, я вижу, какая проблема идет. Он не войдет в цикл, верно? Или, может быть, я могу оставить эту переменную как null?
Нет. Первый деплоймент Testуходит lastSCAddressпри 0. Это указание, о котором я говорил в ответе.
Не помешает ли майнинг других смарт-контрактов "0x0x0000000000000000000000000000000000000000"?
У вас есть шанс 10^-48, что это произойдет. Итак, нет.
Только последний вопрос: почему так? И тогда я обещаю, что перестал вас беспокоить :)
Адрес имеет длину 20 байт, поэтому 160 бит. Итак, есть 2 ^ 160 адресов. Но 2^10 = 1024 = ± 10^3. Таким образом, 2 ^ 160 = ± 10 ^ 48. Таким образом, для контракта будет 0x000...10^-48.