前面我们讲过,比特币其实本质上一套加密的分布式账本。传统的账本都是基于账户系统来实现的。 比如有两个交易方张三和李四,我们会分别为他们创建一个账户,并记录余额。如果他们两人之间进行转账,通常的也是采用复式记账的方式, 假设张三要给李四转账200元,则系统要做如下操作:

  1. 检查张三账户余额是否充足,如果不足200元就终止交易,向张三报“余额不足”
  2. 在张三账户里减去200元(假设零手续费)
  3. 在李四账户里增加200元

这种系统很常见,现在的银行也好、信用卡也好、证券交易系统也好,互联网第三方支付系统也好,其核心都是基于账户的设计,由关系数据库支撑。 通常都是通过数据库的事务来实现操作的原子性,保证转账的双方余额的变动是同时成功或者同时失败的。

但比特币没有设计成基于账户的系统,而是发明了 UTXO 方案。

UTXO

   UTXO 全称是 Unspent Transaction Output, 翻译为”未使用的交易输出”,它是中本聪的一项伟大的发明。 在比特币的账本体系中,其实没有”余额”这一说法的,它有的只是 UTXO, 所谓用户的余额不过是把他所拥有的 UTXO 全部加起来的总额。余额在比特币的中 只不过是一个抽象概念罢了。其实仔细思考一下你会发现比特币用 UTXO 来表示余额更贴近我们日常生活中的”现金”, 通常平时别人问你钱包里面有多少钱的时候, 你一般会先数一下你钱包里面有多少张100元,多少张50元的,多少张20元的… 然后你会把这些钱币加起来告诉他一个总额。那其实你钱包里面那些钞票就是 UTXO, 这也是中本聪为什么把比特币描述成”一种点对点的电子现金系统”。因为它的账本结构相对于我们现在的电子银行系统来说,更像现金。

   比特币的交易都是基于 UTXO 实现的。在比特币的区块链账本中存的是一笔又一笔的交易,每笔交易都有若干交易输入(资金来源), 也会产生一笔 或者多笔交易输出(资金去向)。那这里的输入和输出其实都是 UTXO 了。

比特币的交易遵守几个规则:

  1. 除了挖矿( coinbase 交易) 之外,所有的资金来源都必须来自前面某一个或者几个交易的 UTXO,你可以把它理解成一个特殊的链表。
  2. UTXO 是交易的最小单元,不嫩再分割.
  3. 任何一笔交易的交易输入总量必须等于交易输出总量,等式两边必须配平.
  4. 比特币种没有余额概念,只有分散到区块链里的 UTXO.

随着钱从一个地址被移动到另一个地址的同时形成了一条所有权链,像这样:

智能合约

  很多刚刚入门区块链的人都以为智能合约是以太坊的发明,其实智能合约是比特币的另一个伟大的发明。事实上,比特币的交易就是通过智能合约 完成的,在比特币中称之为”交易脚本”.

  比特币交易是首先要提供一个用于解锁 UTXO 的脚本,这也叫交易输入,交易的输出则是指向一个锁定脚本, 这个脚本表达了:谁的签名能匹配这个输出地址,钱就支付给谁。同城解锁用的私钥,而锁定则用的是交易对手方的公钥。

每一个比特币节点会通过同时执行这解锁和锁定脚本(不是当前的锁定脚本,是指上一个交易的锁定脚本)来验证一笔交易,脚本组合结果为真,则为有效交易。

当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真

这里顺便说下,比特币脚本语言包含基本算数计算,基本的逻辑运算,报错以及返回结果和一些加密指令,不支持循环,所以它是非图灵完备的,能做的事情 非常有限,后来以太坊针对这个问题找到了更好的解决方案,开发出了支持图灵完备语言的以太坊虚拟机(EVM), 使得它的智能合约的功能大大增强了。

脚本语言通过从左至右地处理每个项目的方式执行脚本。

下面用两个图说明下常见类型的比特币交易脚本验证执行过程:

上图为解锁脚本运行过程(主要是入栈)

上图为锁定脚本运行过程(主要是出栈),最后的结果为真,说明交易有效。

比特币这种使用脚本来发送和确认交易的方式其实就是智能合约的雏形,也是比特币能够去中心化的重要原因,因为交易的规则写在脚本里面, 每个节点都能很轻易的根据规则去验证交易。