有没有办法在 RSK 上使用智能合约来查询所有当前 pegnatories 的地址?并且在不依赖 RSK 上的第 3 方预言机的情况下这样做?
上下文:这里的目的是让智能合约将部分费用产生的收入分配给 pegnatories,以促进 RSK 链的可持续性和安全性。
请注意,这是关于 RSK 桥的前一个问题的后续问题。
有没有办法在 RSK 上使用智能合约来查询所有当前 pegnatories 的地址?并且在不依赖 RSK 上的第 3 方预言机的情况下这样做?
上下文:这里的目的是让智能合约将部分费用产生的收入分配给 pegnatories,以促进 RSK 链的可持续性和安全性。
请注意,这是关于 RSK 桥的前一个问题的后续问题。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
import "./Bridge.sol";
contract Federation {
function getBridge() private pure returns (Bridge) {
return Bridge(address(0x01000006));
}
function getFederationSize() private view returns ( int256 ) {
return getBridge().getFederationSize();
}
function getFederatorPublicKeyOfType ( int256 index, string memory atype ) private view returns ( bytes memory ) {
return getBridge().getFederatorPublicKeyOfType(index, atype);
}
function getFederatorKeys() public view returns( bytes[] memory ) {
int256 fedSize = getFederationSize();
bytes[] memory keys = new bytes[](uint(fedSize));
for (int256 i = 0; i < fedSize; i += 1) {
keys[uint(i)] = getFederatorPublicKeyOfType(i, 'rsk');
}
return keys;
}
}
要在链上执行此操作(在智能合约中),您可以创建一个 Solidity 函数(getFederatorKeys()
在上面的代码中),它与
来自@bguiz 的 web3.js 答案相同
,即调用getFederationSize
,然后getFederatorPublicKeyOfType
在循环中。
请注意,您将需要修改Bridge.sol
接口,以便具有的getFederatorPublicKeyOfType
签名view
- function getFederatorPublicKeyOfType ( int256 index, string calldata atype ) external returns ( bytes memory);
+ function getFederatorPublicKeyOfType ( int256 index, string calldata atype ) external view returns ( bytes memory);
稍后这个函数可能会像这样从 web3.js 调用
const fedPubKeys = await federation.methods.getFederatorKeys().call()
使用 web3.js 你应该能够做到以下几点:
let fedSize = await bridge.methods
.getFederationSize().call();
let pks = [];
for (let i = 0; i < fedSize; i++) {
let pk = await bridge.methods
.getFederatorPublicKeyOfType(i, 'rsk').call();
pks.push(pk);
}
let addresses = pks.map((pk) => (keccak256(pk).substr(12)));
要初始化bridge
对象,您需要使用 ABI for RSK Bridge 预编译,如前面的答案中所述。