智能合约代替OTC市场

Posted by 土猪 on December 10, 2019

研究区块链好久,我觉得它最能区别和颠覆传统中心化系统的地方就是智能合约,没有这个东西,区块链的价值要大大缩水。 我把智能合约想象成是一个可以信赖的中介公司,我们应该争取用智能合约替代目前的各种中介公司,年初,我想了个系统,用智能合约来做买卖数字货币的中间经手方,有点类似目前的支付宝和paypal。 买家发出买币的订单,这个订单被卖家拿去,那么买家的稳定币就被放到智能合约当中,直到卖家把币打到买家账户,被买家确认后 ,这些稳定币才会从智能合约中释放给卖家。 如果是有人要卖数字货币,发出卖单后,被买家拿了这个订单,买家的稳定币就被打到智能合约去,直到买家确认收到数字货币,稳定币才被释放到卖家的账户上。

这是个很有意思的系统,经过哥一手开发,调试和测试通过,放到了我个人的github上上,现在又有些淡忘了,所以想在一个新机器上复现所有过程,把这个过程记录下来,以后有类似需求,可以照葫芦画瓢,少死很多脑细胞。 我觉得这个就像youtube上很多人教别人怎么自己铺地板,做fence和怎么做饭是一样的道理,没有很深奥的技术含量。

在试验网上需要有两个合约,一个是作为买卖中介的智能合约,另外一个是模拟现实中的稳定币合约。 稳定币合约很好搞,在这里有完整的,经过检验的代码可以复用。 我导入了其中的ERC20的代码,ERC20是目前几乎所有运行在以太坊上的如USDT,USDC,DAI之类稳定币的合约标准,主要定义了代币的名字,代码,小数点(因为以太坊的虚拟机不支持小数计算,所以合约需要对此进行处理),代币转移规范,允许某人使用合约中多少代币等。 我把这个模拟稳定币的合约放在这里,这里不完美的地方就是把小数点设置成18位,实在过于精确了,后来看到一般稳定币设置成6就可以了,这里可以看到USDT的合约代码供参考,没办法,土澳待久了,这里特色就是over engineering。 稳定币中其实我最欣赏两种,一种是索性真的有传统银行1对1 美元兑付的,比如USDC,还有就是完全去中心化的,如DAI。 所以我给我这个试验网上的稳定币取名’USDC’。

实现买卖中介的智能合约,是我一块块砖砌起来的(build from scratch),我虽然很懒,不喜欢从头造轮子,但是我实在找不到满足我要求的轮子,而且我做梦都想做个东西出来看看什么样子,最主要的,我在telegram上遇到一个自称是Daniel Larimer的骗子,对我这个想法赞不绝口,所以我很想做出来,等到我做出来后,才如梦方醒,觉察到那是一个骗子,当然,像我这样的人,他当然没有从我这里骗到钱。 合约中引用了IERC20.sol,这是ERC20的接口合约,我的想法是以后可以使用所有基于ERC20规范的稳定币。 还引用了Ownable.sol,希望在不需要这个合约的时候,所有者可以销毁它,以免放那里浪费公共资源。 但是现在回想起来,只是目前一个典型的智能合约不去中心化的失败之处,合约所有者居然可以为所欲为!

这个买卖中介的合约最主要的就是要对稳定币合约进行操纵,要做到这一点,只要把稳定币合约地址作为参数传进去就可以,在买家发出买单的时候,它就需要调用稳定币的approve函数接口,允许把买入市值的资金转入这个智能合约,这是所有满足ERC20标准的币合约的函数接口,意图在于批准可以把一定数目的币从某个地址转到另外一个地址的能力。 然后买家需要调用本合约的’buyOrderSent’函数,将一定数目的稳定币转入到这个中介合约中,同时需要记录下买家押金信息在_deposit[msg.sender]中,如果不记录下来,这个合约很容易被别人一分钱不花就黑掉,这个我将在下文介绍如何黑它的几个途径,我又如何防范。 当买单被确认收到货物(或数字货币)后,’buyOrderConfirmed’被调用,中介合约把钱转给卖家,同时更新_deposit变量,题外话一下,很多人说usdt是免费的,其实不然,它会偷偷给你收费的。 关于卖单处理,也是大同小异,再说就嫌烦了,比如我们部分有个人,我就不敢问他问题,他说起来滔滔不绝,最低消费半小时,听到我想吐,是真的想吐,于是理解了‘大话西游’里唐僧的感受。

有些费脑筋的原理部分介绍完了,简单不? 接下来就落入俗套的分步进行式了。 要编译,部署和测试这个智能合约,我们从一个仅带操作系统的机器开始安装。

第一步,要安装nodejs,因为整个编译,调试和部署,甚至测试平台基于Truffle框架,而truffle框架安装需要nodejs;

第二步,安装truffle框架,npm install -g truffle;

第三步,安装ganache,这就是一个以太坊区块链模拟器,安装后,上面会自动给你分配十个账号,有足够多钱供你玩,当然,你也可以通过MetaMask发布到以太坊主网或者测试网去,那不是速度慢吗,主网不是要烧钱吗?测试网给的银子也少。 按下“quick start”,一键到位,它会给你创建10个账号,每个账号100个以太坊,够你玩的了吧。

当然,你也可以不安装ganache,Truffle框架自带了一个叫做’Truffle Develop‘的以太坊区块链模拟器。

第四步,安装openzeppelin模块, 这个有些讲究,特别在windows系统,几个月前是不需要如此操心的,现在不同了,具体如下,到github的openzeppelin上去,下载并解压openzeppelin-solidity, 然后新建一个叫做’node_modules’的目录,把这个目录名放到windows的path环境变量里去;

第五步,编译和部署两个智能合约,分别到稳定币合约和中介合约的根目录下,执行: truffle compile 的编译过程,这是把.sol的文件转化成字节码和生成ABI(Application Binary Interface)的工具,这个编译器的版本可以在truffle-config.js中配置。

编译之后就是部署(deploy)智能合约到区块链上,具体部署到哪条链上,这个是由truffle-config.js配置,我是部署到ganache上去。

到ganache上把两个合约配置文件都放到workspace中,这样看起来更直观:

分别运行每个合约的 truffle migrate 就可以了。记住稳定币的’contract address’ 是’0x0018204bBFf3A1477a79023757B0175D5ad8f4A5’,这个在接下来的测试时候需要用到。

在模拟区块链上看到已经部署了稳定币了。

第五步,怎么证明这个合约好使呢,写个界面来证实它? 那多麻烦啊,写界面可不是我的擅长,我本来还想找我一个同事帮着写,可惜他最近太忙了,我们就要谈谈最

尽管如此,我还是要谈谈测试的事情,其实测试是非常重要的东西,测试的思想贯穿于整个开发过程中,这就是传统瀑布式开发和现在流行的agile模式的本质区别,也是test engineer 和Quality Assurance Engineer的本质区别。 在做这个智能合约的时候,就要想到以后应该如何测试,用户会如何使用,我觉得有个说法很有道理’put myself in your shoes’,或者叫’同理心’。

测试设计了三个以太账户,一个账户发出买单或者卖单,另外两个用户去take orders,并且把数字货币(或者实物)给发出订单的用户并且得到确认。 然后在设计的时候,需要认真考虑到如何hack这个合约。 我想另外发一篇文章来结合这个项目谈谈我的看法。 公链上智能合约的一个最大问题就是如何防止被黑。

测试文件写好后,测试过程很简单, 把’TestAgent’文件里买卖两个地方的稳定币地址改掉: var USDC_ADDRESS = ‘0x0018204bBFf3A1477a79023757B0175D5ad8f4A5’;

然后运行测试: truffle test

我们可以看到测试通过。 其实在做的时候并没有这么简单,测试过程需要跟调试过程反复进行,truffle framework提供非常好的调试工具,调试最大的麻烦在于transaction hash的寻找,所以最好设个断点,这样不会产生太多transaction让人头晕目眩。

更多区块链文章:


支付宝打赏

您的打赏是对我最大的鼓励!