![0d813101d97a8762bd116b6b84eada77.png](https://i-blog.csdnimg.cn/blog_migrate/4d28766ba6a63d32c3bb169506ff6bb7.jpeg)
很久没有写东西了,这阵子利用空闲时间做了一款简单却又应用的dapp,在这里分享下设计的理念和大致逻辑,希望读者能从中体会到智能合约是如何运作的。
起因
常言道,守币难如守寡。我很看好以太坊,自认属于ETH的长期持有者,但我自制力又不太好,每当看到币价下跌时,总是想忍不住止损,涨了一些时又想卖掉。哪怕理性上认为应该长持,但还是忍不住操作,结果事实证明我并没有短线操作天赋……
还有一点非常不好的是,心情会受到币价波动影响,并且频繁关注短线操作极度分散注意力,浪费精力。
![dde3dade0b627596cd45d53b88b66675.gif](https://i-blog.csdnimg.cn/blog_migrate/22b57d793d8bedad21b056a35a08f675.gif)
所以,我发现自己需要这样的一个应用:
- 把ETH锁进去,价格不超过目标,就动不了。
- 为了避免目标价格定得太高,导致ETH永远取不出来,得有个截止时间,只要到了这个时间,也能取回来。
这个应用,还得保证绝对的安全:
- ETH锁进去,任何人都不能动,只能满足解锁条件,自己取出来。
- ETH价格的数据得是真实的,去中心化的,不能由第三方控制。
![fe26588763a675994756b31d3ac9ff18.gif](https://i-blog.csdnimg.cn/blog_migrate/e2dee0be412e162d6611149e3778ee60.gif)
所以,我开发了一个以太坊智能合约应用,刚好满足了以上需求~
实现
在合约中,设计了一种完全符合ERC-721标准的代币,叫MoonBox。它就像大话西游里的月光宝盒那样,可以让你的ETH穿越时空,直到你想要的位置。
// 这里定义了MoonBox合约遵循ERC-721标准。 // ERC-721:以太坊非同质化代币,每一个代币都具备独特的属性,并且可以像普通token一样自由流通。加密猫就是一种最出名的ERC-721代币。 contract MoonBoxs is ERC721 {}
![570f35ff11104f9d879cd07597251ef1.gif](https://i-blog.csdnimg.cn/blog_migrate/c052ddd8ddaf253fbbd910f35702d292.gif)
1.创建宝盒
调用合约的创建功能,把任意数量的ETH存进去,并设置好可以打开盒子的ETH价格,以及截至时间。这样就可以创建一枚独属于自己的ERC721代币。
![f994d9d5e7f346e046bb10e92f0eea8a.png](https://i-blog.csdnimg.cn/blog_migrate/923d7a7dff51ecfd97d832e96add1cd5.jpeg)
创建宝盒后,就能看到属于自己的宝盒的信息了。可以创建多个,还能把宝盒发送给其他人。
![0defa0672148fe15556c86752f4fe302.png](https://i-blog.csdnimg.cn/blog_migrate/8cc9589f3c910e1ca5902f03b3f1511a.jpeg)
2.打开宝盒
接下来,在请求打开宝盒时,合约如何判断当前真实价格呢?我引入了Uniswap合约的ETH-USDC交易对的实时报价接口。
Uniswap是用于在以太坊上进行去中心化token交易的智能合约。它的设计理念由以太坊创始人V神提出,提供了当前各种以太坊上token之间交易价格的读取接口,是目前链上唯一安全可信的去中心化价格预言机。
contract ETH_USDC_UNISWAP { function getEthToTokenInputPrice(uint256 eth_sold) public view returns(uint256); }
可以通过以太坊区块浏览器 https://etherscan.io/address/0x97dec872013f6b5fb443861090ad931542878126直接调getEthToTokenInputPrice接口,输入ETH数量,就会返回当前值多少USDC,感兴趣者可以体验下。
好了,现在有了靠谱的价格数据,可以实现打破宝盒的功能了。当请求打破某个宝盒时,依次进行以下判断:
- 首先这个宝盒得属于请求者本人。
- 宝盒里的ETH数量得大于0,不能是空的。
- 通过Uniswap读到现在的价格大于开箱要求的价格,或者当前时间超过开箱要求时间。
条件都符合,宝盒里的ETH就会全部取回,宝盒会被销毁掉。
PS: 如果想保留宝盒,可以调用“openBox”打开宝盒,判断逻辑一样,但宝盒会保留下来作为纪念,不过打开宝盒会给我0.1%的手续费,嘿嘿。
以上就是月光宝盒合约的核心逻辑,通过这个合约,我可以把部分想要长持的ETH定到10000才能取出来,时间定到几年后,这样这些币再也不用操心了~部分追高被套的币,我可以分批定到解套的价格就拿出来卖了。
看起来,还真是个不错的资产管理工具呢~
![29dfe25e56b35d6d8a213074207c4f84.gif](https://i-blog.csdnimg.cn/blog_migrate/91a9e559611c27077afefc225e859aff.gif)
安全性
合约源代码已通过etherscan的开源验证,任何人都可以查看。可以确定没有任何后门、漏洞。
但是,按照以上描述的功能,你能想到使用这个合约可能存在的风险吗?
首先,ETH丢失的风险是不存在的,ETH只有宝盒被主人打开才能取出来,没有其他可以转账的功能。
但有一种可能,Uniswap交易合约出了问题,报价不真实,那么可能出现实际ETH价格已经到了,但Uniswap报价却不到,甚至是读不到价格。
为了解决这种可能,我预留了一个权限,可以更换ETH报价合约地址,这样一来,如果uniswap合约更改了,宝盒合约也能及时更换到新地址。
但是这样一来,理论上有一种可能,就是我故意把价格接口改成一个错误的地址,这样所有宝盒都只能等到预设的截止时间才能打开。
虽然这样只会让用户多等待一些时间,对我来说没有任何好处。但是,还是得把所有可能的风险都扼杀在摇篮里~
所以,修改报价接口那里,我加入了一周的缓冲时间,一周后修改才能生效。
在缓冲时间内,所有人都可以看到新的地址,并且可以使用“退出”功能,强制打开箱子,取回所有ETH。
这样一来,真的是100%的安全放心~
![14409dd80a945f81de6613b2320a14c6.gif](https://i-blog.csdnimg.cn/blog_migrate/b40b4b24aaf616fecb136ec112c68cfc.gif)
总结
通过对这个智能合约的介绍,相信你应该get到了智能合约的核心特征:
- 安全可信。合约发布后就不能修改,并且通过开源,可以自证清白。通过合理的逻辑设计,可以实现100%的资金安全。
- 自主运行。合约不需要开发者再去维护运作,放在区块链上就会自动生效,用户直接调用就行了。
- 可组合性。智能合约之间可以相互调用,进行功能组合,拥有无限的可能。比如MoonBox合约的实时价格数据就是来自于Uniswap合约。
如果觉得这个锁仓理财dapp对你有帮助,欢迎体验,地址是https://moonbox.ethapp.me/
题外话:欢迎做区块链/Defi类应用的同行们私信交流,凌冬已至,需要抱团~