什么是SMT?
这是官网https://smartmesh.io 对SMT的介绍,可以简单了解一下。
SmartMesh是物联网基于区块链的底层协议
SmartMesh具有嵌入式区块链节点,并且扩展了Raiden和Lightning Networks的第二层架构网络协议
允许无互联网数字支付和交易
利用基于区块链的令牌激励机制,SmartMesh技术可以形成灵活的
分散式的网状网络,可以进行自我修复,并且具有比标准互联网连接更高的近场速度和带宽。
SmartMesh允许区块链将互联网边界突破到万物互联的物联网(IoT)和物联网(IoE)时代。
听起来好像很厉害的样子?嗯,他们也有自己的SMT币
我不听我不听我不听,我买不起币,你别跟我说这个……
什么是智能合约?
在前面的文章中,我写了智能合约的漏洞,那么什么是智能合约?
有的同学可能没有接触过,看得一头雾水。
好了,这里我不用再强调了吧?这个是考试重点,做好笔记。
智能合约”(smart contract)这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:
一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。
你看懂了吗??反正我是没看懂!
没看懂不要紧,我们来看看一个比较好理解的例子:
我们在淘宝买东西,一般是付完钱,等着收货,整个过程就算完结了。
我们经历了这么些步骤:
提交商品订单,支付完成
淘宝核对订单,核对支付金额
淘宝确认金额无误,商家开始备货
商家发货
客户收货
我们发现,这些操作,基本上都是通过网络来实现的,这就好像是我们和淘宝签了一个合约:
只要我付给你钱,你就给我发货,不许耍赖。
智能合约本质上就是一段代码,它运行在区块链网络中,具体的合约代码业务功能由用户来实现。
合约代码一旦部署到区块链网络上,则不可修改,所有的节点会同步该合约代码。
所以一旦智能合约代码出现漏洞,造成的损失是不敢想象的,一想就破产了!
以太坊支持4中智能合约编程语言:
Solidity,类似Javascript
Mutan, 类似Go语言
LLL, 类似Lisp
Serpent,类似Python
更详细的了解,可以自行Google/Baidu,遇到不懂的肯定是要自己先查资料哦,养成习惯。
溢出代码实现
在之前的文章中,只用文字说了溢出的结果
定义变量uint8 a
a的取值范围是0到255
当a=255,我们对a加 1,a会变成 0。
当a=255,我们对a加 2,a会变成 1。
当a=0,我们对a减 1,a会变成 255。
当a=0,我们对a减 2,a会变成 255。
这里以代码来演示。
实现代码
分四步走
1.uint8上溢出
函数返回结果
2.uint8下溢出
函数返回结果
3.uint256上溢出
函数返回结果
4.uint256下溢出
函数返回结果
注:uint默认是uint256
SMT智能合约漏洞
出现漏洞的合约代码
注意看第三行
其中我们可以看到:
_feeSmt=8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff(十六进制)
_value=7000000000000000000000000000000000000000000000000000000000000001(十六进制)
将两者的十六进制转为10进制
所以
_feeSmt=65133050195990359925758679067386948167464366374422817272194891004451135422463(十进制)
_value=50659039041325835497812305941300959685805618291217746767262693003461994217473(十进制)
两者相加的Solidity代码实现
执行结果,两者相加为0
而转账人balances[_from] 肯定是大于等于0的。
所以 if(balances[_from]
那么就不会执行后面的revert()函数
revert是不可能revert的,这辈子都不可能revert的!
也就不会执行回滚操作,进而执行后面的转账代码。
好了,今天的课就到这里了,我舍不得你们走,你们点个赞再走好不好?
如果有疑问欢迎在公众号留言。
参考
https://solidity-cn.readthedocs.io/zh/develop/introduction-to-smart-contracts.html
领取专属 10元无门槛券
私享最新 技术干货