比特币开发指南 - 区块链
区块链
区块链
提供了比特币的公开总账本
,
这个总账本
由所有有时序的
已确定的交易
组成。这个系统被用于防止
双花
和修改以前的交易记录
,
通过
被全球
P2P
网络验证的
工作量证明POW
来
保证全球的一致性
.
区块链概览
上面的
插图展示了一个简化版本的
区块链
.
一个包含一个或者多个交易的
区块
会被收集到区块的交易数据部分
.
每个交易的副本都会被哈希,然后将哈希值进行配对,然后再进行哈希,再配对,再哈系
,直到只
剩下一个哈希值,这个剩下的哈希值就是
Merkle tree(Merkle
树
)
的
Merkle root(
根节点
)
。
Merkle
根节点
被存储在
区块头
.
每个
区块
也会存储上一个
区块
头的哈希值
,
以
把所有的
区块
链接在一起
.
这保证了在不修改当前和后面的所有区块的情况下,交易记录是不会被修改的。
交易记录也被链接在一起。比特币
钱包
软件只记录了比特币的发送接收
,
但
比特币
确实在交易间转移。
每个
标准交易
花费的
satoshis
是前一个交易转移过来的币
,
所以一个交易的
输入
是上一个交易的
输出
。
单个比特币交易能把
比特币
发送到不同的
输出
中
,
就像你把比特币一次发送到不同的地址一样,但是一次输出在区块链中只能使用一次
所有的后续引用都禁止双花
—
一种把比特币花两次的尝试。
输出不同于
比特币
地址
。你可以在多个交易中使用同一个
地址
,
但是
输出
只能被使用一次。
输出
与
交易id(TXIDs)
绑定
, txid
就是签名交易的哈希值
因为每个交易的
输出
只能被使用一次
,
所有在
区块链
中的输出能被分类为
未使用交易输出Unspent Transaction Outputs (UTXOs)
或者已使用
输出
.
为了让支付有效
,
必须使用
未使用输出UTXOs
来作为
输入
.
比特币在产生交易之后,不能留在
UTXO
中,
否则这个余额会永久的丢失掉
,
所以输入和输出之间的差值就是交易费,都是对把这个交易打包到区块的矿工的奖励。例如,在上面的插图中,每次交易收到的都比发出的会少
1000
聪
,
这
10000
聪就是交易费
Proof Of Work
工作量证明
区块链
是由
P2P
网络
(peer-to-peer network)
协作维护的
,
比特币网络要求在创建区块的时候要提供一定的工作量证明,以保证那些想改变历史区块的不诚实的节点必须付出比那些仅仅想在链上加一个新区块的诚实节点更多的资源。
如果不修改后面所有的区块,修改已经打包到区块中的交易成为一件不可能的事情,这也是把区块链接到一起的用处。
因此,修改一个区块的费用会随着新区块的增加而增加,工作量证明的作用也就随之变大。
比特币网络中的工作量证明利用了密码学哈希算法的伪随机性。一个好的密码学哈希可以把任意的数据转换成一个看起来随机的数字。如果这个原始数据的任何地方被更改,然后重新计算哈希,将会生成一个完全不同的新的哈希结果。所以修改数据以预知哈希的结果是不可能的。
为了证明你已经做了一些创建区块的工作,你需要计算出一个不大于某个特定值的块头的哈希值。举个例子
:
如果这个最大哈希值是
2
256
−
1
,你只要证明你做了两次组合就可以使哈希值小于
2
256
−
1
。
在上面的例子中,你很有可能在第一次尝试的时候就生成了一个成功的哈希值。你甚至可以估算你要达到的某个阈值所需要的尝试的次数。比特币本身并不能控制这个可能性,但是单纯假设这个阈值越小需要尝试的次数越多,平均下来也就是个平均数
(
这个是概率平均
)
。
只有当哈系值至少跟
P2P
网络预期的难度值难度相当的时候,新的区块才会被加到区块链上。比特币网络使用储存在
2016
个区块头的时间戳的差值来计算下一轮的难度。这个差值的理想的间隔是
1,209,600
秒
(
两周
)
。
•
如果产生
2016
个区块的时间小于两周,预期的难度将成比例地提高(大约
300%
)以便于下一个块能够准确地在两周生成
,
前提是保证在当前的
HASH
在同一
算力
.
•
如果产生
2016
个块的时间超过两周,同样地,预期难度将降低
(75%
左右
)
。
(
注意
:
比特币内核实现的一个差一错误,导致每到
2016
区
块的时候,因为使用了第
2015
块的时间戳,难度就会更新,这导致了轻微的偏差。
由于每一块头的哈希值必须小于某个阈值,每一区块也必须链接到它前面的一个区块。要在原始区块生成到当前这段时间里传送一个已修改的区块,(一般来说)需要消耗和整个比特币网络消耗的算力一样多的哈系算力。只有你掌握了全网大多数哈希算力,你才能有效地实现对交易历史进行
51%
的
攻击。
区块头提供了一些容易改的字段,例如
dedicated nonce field
,所以获取新块的哈希不需要等新的交易的到来。同样,只有
80
字节的区块头会被计算到
POW
的哈希中,因此添加更多的交易信息不会降低伴有额外
I
/
O
的
哈希计算速度
.
Block Height And Forking
区块高度及分叉
任何
成功计算出小于阈值的哈系值的矿工可以把整个区块加到区块链中
(
假设这个区块是有效的
)
。这些区块被标记为当前区块的高度
--
就是当前区块到第一个块
(genesis block)
的差值
.
比如,第
2016
块是第一个调整难度的块。
多个区
块可以有同样的区块高度,这在两个或两个以上的矿工几乎在同一时间创建了一个区块的情况下是很常见的。正如上图所示,区块链上出现了显然的分叉。
当矿工同时在区块链的末端生成区块的时候,每个节点都独立地选择相信哪个区块。
(
在没有其他考虑的情况下,节点通常选择相信他们接收到的第一个块
)
。
最终,矿工会创建一个新块,这个区块附在其中一个竞争的并行区块。这会使这个分支比别的分支更长。假设一个分支只包括有效的区块,正常的节点将选择最长的那个分支(最难创建的一个链),然后抛弃比它短的分支。
长期的分叉是可能的,如果这些矿工有其他意图,比如一些矿工在分叉之后的一条分支上奋力计算,尝试
51%
攻击去修改交易历史。
由于很多区块在分叉的时候会有同样的高度,所以高度不能作为唯一的区分。通常,都用它的
SHA256
的哈希值来表示这个区块。
Transaction Data
每个区块必须包含一个或者多个交易记录,第一个交易记录必须是
coinbase
(币基)记录,这个记录包含了区块奖励和本区块的所有的交易费。
由挖矿出来的币有一个特殊的使用条件,就是在此后的
100
块只能不能使用。这个可以部分防止有的矿工花费可能以后被抛弃的区块奖励
(
分叉之后,这个矿工的这条链被抛弃
)
。
区块不是必须包含所有的非
-coinbase
的交易,但是矿工们通常会为了他们的交易费把这些交易记录给收录进来。
所有的交易记录,包含
coinbase
记录,会在前面加上交易队列的编报,并被编码为
rawtransaction
格式的二进制进行存储。
rawtransaction
格式是由
txid
哈希而来
.
这些
txids
组成了一个
Merkle
树。
Merkle
树是一个层级
hash
树,如果叶节点有两个叶子,节点的值就是这两个值的哈希,如果叶节点只有一个节点,节点的值就是这一个叶节点的哈希值。
如果有并排节点的,就和并排节点一起哈希
;
所有没有并排节点的节点都自己计算哈希
,
这样一层一层计算,就计算出
Merkle
根节点的哈希。
举个例子
,
这些节点仅仅是组合在一起
(
并未计算哈希
),
五层的交易记录
Merkle
树就是像下图这样
ABCDEEEE .......Merkle root
/ \
ABCD EEEE
/ \ /
AB CD EE .......E is paired with itself
/ \ / \ /
A B C D E .........Transactions
在简单支付验证
(SPV)
部分,这个
Merkle
树允许客户端验证他们的在某个块中的交易记录,通过从
Merkle
根节点进行遍历。所有的节点不用被信任:在区块头作假是一件很昂贵的事情,中间的哈希结果不能被伪造,否则这个认证将失败。
举个例子
,
为了证明
D
交易被添加到这个区块中,一个
SPV
客户端只需要拷贝
C
、
AB
和
EEEE
哈希到
Merkle
根节点;客户端不需要知道其他的交易的任何信息。如果这
5
个交易都达到了最大的大小,下载整个区块将需要
500,0000
字节,但是下载这
3
个哈希值加上头部只需要
140
字节。
专访 Mable Jiang:复盘 Multicoin 投资方法论与 DeFi 洞察
原文标题:《对话 Mable:复盘 Multicoin Capital 的投资方法论与 DeFi 观察 | 链捕手》受访者:Mable Jiang,Multicoin Capital 执行董事撰文:王...
信标链、PoS、分片……接触以太坊 2.0 得先理解这些术语
原文标题:《以太坊 2.0 术语库》整理:ETH 中文网Attestation 证明证明是指验证者所发起的投票,由验证者的签名聚合而成,用以证明区块的有效性,投票通过验证者的余额进行加权。Attest...
手把手教你搭建 IPFS 私有网络
在联盟链的场景下,IPFS 作为去中心化存储的首选方案,本文将介绍如何使用 go-ipfs 搭建一个私有网络并进行简单使用。...