孤荷凌寒自学第174天区块链088天Dapp043
【主要内容】
今天继续学习实战,开始做一个波菜类的猜大小的智能合约。共耗时32分钟。
(此外整理作笔记花费了约40分钟)
详细学习过程见文末学习过程屏幕录像。
【solidity书写的智能合约的随机数生成的问题】
通过计算机算法来生成的随机数都是伪随机数。
这给波菜类智能合约的随机数生成造成了严重的安全隐患,其实在这里就可以准确 的说,网络的dubo行为,就可以知道是多少愚蠢了,连生成的随机数都是不安全的,其结果可想而知。
搜索了相关博文:
https://www.jianshu.com/p/fa4e79f2a9e7
https://blog.csdn.net/hello2mao/article/details/79896356
https://ethereum.stackexchange.com/questions/191/how-can-i-securely-generate-a-random-number-in-my-smart-contract
https://blog.csdn.net/hyb1234hi/article/details/79675205
【不安全的简单随机数生成】
思路 :
先使用
keccak256()函数
生成 一个哈希字符串。
再通过
%
运算
取出哈希字符串最后的n个字符(自0至n)的值
如
s % 6
结果就是0-6之间的数
s % 100
结果就是0-100之间的数
(没有经过验证)
keccak256()需要两个参数,一个是用于取出哈希的原对象,第二个是一个随机数种子。
于是,我们可以选择的要计算并取出哈希的原对象一般是:
1.
block.numer
block.blockhash(block.number-1)
block.difficulty
之类的与区块链本身无法修改的区块高度值相关的对象。
2.
msg.sender
之类的与调用合约节点的地址相关的对象。
而对于第二参数所需要的随机数种子,一般,采用
1.
每次手动指定一个随机数种子
2.
使用当前时间戳
然而根据上面的博文,这些方法 都 是不安全的。
示例如下:
```
uint r = uint(keccak256(block.blockhash(block.number-1), seed ))%6;
return r;
```
```
pragma solidity ^0.4.0;
contract random{
function rand() public returns(uint256) {
uint256 random = uint256(keccak256(block.difficulty,now));
return random%10;
}
}
```
```
// 生成一个0到100的随机数:
uint randNonce = 0;
uint random = uint(keccak256(now, msg.sender, randNonce)) % 100;
randNonce++;
uint random2 = uint(keccak256(now, msg.sender, randNonce)) % 100;
```
【使用外部随机数】
今天 第一次了解了一个概念
https://cloud.tencent.com/developer/news/256793
Oracles
(神谕)
“
基于以太坊的智能合约是一种简单但有效的代码形式,意旨实现提供服务或货物,以换取某些价值(无论是货币还是时间的交换)。
但是,由于这些交换完全基于以太坊网络,因此必须限制信息的输入,以免压倒区块链的轻量级特性。实际上,智能合约相当于一名法官,不过它需要一个真实可靠的信息来源来作出正确的判断。
——这是Oracles的由来。
Oracles是可信的数据馈送:消除了对智能合约直接访问其网络之外的信息需求,可将外部信息直接发送到智能合约中,从而减轻工作量。Oracles通常由第三方授权提供。
”
当然目前对此完全没有进入了解,初步感觉这是将区块链与现实世界连接的一个重要接口。
github: https://github.com/lhghroom/Self-learning-blockchain-from-scratch
原文地址:https://www.941xue.com/content.aspx?id=1673
【欢迎大家加入[就是要学]社群】
如今,这个世界的变化与科技的发展就像一个机器猛兽,它跑得越来越快,跑得越来越快,在我们身后追赶着我们。
很多人很早就放弃了成长,也就放弃了继续奔跑,多数人保持终身不变的样子,原地不动,成为那猛兽的肚中餐——当然那也不错,在猛兽的逼迫下,机械的重复着自我感觉还良好地稳定工作与生活——而且多半感觉不到这有什么不正常的地方,因为在猛兽肚子里的是大多数人,就好像大多数人都在一个大坑里,也就感觉不出来这是一个大坑了,反而坑外的世界显得有些不大正常。
为什么我们不要做坑里的大多数人?
因为真正的人生,应当有百万种可能 ;因为真正的一生可以有好多辈子组成,每一辈子都可以做自己喜欢的事情;因为真正的人生,应当有无数种可以选择的权利,而不是总觉得自己别无选择。因为我们要成为一九法则中为数不多的那个一;因为我们要成为自己人生的导演而不是被迫成为别人安排的戏目中的演员。
【请注意】
就是要学社群并不会告诉你怎样一夜暴富!也不会告诉你怎样不经努力就实现梦想!
【请注意】
就是要学社群并没有任何可以应付未来一切变化的独门绝技,也没有值得吹嘘的所谓价值连城的成功学方法论!
【请注意】
社群只会互相帮助,让每个人都看清自己在哪儿,自己是怎样的,重新看见心中的梦想,唤醒各自内心中的那个英雄,然后勇往直前,成为自己想要成为的样子!
期待与你并肩奔赴未来!
QQ群:646854445 (【就是要学】终身成长)
【同步语音笔记】
https://www.ximalaya.com/keji/19103006/348196468
【学习过程屏幕录屏】
https://www.bilibili.com/video/BV1Fh411o7RX/