区块链-第三章 比特币的运行机制-普林斯顿大学课程

3.1比特币的交易

把爱丽丝账户里17个币转给鲍勃:

交易1是铸造新币的交易,没有输入,只有输出。交易1的输出是向爱丽丝转移25个币。现在,爱丽丝想把一些币转个鲍勃,她就创造了一条新的交易,在交易中她必须明确指出要转出的币的来源(引用之前某笔交易),在这次的交易中,爱丽丝要明确收款人——输出的地址,在这个例子中,有两个输出,一个是转17个币给鲍勃,另一个是转8个币给爱丽丝自己。

区块链-第三章 比特币的运行机制-普林斯顿大学课程区块链-第三章 比特币的运行机制-普林斯顿大学课程区块链-第三章 比特币的运行机制-普林斯顿大学课程

从上图中可以看到,一个比特币交易分成三部分:元数据,一系列的输入和一系列的输出

元数据:这里存放一些内部处理的信息:包含这笔交易的规模,输入的数量,输出的数量,还有此笔交易的哈希值,也就是这个交易读一无二的ID。我们可以用哈希指针指向这个ID。最后还有一个“锁定时间”超时则交易不成立。

输入:所有输入排成一个序列,每个输入的格式是一样的。输入需要说明之前一笔交易的某个输出,因此它包括之前那笔交易的哈希值, 使其成为指向那个特定交易的哈希指针。这个输入部分同时包括之前交易输出的索引和一个签名:我们必须有签名来证明我们有资格去支配这笔比特币。

输出:所有输出排成一个序列。每个输出的内容分成两部分。所有输出的金额之和必须小于或等于输入的金额之和。当输出的总金额小于输入金额时,输出的总金额与输入的总金额的差额部分,就作为交易费支付给为这笔交易记录的矿工。每个输出都要和一个特定的公钥(地址)对应。

3.2比特币的脚本

每个交易输出不仅确定来一个公钥,同时指定一个脚本。脚本一个是输入脚本,一个是输出脚本。区块链-第三章 比特币的运行机制-普林斯顿大学课程

区块链-第三章 比特币的运行机制-普林斯顿大学课程

区块链-第三章 比特币的运行机制-普林斯顿大学课程


一个简单的脚本的例子:

区块链-第三章 比特币的运行机制-普林斯顿大学课程

       脚本的前两条指令属于数据指令,分别是输入脚本(包含在交易的输入项)中的签名和用来验证签名的公钥。一看到数据指令,系统就把它堆到堆栈最上面。首先,我们复制指令OP_DUP,这一步仅仅是将堆栈最上面的公钥复制,并置于堆栈最上层,下一个指令是OP_HASH160。该指令取得堆栈最上层的数据,并计算其哈希值,然后将结果再堆到堆栈最上层。当指令执行完成后,我们将堆栈最上层的公钥替换成公钥的哈希值。

区块链-第三章 比特币的运行机制-普林斯顿大学课程区块链-第三章 比特币的运行机制-普林斯顿大学课程

 接下来,我们还要在对战顶层再推送一些数据:此笔交易发送者指定的公钥的哈希值,以及对应的私钥,这样才可完成签名,取得资金。此时,堆栈顶部有两个数值,一个是发送者指定的公钥的哈希值,另一个是接受者想要取得资金时提交公钥的哈希值。

 这个时候,我们就要执行EQUALVERIFY命令了,这个命令是用来检查堆栈顶部的两个数值是否相等。如果不相等,就会抛出一个失败信号,并且停止执行脚本。假设其相等,也就代表着接收者使用的是正确的公钥。这条指令会移除堆栈顶部的两条数据,

时,堆栈还剩下两个数据:公钥以及签名。

区块链-第三章 比特币的运行机制-普林斯顿大学课程

我们已经证实接收者使用的公钥确实是交易里指定的公钥,但是现在我们要证明签名是真的。这时,使用OP_CHECKSIC指令。

移除堆栈里两个数值,然后用公钥来证实整个交易的签名是真的。

3.3 比特币脚本的应用

第三方交付交易:网上购物可以用第三方支付交易。第三方支付交易可以用“MULTISIC"(多重签名)来实现。爱丽丝并不直接付款

给鲍勃,而是发起一个多重签名的交易,并规定:三个人中有两个人签名之后,资金才能被支取。这三个人是爱丽丝,鲍勃与第三方

仲裁员。

区块链中一个出名的应用是智能合约,可以用技术手段强制执行合约。

3.4比特币的区块

比特币的区块链结构:

一个是把区块链联结在一起的哈希链,另一个就是区块内部的交易哈希值梅克尔树

区块链-第三章 比特币的运行机制-普林斯顿大学课程

区块头部的哈希函数必须以一大堆零开头才有效,区块头部还要包括一个矿工可以修改的“临时随机数”,一个时间戳和一个

点数(点数用来表示找到这个区块的难度)区块头部是在挖矿过程中唯一哈希值化的,所以要验证一个区块的链,只要检查区

块的头部即可。在区块头部唯一的交易数据是交易树的树根mrkl_root


区块链-第三章 比特币的运行机制-普林斯顿大学课程

每个区块的梅克尔树上有一个特殊的交易——币基交易(造币)

1.4年减半(奖励在每产生210000),目前为12.5个比特币

2.平均每10分钟产生一个区块,每产生2016个区块(2周)挖矿难度会改变

3.不存在“1比特币”这样的东西,最小的价值是0.00000001BTC(一个中本聪)

区块链-第三章 比特币的运行机制-普林斯顿大学课程

200913日,比特币的创始人中本聪在创世区块里留下一句永不可修改的话(coinbase中):“TheTimes 03/Jan/2009 Chancellor on brink of second bailout for banks200913日,财政大臣正处于实施第二轮银行紧急援助的边缘)。”当时正是英国的财政大臣达林被迫考虑第二次出手纾解银行危机的时刻,这句话是泰晤士报当天的头版文章标题。

因此我们可以在coinbase中存放信息,用于未来的检测,因为它是无法更改的。

3.5比特币网络

比特币运行机制:

1)新的交易向全网进行广播;

2)每一个节点都将收到的交易信息纳入一个区块中;

3)每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;

4)当一个节点找到了一个工作量证明,它就向全网进行广播;

5)当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;

6)其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值。

节点始终都将最长的链条视为正确的链条,并持续工作和延长它。

比特币网络是一个点对点网络。在比特币网络中,所有的节点都是平等的,没有等级,也没有特殊的节点,或所谓的主节点。它运行在TCP网络中,有一个随意的拓扑结构,每个节点和其它的随机节点相连。新的节点也可以随时加入。只要一个节点有三个小时没有音讯,就会慢慢被其他节点忘记。加入比特币网络是为了维护区块链,当我们发起一个交易的时候,要用”泛洪“的算法让整个网络知道,会有相应的机制防止其在网络中循环传播,浪费网络资源。

节点接收到一个新交易信息时,检验有四个关卡:第一个也是最重要的一个是交易验证,也就是验证交易在当前的区块链中是有效的,节点会针对每个前序交易的输出运行核验脚本,确保脚本的返回值都为真;第二,检查是否有双重支付;第三,节点会检查这笔交易信息是不是已经被本节点接收过;第四,节点只会接收和传递在白名单上的标准脚本。

校验区块的过程更加复杂,除了确认区块头部,确定里面的哈希值是在可接受的范围内,节点还必须确认区块里的每个交易。最后,一个节点往外传播的区块必须是最长的一条区块链上心加入的区块,只有这样才能防止区块链分叉。


简单付款验证(SPV

在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。(节点都是诚实的情况下)


3.6限制与优化

我们无法更改比特币的总体数量与记账奖励(更改的话变化太大),但是可以更改比特币的交易能力。修订比特币的协议可能会造成硬分叉和软分叉。硬分叉是指通过修订协议引入新的特性,可能会使前一版本的协议失效。即运行新版本协议的节点认为有效的区块,会被运行旧版协议的节点认定为无效,而不是所有的节点都会更新新的协议,老节点会认为其它的分支(在这个分支中,所有的新节点认为有效的区块都会被排除在外)才是最长,最有效的区块链分支,并一直扩展这个分支,直到它们更新了版本。软分支是指在修订中加入新的特性,让现有的验核规则更加严格。在这种情况下,老的节点依然会接收所有的区块,而新的节点会拒绝一些。这可以避免硬分叉所造成的永久分裂。运行新版协议的节点会使用一些更严格的规则。现在,假设绝大部分节点都会更新了新版协议并执行新的规则(这是软分叉的关键,因为老节点不会执行新规则,新节点的数量足够多才能够竞争最长的链)。这种情况下,老节点可能会挖到一些无效的区块——因为这些区块中包含一些在新规则下无法核验通过的交易,然后,老节点会知道它们核验有效的区块不被别的节点接收,这使得老节点的矿工会去更新协议。而且,如果老节点用它们的区块扩展了老节点的分支,那么,老节点也会转而扩展这个分支,因为是新节点验核通过的区块,老节点也必定能验核通过。