全节点与轻节点
比特币系统中有两种节点,一种是全节点,一种是轻节点。
全节点特征
- 一直在线
- 在本地硬盘上维护完整的区块链信息
- 在内存中维护UTXO集合,以便快速检验交易的正确性
- 监听比特币网络上的交易信息,验证每个交易的合法性(有没有合法签名,是不是double spending)
- 决定哪些交易会打包到区块里(缺省状况下只要合法交易并且交易费符合要求都会打包)
- 监听别的矿工挖出的区块,验证其合法性:
- 区块中的每个交易都要合法(包括铸币交易及其出块奖励)
- 发布的区块是不是符合难度要求、难度目标阈值的设置是否正确、每两周调整的挖矿难度
- 区块是在延伸最长合法链
- 挖矿:
- 决定沿着哪条链挖下去
- 决定当出现等长分叉时选择哪个分叉(缺省情况是选择最先接收到的区块的分叉)
轻节点特征
- 不是一直在线
- 不用保存完整区块链,只要保存每个区块块头(这样和全节点的大小相差大约1000倍)
- 不用保存全部交易,只需要保存和自己相关的交易
- 没法验证大多数交易的合法性,只能检验与自己相关的交易的合法性
- 无法检测比特币网络上发布的区块的正确性
- 可以验证挖矿的难度(因为挖矿时候计算哈希值只用到了块头信息,而块头信息轻节点是保存了的)
- 只能检测哪个是最长链,不知道哪个是最长合法链(因为无法检测这条链上所包含的交易都是合法的)
轻节点假设矿工(全节点)大多是有理智的,即假设矿工们不会沿着不合法的链一直挖下去。
比特币网络中大部分节点都是轻节点,如果只是想转账,而不是去挖矿的话,只用轻节点就可以了。
挖矿
当在挖矿过程中发现新发布了一个区块,那么应该停止挖矿,重新从UTXO中取出一系列合法交易组成候选区块,在刚发布的这个区块后面开始挖矿。因为一方面这个区块中的交易可能和刚刚在挖的那个区块有重复,另一个本质的原因就是候选区块的块头有指向前一个区块的哈希指针。因为最新的区块已经变了,这个哈希指针也要跟着改变
深入理解UTXO:
假设我有 8 个比特币,这其实意味着,之前有一个交易把这些比特币转入我的地址,这个交易的输出(即 8 个比特币)未被使用,我拥有了这 8 个比特币。
现在,我要发起一个转账交易,这个交易中的输入是让我拥有这些比特币的上一个交易。
我要转账给你,我做的是,对让我拥有这些 8 个比特币的上一个交易进行签名,把这一新转账交易的输出地址设为你的钱包地址。
这样,我就发起了一个转账支付交易。等矿工将这一交易打包进新的区块,转账交易完成(?所以要进入区块,才算交易成功吗?),这 8 个比特币就属于你了。你拥有的是你我这个交易的未使用的交易输出。
由于挖矿过程的无记忆性(memoryless,progress free),无论是在刚刚的区块上继续挖,还是新组装一个区块继续挖,成功的概率是一样的。
比特币系统安全性的保证:因为别人没法伪造你的私钥,也就没法把你账户上的BTC转走。但这个密码学上的保证是要以“系统中大部分节点是诚实的”为前提,即大家不会接受那些不合法的交易进入区块链。
比特币会出现矿工偷答案吗?:也就是偷算好的nouce值,使得H(blockheader)≤target。如果偷取nouce值,在铸币交易中,会将转账的地址改为自己的地址,这样会使铸币交易的哈希发生变化,从而导致Merkle Tree的根哈希值发生变化,使得块头的哈希值也变了,所以此时nouce是失效的。
挖矿的设备
第一代挖矿设备:CPU
如果专门搞一台计算机来挖矿是很不划算的。因为计算机大部分内存是闲置的(挖矿只要用到很少一部分内存),CPU大部分部件是闲置的(计算哈希值的操作只用到通用CPU中的很少一部分指令),硬盘和其它很多资源也都是闲置的。随着挖矿难度提高,用通用计算机上的CPU挖矿很快就无利可图了。
第二代挖矿设备:GPU
GPU主要用来做通用的大规模并行计算,用来挖矿还是会有不少浪费,而且GPU的噪音很大,其中很多部件还是浪费了(如用于浮点数计算的部件)。近些年GPU价格涨得很快,这不仅是深度学习火热的原因,实际上很多GPU是买来挖矿的。不过现在挖矿的难度已经提高到用GPU也有些划不来了,不会再有那么多人买GPU来挖比特币。
第三代挖矿设备:ASIC芯片
ASIC即Application Specific Integrated Circuit,其中有专门为了挖矿而设计的芯片,没有多余的电路,干不了别的事,它的性价比是最高的,而且为某一种加密货币设计的ASIC芯片只能挖这一种加密货币的矿,除非两个货币用同一个mining puzzle。
挖矿的竞争越来越激烈,定制的ASIC芯片可能用了几个月就过时了,到时候又要买新的ASIC芯片参与竞争。ASIC矿机上市后的大部分利润也就在前几个月,这个设备的迭代也是很块的。
ASIC resistance:为了让通用计算机也能参与挖矿过程,抗ASIC芯片化,有些加密货币采用Alternative mining puzzle
,以去对抗那些只为了解决特定mining puzzle而设计出来的ASIC矿机。
比特币挖矿的趋势:大型矿池
矿池将很多矿工组织起来,一般的架构就是一个矿主(pool manager)全结点去驱动很多矿机,下属矿工只负责计算哈希值,全结点的其它职能只由矿主来承担。有了收益以后再大家一起分配。
假设出现超大型矿池,具体能发动哪些攻击?
- 分叉攻击
因为算力占了半数以上,并且矿工挖矿任务被分配开并行进行,分叉出来的链的增长速度很快,最终势必成为最长合法链。
- Boycott(*禁用)
假设攻击者不喜欢某个账户A,不允许和A有关的所有交易上链。这时如果有人发布了含有和A有关的交易的区块,它可以很快发布一个不包含这些交易的区块,然后不必等候6个确认区块,立即发布到比特币网络上竞争最长合法链。
这里不必等候的原因是,之前普通分叉攻击等候几个确认区块只是为了让收款人认为已经没问题了,已经成功收款了,这里没有这种顾虑。
在之前学习共识协议时学过,大部分节点是诚实节点时,记账权也可能落在有恶意的节点手里,它完全可以不发布某些交易,但在那种情形下总有诚实的节点愿意发布这些交易,所以是没关系的。
但当在这种情况下,即有恶意的节点算力很大时,却可以始终让某些交易不上链。即完全可以公开抵制某些交易,这样一来别的矿工也不敢随便打包这些交易了,因为很可能自己辛苦挖的矿最后沦为丢弃的区块。
- 无法进行盗币
不论算力再强,因为没法伪造别人账户的签名(除非获得其私钥),所以没法伪造交易将别人账户上的BTC转走。即便是仗着自己算力强,强行将不合法的区块发布到区块链上并沿着这条链继续延伸,诚实的节点依然不会沿着这条不合法的长链延伸,所以还是没用的。