Я хочу получить все свои смарт-контракты и взаимодействовать с ними без необходимости многократного сканирования блокчейна.
Для этого я вдохновляюсь простым, но умным свойством блокчейна: обратной ссылкой. Я сохраняю адрес своего предыдущего смарт-контракта каждый раз, когда буду развертывать новый:
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
.
Может ли кто-нибудь подтвердить это, пожалуйста?
Спасибо
не так ли contract.address == "0x0000000000000000000000000000000000000000"
?
FrenchieiSverige
"0x0000000000000000000000000000000000000000"
так как я присоединяюсь к сети, в которой уже добыты сотни блоков и смарт-контрактов. Но когда я написал вам этот ответ, у меня появилась идея, я отредактирую свой собственный пост. Можете ли вы подтвердить меня, если это сработает?Ксавье Лепретр B9lab
address public lastSCAddress;
установлен на0
, то тест, который я вам дал, верен. Другие контракты не имеют значения.FrenchieiSverige
Ксавье Лепретр B9lab
Test
в первый раз, каково значениеlastSCAddress
?FrenchieiSverige
null
?Ксавье Лепретр B9lab
Test
уходитlastSCAddress
при0
. Это указание, о котором я говорил в ответе.FrenchieiSverige
"0x0x0000000000000000000000000000000000000000"
?Ксавье Лепретр B9lab
FrenchieiSverige
Ксавье Лепретр B9lab
0x000...
10^-48.