BTC.com手机客户端

中本聪:智能合约?比特币自带

达鸿飞 发布在 区块链,币头条,技术指南 30 9026

前言:写完给身边的程序员朋友看了下,85%表示IQ不够用,并且认为不会有正常人能读到最后一段。我只能说,尽力了。

1523049

 

如果你是中本聪

 

假如你是2009年的中本聪,你已经找到了解决双重支付的方法,现在要设计比特币的转账功能了。你会怎么做呢?我的设计方案会是这样:

发送方向比特币网络发一份广播,其内容是这样的:“从A地址转账1 BTC给B地址。同时附上A地址私钥的签名”。网络各节点收到广播,校验签名合法。于是从A地址扣掉1 BTC,给B地址加上1 BTC。

简洁明了对不对?我猜你的设计方案也许和我差不多。幸亏你我都不是中本聪。如果是这样的设计,那么比特币的潜力将大打折扣,我们也无法看到今天区块链领域的蓬勃生息。让我们看看中本聪的设计方案:

发送方向比特币网络发一份广播,其内容是这样的:“我要转账1 BTC,并且我能提供一段脚本,这段脚本作为钥匙可以打开这1 BTC上的锁;同时,我根据接收方的要求为这1 BTC加个新的锁”。

网络各节点收到广播,运行脚本,发现确实能“开锁”。于是根据发送方的指令给这笔比特币换上一把“新锁”,这笔比特币也就有了新的主人。当接收方想使用这1 BTC时,只要能提供一段新的脚本作为钥匙打得开这把新锁就行。

乍一看,中本聪的设计似乎非常繁琐和反直觉,然而这样的设计却大有道理。脚本是一种简单的计算机语言,比如JavaScript就是一种脚本。比特币的脚本可以表述的内容非常灵活,远远超出了一对一转账的范畴。例如:A可以约定必须由收款人B和担保人C同时签名才能支配某笔比特币(担保交易),也可以约定B、C、D中任意两人签名就能支配(联名账户);A可以约定B必须在一年后才能动用某笔比特币(延时支付),也可以约定任何人都能支配(撒钱)或者都不能支配(烧钱)。通过这套内置的脚本编程语言,你可以灵活地编写出各种各样的约定——而这其实就是简单的智能合约。用比特币脚本编写的合约系统,使得比特币成为了人类历史上第一种可编程的货币。

 

真正的中本聪是这么说的

 

2010年,当发现了比特币的内置脚本系统后,有人在bitcointalk上发帖表示了惊讶和不解:“比特币的脚本让我有点紧张,这过于复杂了,而复杂是安全的天敌”。此君不是别人,正是后来成为中本聪继任者的Gavin Andresen。中本聪是如此回复他的:

无标题

大意是说:我希望比特币在0.1版就能拥有稳定的架构,未来不需要再做底层改变。在过去几年设计比特币的过程中,我发现只有使用脚本系统才能完成我希望支持的各种复杂交易类型——担保交易连带合同第三方仲裁多方签名等等。

放在今天,也许中本聪会直接说:“比特币需要脚本,有了脚本,就有了智能合约”。

插个题外话。这篇帖子短短9条,却可以堪称区块链技术发展史上的一次重要对话。你会发现8楼有人问“比特币的脚本系统是不是意味着用户可以发行自定义资产?”。此人ID是bytemaster,后来其创立了可以发行用户自定义资产的比特股。9楼Gavin回复说:

“I don’t think you need scripts to do something like that. Just send a bitcoin to yourself, and then declare that transaction is the root transaction for My Valuable Asset.”

这恐怕是彩色币的概念第一次被提出。

 

比特币脚本的真容

 

说了这么多虚的,来点干货。现在请把你的大脑当做一台基于堆栈的解释器和虚拟机,看看比特币的脚本到底是怎么运作的。一个典型的比特币标准交易(Pay-to-Public-Key-Hash)的验证流程,需要执行这样的脚本:

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG
(scriptPubKey就是前文比喻的1 BTC上的脚本“锁”)
scriptSig: <sig> <pubKey> 
(scriptSig就是前文比喻的发送方A提供的脚本“钥匙”)

 

Snip20150924_27

 

脚本执行完毕后,如果结果为true,那么说明验证通过,A有权支配这笔比特币。比特币网络就会根据A的指示为这笔比特币加上一把“新锁”,转账完成。

 

比特币脚本的局限性

 

为了保持比特币的向前兼容和简单稳定,比特币的开发者们对其脚本做了诸多限制。比如脚本中没有循环语句,比如bitcoin core客户端目前只支持5种固定模式的脚本。这一方面是由于历史包袱,一方面是比特币的开发团队倾向于保守和稳健。

有的朋友可能知道我们正在开发一个用于登记、管理和交易股权的区块链协议——小蚁。小蚁复用了比特币的主要架构,其中就包括了脚本系统。在此基础上,小蚁参考了Gavin Andresen提出的比特币改进提案BIP12,增加了一条OP_EVAL指令。我们先来看看小蚁下的标准交易(Pay-to-Script-Hash)是怎么工作的:

scriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_EVAL
scriptSig: <sig1> <sig2> <redeemScript> 
redeemScript: OP_2 OP_3 OP_CHECKMULTISIG

Snip20150924_28

Snip20150924_29

 

比特币脚本 + BIP12 = 图灵完备

 

OP_EVAL指令的加入使得小蚁拥有了图灵完备的脚本系统,也就为更复杂的智能合约提供了可能。

图灵完备是指一个能计算出每个图灵可计算函数(Turing-computable function)的计算系统。或者说,图灵完备使我们的脚本系统有能力解决所有的可计算问题。一方面,它带来了强大的处理能力;另一方面,它也使对脚本的静态分析变为不可能:我们永远也无法知道脚本何时会停止,除非我们真正去执行它。

比特币网络中的每一个节点都要执行每一笔交易中的脚本,这就使得比特币脚本系统的设计需要足够精简。而作为一个点对点的电子现金系统,比特币也确实无需更为复杂的脚本系统。

小蚁采用图灵完备的脚本方案,并通过以下的两个方法来避免图灵完备带来的问题:

  1. 限制每个脚本可执行的步骤,一旦脚本的执行超过了限制,就立刻判定为验证失败。由于任何节点在广播交易之前会首先验证它,因此超出步骤限制的脚本不会影响到全网的所有节点。
  2. 对于执行步骤很多的交易,收取较高的手续费,从而减少通过构造复杂脚本来发动拒绝服务攻击的情况。

解决了图灵完备带来的问题之后,小蚁的脚本系统可以应用于以下的一些场景:

 

  1. 智能合约:对合约的条件进行判断,满足条件后自动执行合约条款,比如股权质押贷款;
  2. 更高级的权限管理:利用脚本来对参与签名的密钥分配权限,完成比m-of-n更精密的权限管理;
  3. 彩票:脚本可以配合小蚁区块中的强随机数,实现彩票功能;
  4. 其它:图灵完备意味着只要你能想到的功能都可以实现。

关于脚本和智能合约,就先聊到这里。如果对你来说这些太简单了,那么欢迎牛人加入小蚁团队,我们的官网是:https://www.antshares.com/;如果你想了解多一些区块链领域的创新和投资机会,请加入小蚁社群的QQ群:23917224。10月份小蚁的众筹方案会在那里第一时间公布。

 

作者:达鸿飞  张铮文
责编:洒脱喜
稿源:巴比特资讯

版权声明: by nc" sa 作者保留权利。文章为作者独立观点,不代表巴比特立场。

评论:30

您需要登录后才可以回复 登录|注册
    utootu33
    utootu33 281 天前

    中本聪:智能合约?比特币自带 http://t.cn/RyX9lwJ

    +1
    +1
    我要点评
    张铮文
    张铮文 438 天前

    回复@梦想与现实2012思考中:对于第一点,他凭一己之力不断换节点连接,用自己的带宽去挑战全网,是没有意义的,如果他能控制许多肉鸡,那可以发动更强的ddos攻击,没必要用这种方式;对于第二点,他确实付出代价了,虽然不是全网分享手续费,但是我们追求的不是公平,只是增加攻击的成本,换来全网的安全。

    +1
    +1
    我要点评

    回复@张铮文:第一 无效交易可以向多个节点进行攻击 攻击方可以不停尝试连接新的节点 第二 无法防止合法高运算交易带来的危害 我一次性付出高交易费 之后不断用这个输出生成大量交易 造成完全节点验证子交易时反复重新验证此复杂交易。这个是无法避免的缺陷。

    +1
    +1
    我要点评
    小蚁
    小蚁 439 天前

    你们觉得?看图我感觉更凌乱了//@独行巨蟹: 搞个类似这样的图就会容易理解一些。[微笑] http://t.cn/Ryo6YnI

    +1
    +1
    我要点评
    独行巨蟹
    独行巨蟹 439 天前

    搞个类似这样的图就会容易理解一些。[微笑] http://t.cn/Ryo6YnI

    +1
    +1
    我要点评
    LAn丶Ding
    LAn丶Ding 439 天前

    现在每天刷微博就是为了小智..感觉你给我们带来无穷的快乐!

    +1
    +1
    我要点评
    Joomla周朝晖
    Joomla周朝晖 439 天前

    不错!//@小蚁: 有我出镜[馋嘴]//@达叔达鸿飞:高能,墙裂推荐

    +1
    +1
    我要点评
    张铮文
    张铮文 439 天前

    回复@梦想与现实2012思考中:但是无效交易不会被广播,所以只能单点攻击,无法对全网造成影响。而且对恶意节点,拉黑就好了

    +1
    +1
    我要点评

    回复@张铮文:另外即便一个合法复杂脚本付出了高交易费 也只是对挖那个区块的矿池做出了补偿 但这个交易的输出的子子孙孙在被其他完全节点和矿工验证时 要无数次的做同样对的运算 付出的代价时不可估量的。所以不改变比特币的基本架构而引入循环和递归 结果必然是灾难。

    +1
    +1
    我要点评

    回复@张铮文:因为攻击者可以无成本地散布恶意脚本。比特币的协议规定只要脚本失败 那么交易就作废 攻击者无需付出交易费。所以恶意攻击者只要用高交易费散发一个无限循环脚本 就可以使得很多节点计算到最大步数后放弃。无论完全节点还是矿工都无法承受这样的无成本攻击。

    +1
    +1
    我要点评
    Shuai1988
    Shuai1988 439 天前

    没想到比特币还有这一手,本聪大神先知先验!//中本聪:智能合约?比特币自带 | 巴比特 http://t.cn/RyX9lwJ

    +1
    +1
    我要点评
    张铮文
    张铮文 439 天前

    回复@梦想与现实2012思考中:为啥不够?

    +1
    +1
    我要点评
    tuoniaopingshi
    tuoniaopingshi 440 天前

    【46路,916路、702路,844路、62路,562路分别合并】4月8日,46路今天与916路完成合并,916路撤销改为46路,原46路改为46区间;明天,702路公交与844路归并,终点站延至华阴路;而62路与562路公交车后天合并,取名62路;78路4月12日起延伸至山

    +1
    +1
    我要点评
    yuan_moving
    yuan_moving 440 天前

    //@我看比特币: 不过有点问题想探讨一下。比特币脚本没有循环和递归语句,因而叫图灵不完备,小蚁加上了OP_EVAL,并不能使脚本图灵完备。另外,图灵是否完备并不能说明某个脚本系统的高级与否,只看是否方便使用,更安全。因而以太坊在图灵完备这方面,不一定就比比特币脚本强。

    +1
    +1
    我要点评
    达叔达鸿飞
    达叔达鸿飞 440 天前

    OP_PUSHDATA {OP_DUP OP_EVAL} OP_DUP OP_EVAL 就能loop咯//@我看比特币:非常棒的想法和实践,支持一个!!!不过有点问题想探讨一下。比特币脚本没有循环和递归语句,因而叫图灵不完备,小蚁加上了OP_EVAL,并不能使脚本图灵完备。另外,图灵是否完备并不能说明某个脚本系统的高级与否

    +1
    +1
    我要点评
    小蚁
    小蚁 440 天前

    OP_PUSHDATA {OP_DUP OP_EVAL} OP_DUP OP_EVAL 用形似这样的脚本就可以做循环了

    +1
    +1
    我要点评
    潦源
    潦源 440 天前

    //@我看比特币: 非常棒的想法和实践,支持一个!!!不过有点问题想探讨一下。比特币脚本没有循环和递归语句,因而叫图灵不完备,小蚁加上了OP_EVAL,并不能使脚本图灵完备。另外,图灵是否完备并不能说明某个脚本系统的高级与否,只看是否方便使用,更安全。因而以太坊在图灵完备这方面,不一定就比

    +1
    +1
    我要点评
    我看比特币
    我看比特币 440 天前

    非常棒的想法和实践,支持一个!!!不过有点问题想探讨一下。比特币脚本没有循环和递归语句,因而叫图灵不完备,小蚁加上了OP_EVAL,并不能使脚本图灵完备。另外,图灵是否完备并不能说明某个脚本系统的高级与否,只看是否方便使用,更安全。因而以太坊在图灵完备这方面,不一定就比比特币脚本强。

    +1
    +1
    我要点评

    //@长铗:比特币脚本 + BIP12 = 图灵完备,小蚁了不起,比特币底层协议层面的创新。

    +1
    +1
    我要点评
    uncleZach
    uncleZach 441 天前

    85%表示智商不够用,果然够硬//@风一般的男纸:硬广[阴险]//@达叔达鸿飞: 高能,墙裂推荐

    +1
    +1
    我要点评
    Author Image
    ryan2326 441 天前

    了不起的中本聪,区块链太强大了,主链不搞脚本创新是对的,你们搞吧

    +1
    +1
    我要点评

    比特币脚本不包含循环和递归就是为了简单和确定性 由于线性执行 限制脚本长度即限制了执行步数。而一旦图灵完备 则无法判断终止与否和运行步数 必须增加复杂的防御攻击及费用计算。多数以太坊(Etherium)的争议就是围绕这个。本文中列出的两个方法是不够的。

    +1
    +1
    我要点评
    长铗
    长铗 441 天前

    比特币脚本 + BIP12 = 图灵完备,小蚁了不起,比特币底层协议层面的创新。

    +1
    +1
    我要点评
    He1l_Q
    He1l_Q 441 天前

    //@达叔达鸿飞: 高能,墙裂推荐

    +1
    +1
    我要点评
    独行巨蟹
    独行巨蟹 441 天前

    //@风一般的男纸: 硬广[阴险]//@达叔达鸿飞: 高能,墙裂推荐

    +1
    +1
    我要点评
    风一般的男纸
    风一般的男纸 441 天前

    硬广[阴险]//@达叔达鸿飞: 高能,墙裂推荐

    +1
    +1
    我要点评

    不出所料,IQ不够用[笑cry]

    +1
    +1
    我要点评
    小蚁
    小蚁 441 天前

    有我出镜[馋嘴]//@达叔达鸿飞:高能,墙裂推荐

    +1
    +1
    我要点评
    达叔达鸿飞
    达叔达鸿飞 441 天前

    高能,墙裂推荐

    +1
    +1
    我要点评
    巴比特资讯
    巴比特资讯 441 天前

    【中本聪:智能合约?比特币自带】 @达叔达鸿飞 前言:写完给身边的程序员朋友看了下,85%表示IQ不够用,并且认为不会有正常人能读到最后一段。我只能说,尽力了。http://t.cn/RyX9lwJ 2010年,当发现了比特币的内置脚本系统后,有人在bitcointalk上发帖表示了惊讶和不解……

    +1
    +1
    我要点评