我想检索我所有的智能契约并与它们交互,而不需要反复扫描区块链。
为了做到这一点,我启发了自己关于区块链的一个简单而巧妙的特性:反向链接。每次部署新合同时,我都会存储以前智能契约的地址:
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;
}以下是新smart合同的代码:
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;
}
}) 我希望我能在这里使用here循环。因此,基本上,它将调用getLastAddress,直到oldestAddress与tmpAddress**.*不匹配为止。
谢谢
发布于 2017-01-25 12:52:16
不是contract.address == "0x0000000000000000000000000000000000000000"吗?
https://ethereum.stackexchange.com/questions/11640
复制相似问题