1. BTC系统中的区块记录的是交易记录,并不记录每个账户的币个数,因此也被叫做基于交易的账本模式(transaction-based ledger)
2.全节点需要维护的一个数据结构叫做UTXO(unspend transaction Output)即还没有被花掉的交易输出
eg:A -------> B(5BTC)---------> D(5BTC)
|
|———> C (3BTC)
由于B的5个BUC已经花掉了,因此B的币不在UTXO中,C和D个在UTXO中。
UTXO 用于快速检测double spending,即交易币的来源必须在UTXO集合内才是合法的
综上 自然而然 应该有 所有交易的总输入应该等于总输出!有些交易的输出会小于输入,可能是因为有手续费
3.
BTC设计平均出块时间10min,21万区块出块奖励减半
(21万*10min)/(60*24*365)=4年
就是说每4年 奖励减半 到最后出现挖矿收益大于成本 到那时候就只能通过收取交易费来奖励了
很可能会降低交易量.......
4.BTC 块头构成
{
int32_t version
char[32] previous_header_hash
char[32] mrecle_root_hash
int32_t time // 时间并不要求精确
int32_t nbits // 挖矿目标阈值 也就是本header hash必须 <=的那个阈值
int32_t nonce // 挖矿修改的值
ps:因为nonce空间有限 因此出块奖励中的coinbase也能用于调整来找到满足nbits条件。
影响路径就是:coinbase ----> 出块交易(铸币)hash ----> 向上传导影响merkle root hash --->影响整个快头的hash
5.挖矿过程表面上看是无意义的 但是对于维护系统是有意义的
6. 最长合法链 forking atack(分叉攻击) 和 conformation
区块链说是不可篡改的账本实际上只是一种概率上的保证,对于最新的块,如果恶意节点在其前面增加分支节点,还是有概率改变最长合法链的走向的,只有当更多的区块在后面加入,恶意节点篡改的成本大幅上升,前面的区块才能成为真正的不可篡改。
在争夺最长合法连的过程中,为了防止出现恶意节点使用回滚来达到double spending目的
一般要进行高达6个区块的conform,时间大概1h,这个叫six conformation
但是实际情况是:一般节点会接受最先接收的交易,如果再收到不合法的交易(自己给自己转账)一般不会被诚实的节点接受;再加上现实生活中从收到转账到发出商品有一段时间,是有时间处理的,因此可以采用 zero conformation
7.selfishing mining atack 先悄悄的挖很多块,再一次性接到最长链上去进行分叉攻击
风险很大,因为并不能确定能够比别人更快挖出更长链
8.BTC 网络节点
application layer : BTC chain
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-..-.-.-
net layer : P2P overlay network
8.1 所有节点都是对等的关系!
8.2节点要加入网络,先要知道一个种子节点,种子节点会把他知道的节点告诉你,长期收不到节点的消息,其他节点会删除该节点。
BTC节点网络设计的目标是:简单 鲁棒性 而不是高效
8.3 消息传播在网络中采取flooding的方式:节点第一次听到某个消息时,会将其转播给邻居节点,并且在下一次收到同样的消息时,不再进行转发。邻居节点的选取是随机的,跨国邻居节点是很正常的,这样做增强了鲁棒性
8.4 节点都会在本地维护一个等待上链的交易集合,第一次听到某个交易就会加入集合并转发给邻居,再次收到该交易则不会做记录也不转发。假如同时发生了两笔冲突交易A和B,一些节点收到A交易,一些节点先收到交易B,那么就看谁先被写入到区块中,加入A最先被写入,那么保存B交易的节点在更新区块后需要在本地删除B交易!
8.5 BTC区块的大小被限制在1M,这样也是为了具有普适性
9. BTC中调整挖矿难度
挖矿条件: H(block header) <= target
SHA-256算法输出空间 2^256
difficulty = difficulty_1_target/target 挖矿难度和target成反比
9.1 为什么要调整挖矿难度?----->为了将出块时间控制在10min ----->为什么要控制时间 -----> 因为不控制,挖矿时间会越来越短,会同时在世界各地出现大量的链分叉 ----->这样的话会造成诚实节点算力被分散 ----> 恶意节点很容易通过算力优势全力扩展自己的链 -----> 整个BTC区块链陷入无序
9.2 调整难度的方法
① 每2个星期调整一次难度
target = target * actual time / expected time
= target * (最近2016个块的实际时间总和)/2016*10
也就是说通过最近2016个区块的平均消耗时长来确认挖矿难度是否产生变化