是否有可能让智能合约实时了解 RSK pegnatories 的地址?

Jac*_*ack 6 bitcoin solidity web3-donotuse rsk

有没有办法在 RSK 上使用智能合约来查询所有当前 pegnatories 的地址?并且在不依赖 RSK 上的 3rd 方预言机的情况下这样做?

对于上下文:这里的目的是让智能合约将费用产生的部分收入分配给 pegnatories,以促进 RSK 链的可持续性和安全性。

请注意,这是上一个关于 RSK 桥接器的后续问题。

bgu*_*uiz 5

使用 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)));

Run Code Online (Sandbox Code Playgroud)

要初始化bridge对象,您需要使用 ABI 进行 RSK Bridge 预编译,如前面的答案中所述


Ale*_*hin 5

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要在链上(在智能合约中)执行此操作,您可以创建一个 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);
Run Code Online (Sandbox Code Playgroud)

以后可能会像这样从 web3.js 调用这个函数

const fedPubKeys = await federation.methods.getFederatorKeys().call()
Run Code Online (Sandbox Code Playgroud)