左耳听风_068_67_区块链技术细节智能合约
你好,我是陈浩网名猪耳朵耗子。
今天这节课呢我们来讲一讲智能合约,要讲清楚智能合约呢,我先给你看几个案例。
那第一个案例呢是打赌,比如说张三和李四打赌,周末拜仁和皇马的足球比赛谁会赢?那如果拜仁赢了,张三给李四一百块,那如果反过来呢,李四就给张三一百块。
那如果打成平局呢,则不赢不输。
那张三和李四都怕对方不认账,所以呢他们就需要找一个他们都信得过的人来做公证,两个人都把一百块钱给这个公证人。
然后如果半人赢了,公证人呢,就把全部两百块给李四。
那如果皇马赢了,则全部给张三。
那如果是平局呢,则分别退还一百块。
文中呢我画出了这个模型的示意图,那这个模型什么都好啊,就是有一个问题,就是这个工证员跑路了怎么办?因为他们只赌一百块,工人人犯不着为这两百块跑路。
但是如果有一万人把赌金交给公证人呢,那如果张三李四的赌金是一百万呢,那公证人的人性呢会受到极大的挑战,那他还有那么可信吗?也就是说呢,当业务大到一定程度的时候啊,个人的信用是不足以来当中间公证人这个角色的那这个时候呢你需要找更为靠谱的机构。
那这个机构叫做银行,银行的信用等级啊,至少在这样几方面要比个人高。
那首先呢,银行是机构,所以受政府监管,受法律约束。
那其次呢,银行的钱很多,就算是里面有员工作案,银行呢也赔得起。
那另外呢就是银行里啊有比较安全的资金管理流程和措施。
所以银行的授信程度就很高,可以来做担保。
那接下来呢我们来看一个例子啊,就是银行在二手房交易中的资金托管业务。
因为房屋交易的时候,涉及到的资金数目太大买家,怕交了钱之后,卖家不过户。
那卖家呢也怕过了户之后啊,买家不给钱。
而一般像链家或者我爱我家这样的房屋中介呢,是没有能力来做大额交易的担保的那于是银行就出来了。
买家呢先到银行开一个户,把购房款全额存进去。
那这个账户和一般的账户不一样,这个呢叫做资金托管账户。
钱一旦进入之后啊,你就取不出来了啊,除非你满足了某个条件。
那在开户的时候呢,房屋的买卖方和银行三方约定,一旦房产证从卖家过户到买家三十天之后呢,没有纠纷,那钱呢,就划给卖家了。
那具体的过程呢,你看文中我画的图啊可能会更容易理解。
那这个其实跟在淘宝上买东西,差不多,买家把钱转给支付宝。
然后买家确认收到货之后呢,在支付宝上点确认,那钱呢,就划给商家了。
那唯一不一样的是啊,支付宝没有资格担保向房屋交易这么大交易金额。
那这个呢是国家为了防范相关的金融风险所采取的措施。
那接着呢我们再来说一说以太坊的智能合约。
对于以太坊来说啊,智能合约其实就是一段可执行的程序。
片段由发布人使用一种类似于javascript或者python的编程语言来编写。
就像最开始的那个民间担保的案例一样。
合同的发布呢可以写成文中这段代码的形式嗯,合同都要用代码来写了。
看来呢我们程序员离统治世界又近了一步。
我们把合约代码在本地编译成功之后呢,发布到区块链上,就可以理解为是一个特殊的交易,然后呢就会被矿工打包记录在某一个区块当中。
那当需要调用这个智能合约的方法的时候呢,只需要向这个智能合约的地址发送一笔交易啊就可以了。
那每个节点的电脑呢都需要安装以太坊客户端。
那客户端里面呢自带了一个和JVM类似的一个EVM.那通过交易触发智能合约之后呢,智能合约的代码呢就会在EVM中执行了。
那这种方式相当于把程序部署到了非常非常多的电脑上,随时呢都可以通过交易来触发这些智能合约的执行,从而呢也就完成了分布式程序的部署和调用。
你来看文中这个示意图,那这个感觉啊就是function as a service的一种实现啊。
那如果人与人之间的交易条件就像代码一样严格的执行,你觉得这个世界会变成什么样呢?是不是会少一些无赖,少一些扯皮,多了很多效率,多了很多确定性呢?我们再来看一个国际贸易的流程。
假如中国某一个出口商和美国一个进口方做生意,那就会遇到货币不一样的问题。
那如果没有货币兑换呢,那就只能通过大家都认可的黄金交易了。
你给我发一船货啊,我给你发一船黄金,那风险也高,交易的效率啊也非常低下。
那如果有银行在中间协调,比如说中国的某一个银行啊和美国的某一个银行签了互信协议。
那么国际贸易的银行担保流程呢,就会是文中这幅图表示的这个样子。
那首先呢出口商和进口商签订买卖合同,呃,然后呢美国的进口方到美国银行那边呢申请信用证,信用证呢需要用钱来开的啊,也是有价格属性的。
比如说两百万美金的信用证呢,就需要用两百万美金来申请美国的银行,向中国银行开具信用证。
那中国银行呢,根本不关心进口方有没有把钱给了美国银行。
反正你开了两百万美金面额的信用证,我以后呢是要问你要钱的那中国银行收到信用证之后呢,给出口商发出通知,信用证啊告诉他可以发货。
接下来出口商发货,有相关的承运人,从中国把货运到美国,然后呢,中国出口商把提货单交给中国的银行。
那中国的银行就向美国的银行发出记单索汇业务。
那美国银行收到提货单之后呢,通知进口方到单,那进口方就把货款的钱补完。
比如说补了三百万美金,赎回提货单,然后美国银行呢向中国银行付款,最后啊美国的进口方到承运人那里提货,看一看这个过程如此的复杂,而且呢很机械感觉完全可以用程序来实现。
那如果用以太坊的智能合约来写一下,那这段代码会写成什么样的呢?好像可以写的很简单,第一步呢进口方把钱垫到区块链之上。
那第二步呢,出口方啊,也就是发货方发货。
那第三步呢,进口方验货之后,钱呢就到了出口方。
当然呢还有一些细节也需要写在程序当中,一个是进口方的钱垫到区块链上,就需要被冻结掉。
另外还需要物流信息,不然进口方说没有收到,不好验证,但是物流信息要是造假怎么办?那另一个呢就是需要把进口方验货的标准给写出来。
那代码不知道条件怎么满足,也许需要进口方那边点个确认。
那如果不点确认呢,就有一个过期时间,时间一到就自动确认。
那另外如果进口方觉得有问题,需要退货啊,或者是需要重新议价,那么就需要有相关的关联合同。
这其中比较难办的是第二步啊,需要有其他方也进入区块链。
那如果不进来呢,这事儿就不好玩了。
但是物流信息怎么才能做到真实可靠呢?需要双方选一个都相信的中心化的物流公司,还是我们搞一个去中心化的物流公司呢?去中心化的物流公司是个什么形态?你能想象的出来吗?啊,我是真想象不出来。
另外啊我们也要小心智能合同,有程序的地方呢就会有bug.现实生活中会有bug,合同啊也会有bug.出现了bug之后呢,大家可以相互协商,给合同打补丁。
但是代码合同呢就不一样,就算是bug也会被残酷无情的执行,那一旦执行了就很难补救了。
那最著名的例子呢,就是以太坊的一个叫做ZRDAO的应用。
那它是一个去中心化的风险投资基金,以智能合约的形式运行在以太坊区块链上。
那他也是一个盈利性的去中银化自治组织。
他利用自己掌控的以太币资金,通过投资以太坊上的应用的方式,给他的成员创造价值。
在在DAO的创建期呢,任何人都可以向他的众筹合约发送以太币获得DAO代币。
因为在DAO这个程序写的不好,黑客在他的智能合约里找到了bug,把所有的钱呢都给调走了啊,大约有七千多万美刀,那这就成为有史以来最大宗的数字结案,而且FBI也找不到人。
那这个项目因为钱被偷走而倒闭之后呢,引起了以太坊的强行分叉,变成ETH和ETC.那关于技术细节呢可以参见它的漏洞分析文章。
那整个事件的始末呢,也可以参见彭博社深度还原则DAO大劫案始末。
这篇文章我在文中呢把链接都给你了。
还有一个案例呢是二零一七年发生的智能钱包paroity被盗事件。
他号称自己的智能合约呢,被很多很厉害的安全人员审查过都认为没问题,但最后呢还是被黑客利用了。
一个叫做unit t wali的函数,反复调用它啊,转走了三千万美金。
老实说呢,我觉得任何合同呢都是会有bug的啊,无论是在现实生活中还是在代码中,那唯一的不同呢就是现实生活中的合同出现bug可以自行协商解决,也可以通过法律或者仲裁的方式来解决。
但是在数字社会中呢,代码无论好坏啊,都会被计算机残酷无情的严格执行。
有时候当你是利一方的时候呢,你会觉得这是好事儿。
但有时候你是受害方的时候呢,你还是会享有挽回的余地。
那现实生活中可以做到,但我不知道代码世界中的合同啊如何解决这些bug.所以呢还是不要叫智能合约,至少现在啊还不是。
那文末呢我给出了区块链技术系列文章的目录,希望你能在这个列表里啊找到自己感兴趣的内容。