• 简体版 | 繁體版
  • 联系我们
  • 加入我们
  • 关于我们
  •  
  • 首页
  • 快讯
  • 价值号
  • 视频
  • 专题
  • 深度
  • 入驻价值号
  • 碳链APP
    微信公众号

    扫码下载App

  • 登录
  • 微信公众号

    微信公众号

导航
  • 首页
  • 快讯
  • 区块链+
  • 价值号
  • 视频
  • 专题
  • DeFi优选
碳链价值APP
专注服务于金融科技和区块链
立即打开

如何猜智能合约上的随机数?

去中心化金融社区去中心化金融社区  •  2022-01-17
我们的目标是在函数下guess。

在链上创建随机数是一项复杂的任务。事实上,有一些方法可以做到这一点,但总的来说,强烈建议在链下进行,因为几乎所有用于熵的输入都是公开的,或者在某种程度上可以被操纵。

幸运的是,这个挑战要求我们猜测链上创建的一个“随机”数字。这是怎么回事?

猜随机数字挑战智能合约代码猜随机数字挑战智能合约代码合约的第一行是一个uint8变量,answer。记住uint8变量最多包含256个可能的整数:0到255。

这个变量在构造函数中被分配给两个输入的 keccak256 哈希:包含我们部署交易的那个区块的前一个区块的blockhash (block.blockhash(block.number - 1), of type bytes32)和我们的区块被挖的时间戳(now, of type uint256)。

请记住,这个合约使用的是编译器版本^0.4.21,从那以后,一些语法发生了变化:block.blockhash()现在是blockhash(),now现在是block.timestamp。

正如我们在这行中看到的,keccak256函数(一个 bytes32 固定大小的字节数组)随后被显式转换为uint8并赋值给我们的变量。

这看起来很随机,对吧?我们应该如何猜出0到255之间的一个数字,它来自于对某个区块的哈希函数和时间戳。

其实很简单。因为区块链上的所有东西都是公开的。

我们的目标是在函数下guess,我们必须调用它并发送一个uint8 + 1 以太(我们已经在部署上发送了一个),然后如果我们的uint8等于answer变量,合约将发送我们2个以太,耗尽余额,因此isComplete()函数将返回到 true。

有多种与合约交互的方式,但我决定通过另一个合约来实现。这不是最简单的方法,在这种情况下,甚至没有必要,但绝对是我们可以利用的方法。

以下是我为解决这个问题所编写的代码:

// SPDX-License-Identifier: No License

pragma solidity ^0.8.0;interface IGuessTheRandomNumberChallenge {

function guess(uint8) external payable;

}contract GuessTheRandomNumberSolver { IGuessTheRandomNumberChallenge public _interface;

bytes32 public previousBlockHash = 0x66bcdb5e320c9e0c04a9fdeaa15de33a4c8a040db342f4f955fa54f170dba9ce;

uint public previousTimestamp = 1641520092; constructor(address _interfaceAddress) {

require(_interfaceAddress != address(0), "Address can not be Zero");

_interface = IGuessTheRandomNumberChallenge(_interfaceAddress);

} function solve() public payable {

uint8 answer = uint8(uint256(keccak256(abi.encodePacked(previousBlockHash, previousTimestamp))));

_interface.guess{value: 1 ether}(answer);

} function getBalance() public view returns(uint){

return address(this).balance;

} function withdraw() public {

payable(msg.sender).transfer(address(this).balance);

} receive() external payable {}

}

编译器版本之后,首先看到的是一个接口。我们可以使用它们通过代码与其他合约交互。它基本上是一个带有一些规则的简单合约:

  • 它们不能从其他合约继承,但可以从其他接口继承。

  • 所有声明的函数必须是外部的。

  • 它们不能声明构造函数。

  • 它们不能声明状态变量。

  • 它们不能声明修饰符。

因为我们只需要调用' guess '函数,所以它是我们在接口中声明的唯一一个函数。

然后,在我们的GuessTheRandomNumberSolver合约中,我们将声明一个_interface变量,并通过构造函数分配挑战的地址(在CTE中部署它时获得的的地址)。

这就是我们现在在已部署的挑战中调用函数所需要的一切,我们继续收集信息,以重新创建与它一起部署的random number。

这些都可以在etherscan中找到,我们只需要寻找我们挑战的地址。

Blockhash(block.number - 1):要得到这个,可以转到内部Internal Txns标签,然后单击显示Contract Creation的同一行上的区块号码。在我的例子中,区块是#11766860:

现在,我们可以看到很多关于那个区块的信息,但我们需要访问前一个,所以继续寻找它。在我的例子中,它是#11766859。

下面我们可以看到hash。这是我们需要的第一个信息。

Block.timestamp:回到我们的区块,你会在第二行看到时间戳。这是一种人类可读的格式,我们需要Unix Timestamp格式。那是什么? 它是自1970年1月1日以来所经过的秒数。这是衡量时间的标准方法。

为了将这个人类可读的时间戳转换为Unix时间,我使用了一个非常方便的站点epochconverter。有了这个数字,我们终于有了最后一块拼图,我们可以来解决这个挑战。

回到GuessTheRandomNumberSolver合约,让我们创建一个solve函数,我们将调用它来联系我们的挑战合约。

为了提高可读性,我还创建了两个新变量:

  • bytes32 public previousBlockHash

  • uint public previousTimestamp.

创建它们,但要赋予它们挑战的价值。

然后,在我们的solve函数中,我们将创建uint8 answer变量,并将其赋值:

uint8(uint256(keccak256(abi.encodePacked(previousBlockHash, previousTimestamp))))

语法和格式的变化是因为我们使用的是^0.8.0版本的编译器,而挑战是使用^0.4.21版本。

现在我们已经将答案赋给了变量,我们只需要通过接口调用挑战。这就是下一行要做的:

_interface.guess{value: 1 ether}(answer)

我假设你正在使用remix,所以继续,通过Injected Web3环境连接到metamask钱包,并部署合约,指定自己的挑战地址来分配给自己的界面。

现在,在将值输入为1的情况下,继续调用guess函数。

我已经添加了更多的函数:

  • getBalance()

  • withdraw()

  • receive()

这是因为挑战是msg.sender将是我们的GuessTheRandomNumberSolver合约,而不是我们的EOA -所以我们需要接收2个以太,并能够将它们发送到我们的EOA。

Source:https://betterprogramming.pub/capture-the-ether-guess-the-random-number-2ebb8c9c0347

展开全文
打开碳链价值APP  查看更多精彩资讯
声明:本文内容为作者独立观点,不代表碳链价值立场,且不构成任何投资理财建议。
0 1
智能合约Web3区块链函数

扫一扫,分享到微信

相关推荐

区块链黑暗森林自救手册官网&英文版正式发布 价值号

区块链黑暗森林自救手册官网&英文版正式发布

慢雾科技 2022-05-20 价值号
区块链
黑手册不仅只是一份手册,我们正在联合更多优质的 Web3 合作伙伴,一起将这个行业的安全意识提高至少一个台阶。
虚假广告广泛撒网,你被钓鱼了吗? 价值号

虚假广告广泛撒网,你被钓鱼了吗?

慢雾科技 2022-05-19 价值号
钓鱼虚假网站区块链
保持警惕,保持怀疑。
创宇区块链|知道创宇区块链安全实验室 参与中国信息产业商会团体标准《区块链 关键服务 安全技术要求》制定工作 价值号

创宇区块链|知道创宇区块链安全实验室 参与中国信息产业商会团体标准《区块链 关键服务 安全技术要求》制定工作

知道创宇区块链安全实验室 2022-05-19 价值号
区块链
知道创宇区块链安全实验室 参与编写的《区块链 关键服务 安全技术要求》标准重磅发布!

碳链快讯更多 ›

2022-05-20

DeFi 流动性管理协议 iZUMi Finance 完成 3000 万美元融资

2022-05-20

G7:加密资产应与传统金融资产遵循相同标准

2022-05-20

OpenSea交易额突破300亿美元

2022-05-20

数字支付公司Xendit完成3亿美元D轮融资,Coatue等领投

2022-05-20

比尔·盖茨:没有投资任何加密资产

2022-05-20

贵州茅台数字藏品活动已暂停

2022-05-20

前美国驻华大使:全球合作对于促进Web3.0的发展非常重要

2022-05-20

Gopax运营商Streami完成约2368万美元B轮融资

2022-05-20

塞浦路斯已起草加密资产监管法案

2022-05-20

世界经济论坛:数字货币将重塑全球贸易格局

2022-05-20

英国监管机构将结合近期稳定币市场的不稳定性与财政部联合制定加密新规

2022-05-20

Tether CTO:Terra项目并非Rug Pull,而是设计糟糕的「纸牌城堡」

2022-05-20

索尼音乐成立RCA唱片大中华区分部,将探索NFT和元宇宙等领域

2022-05-20

乌兰察布市集宁区法院发布区块链存证应用指引

2022-05-20

Web3平台Ecosapiens完成150万美元融资,BoostVC领投

2022-05-20

V神:将长期提升以太坊区块容量至16 MB,将支持Rollup达到8万TPS/秒

2022-05-20

V神:以太坊2.0最早可能于8月进行合并

2022-05-20

韩国将于5月24日召集交易所就LUNA事件召开紧急会议

2022-05-20

质押平台Kiln完成500万美元融资,SV Angel等参投

2022-05-20

Avalanche:LFG没有披露使用AVAX代币的计划

2022-05-20

美联储监管副主席提名人Michael Barr:加密货币有潜力也有风险,需要进行监管

2022-05-20

G7财长公报草案:鉴于最近加密市场的动荡,G7敦促FSB推进全面监管

2022-05-19

SingularityNET和SingularityDAO获LDA Capital 2500万美元投资承诺

2022-05-19

SWIFT确认正在与Capgemini合作进行CBDC相关跨境支付测试

2022-05-19

证券型代币风投工作室Security Token Group完成300万美元A轮融资,Blue Bay Ventures领投

2022-05-19

Tether一季度审计报告:商业票据投资大幅减少,美国国债投资增加

2022-05-19

加拿大风投Round13推出1亿美元加密专项基金,目前已募资7000万美元

2022-05-19

Ripple将投资1亿美元用于碳减排技术以及相关工具开发

2022-05-19

欧易OKX将于明日上线合约冷静期功能

2022-05-19

美国SEC专员Hester Peirce:担心美国会限制加密货币市场的创新

2022-05-19

Terra验证者Allnodes抨击Do Kwon提出的分叉提案投票管理是「独裁模式」

2022-05-19

俞敏洪:黄怒波和我天天把区块链、元宇宙放在嘴边,其实我们根本不懂

2022-05-19

由于监管不确定性,比特币矿企开始远离纽约州

2022-05-19

韩国金融证券犯罪联合调查组对Terra及其团队核心成员启动调查

2022-05-19

Revolut CEO:公司计划推出的原生代币将奖励客户忠诚度,肯定不是稳定币

2022-05-19

韩国风投Hashed在Terra危机中或损失超35亿美元

2022-05-19

链游工作室Azra Games完成1500万美元种子轮融资,a16z领投

2022-05-19

Babel Finance和FQX以加密“eNote”进军债券市场

2022-05-19

FTX US将为部分美国用户开放股票交易服务

2022-05-19

Zhu Su:一些迹象显示比特币正在重新进入积累期

2022-05-19

嘉楠一季度财报显示营收13.6亿元人民币,利润4.416亿元人民币

2022-05-19

美国商务部将发布17个加密问题,征求意见以帮助开发加密框架

2022-05-19

报告:一季度全球区块链行业融资超90亿美元,创历史新高

2022-05-19

Coinbase Ventures在2022年Q1完成超70次投资

2022-05-19

Argo Blockchain在UST完全崩盘前以每枚0.93美元的均价将其出售

2022-05-19

加密钱包服务提供商Coins.ph完成3000万美元C轮融资,Ribbit Capital领投

2022-05-19

Web3基础设施提供商NodeReal完成1600万美元A轮融资,Sky9 Capital领投

2022-05-19

俄罗斯金融市场官员:预计今年将出现俄罗斯首个数字金融资产

2022-05-19

Mee6:员工帐户遭入侵导致被用来发布虚假信息,目前已解决

2022-05-19

数据:4月中旬迄今风投对Web3游戏和元宇宙行业的投资额近30亿美元

推荐文章

  • 万字解读Telegram发家史:Pavel Durov如何变成「Facebook反抗者」

    2022-01-17

  • 朱嘉明:风口上的元宇宙

    2022-01-16

  • 央视财经:元宇宙时代虚拟人市场规模将达2700亿元

    2022-01-16

  • 2021年Dapp行业报告:NFT、元宇宙以及DeFi

    2022-01-16

  • 元宇宙的建设需要哪些硬件?

    2022-01-13

价值号更多 ›

吉时通信
吉时通信
文章: 121
  • Web3.0时代:开放、隐私和共建
  • 专访唯一艺术CEO:合规下的NFT发展探索
  • 国盛区块链:虚拟人在元宇宙时代能否迎来爆发
链集市ChainMarket
链集市ChainMarket
文章: 147
  • 如何使用区块链和NFT进行身份验证、品牌推广和建立合作?
  • 区块链产业周刊:北京推动形成区块链产业集群,长沙经开区发布区块链产业发展五年规划
  • 一文解读加拿大沃尔玛如何利用区块链技术应对供应链挑战
加密谷Live
加密谷Live
文章: 585
  • 公链Fantom:从数据视角解读Fantom为何会暴涨?
  • Layer 2时代:照亮Play to Earn游戏的前路
  • 解析 DeFi 领域的助力器:去中心化身份 DID
换一批

热门标签

新基建 比特币 以太坊 矿业 DeFi 共识对话 区块链+ 研报 美联储 央行数字货币 无限QE 加密衍生品 AI 云计算 大数据 5G 政策 交易所 稳定币 电子支付 Libra 算力产业 联盟链 公链 区块链 加密货币 Nervos Cosmos EOS STO

邮件订阅

及时、全面、专业、准确的资讯与数据,致力于为区块链爱好者以及数字货币投资者提供最好的服务。

App内打开

邮件订阅

及时、全面、专业、准确的资讯与数据,致力于为区块链爱好者以及数字货币投资者提供最好的服务。

Moshou

碳链价值是集资讯、行情、数据于一身的区块链信息服务平台,我们追求及时、全面、专业、精确的资讯与数据,致力于为区块链创新者和数字货币投资者提供优质的服务。

关于我们 加入我们 联系我们 隐私条款
微信公众号

扫一扫关注微信公众号

Copyright © 2018-2020 碳链价值 京ICP备18046423号
下载碳链App

下载碳链App

微信公众号

微信公众号

微信公众号

微信公众号

打赏文章作者

支付宝打赏二维码 支付宝扫一扫打赏
微信打赏二维码 微信扫一扫打赏

# 热门搜索 #

CBDC 比特币 DeFi 以太坊 区块链