头图

ETH Remix编译器调用硬件随机数案例

说明:
HPB目前自定义的remix solidity编译器只支持到0.5.7的版本,导致不能使用最新的合约代码来编译。

目前的解决方案是,使用HPB remix发布一个硬件随机数合约代码到HPB主网。然后开发者可以在ETH 最新的Remix上编写普通合约,调用这个硬件随机数合约进行访问随机数。
具体案例如下:

合约中获取随机数的方法如下,随机数的合约代码如下:

pragma solidity ^0.5.1;

contract HRNG {
    function hrand() public view returns (bytes32){
         return block.random;
    }
}

但是这种用法受限于必须使用 hpb-remix 以及 solidity 0.5.7 版本编译器。

为了让开发者能够使用任意版本编译器以及其他合约开发工具,现在将上面的合约部署到了测试网和主网上面,开发者可通过合约调用合约的方式获取随机数。

已部署合约地址:

testnet:0x4fe7d9b3b0b639ccad9c394aa81bc6cbe6acc7f5
mainnet:0x60db1959cc9813c5912c66e66d2299e681ea7764

调用示例:

pragma solidity ^0.6.3;

abstract contract HRNG {            // step 1. add HRNG contract declare
     function hrand() public view virtual returns (bytes32);
}

contract Demo {
    address hrngAddr;
    HRNG hrng;
    constructor (address hrngaddr) public { // step 2. set hrng contract addr by testnet or mainnet.
        hrngAddr = hrngaddr;
        hrng = HRNG(hrngAddr);
     }

    function lastr(int p) public view returns (int) {
         bytes32 r = hrng.hrand();        // step 3. call hrand to get hardware random.
         int q = p + int(r)%10;
         return q;
    }
}

测试结果:

注意:使用不同版本的 solidity 开发时,step 1 位置处的写法会有所不同,这里不一一赘述。

作者:Sagar、Jason


欢迎区块链行业志同道合的小伙伴添加小极微信,加入blockgeek区块链技术交流群,共同推动区块链技术普及和发展~

image.png

19 声望
4 粉丝
0 条评论
推荐阅读
MetaMask的常用接口调用
MetaMask是Chrome上使用的插件类型的以太坊钱包,只需要在谷歌浏览器添加对应的扩展程序即可,非常轻量级,使用起来也非常方便。library.provider 从 Web3Provider中获取BigNumber, utils 从 ethers.js 中获取1....

blockgeek1阅读 2.8k

封面图
Metamask一键添加代币
不废话直接上代码 {代码...} 以上就是一键添加代币代码,希望对大家有帮助

老韭菜1阅读 914评论 2

代码走读(第一篇)---ethereumj之Repository快照功能
ethereum有个replayBlock功能,就是将块放到指定的世界状态中,重新执行一次,获取执行结果。这个功能依赖于能够获得指定块高时的世界状态,具体就是根据块hash获取块所在的Repository快照。

一句话阅读 775

死磕solidity之编写可升级合约
默认情况下,以太坊中的智能合约是不可变的。但是一旦项目方提前发现合约漏洞或者想升级功能,是需要合约可以变动的,因此一开始编写可升级的合约是重要的。因此我们需要使用可升级的合约来增强可维护性。

mindcarver阅读 525

4EVERLAND 因对 Dfinity 生态系统的贡献而获得 Dfinity 资助
DFINITY 开发者资助计划旨在通过为有前途的开发者和团队提供支持来促进互联网计算机生态系统的发展,使全球更多的开发者能够访问和使用互联网计算机。

4EVERLAND阅读 443

封面图
合约 USDT 转账失败的问题解决
问题使用openzeppelin的IERC20封装USDT,在合约中使用 USDTtransfer方法失败!原因这是因为 USDT 的合约实现不是标准的ERC20代币的实现,openzeppelin的ERC20的transfer协议是这样的 {代码...} 而 USDT 的transfer...

Victor阅读 412评论 2

死磕solidity之如何有效的节省gas.md
DAPP中收取的费用取决于功能逻辑的复杂程度,越复杂消耗的计算资源越多。并且需要用户承担一部分gas,所以solidity 的优化显得非常的重要。同时注重优化gas的合约开发人员写出来的合约代码更安全,质量更高。

mindcarver阅读 401

19 声望
4 粉丝
宣传栏