实验流程
1.python net_node.py
:五个节点启动
2.python generate.py
:向五个节点发送交易
- 交易验证使用
pay-to-public-key
- 钱包公私钥地址计算使用椭圆曲线
- 网络路由节点抽象成
Router
,公共端口8333
MinerNode
继承Router
,对广播的交易进行验证打包上链- 挖矿部分没有实现,
Difficult
字段没用到计算上
-
./data
中包括创世区块和创世交易 - 区块中
merkle_tree
需要实现 - 根据
merkle_tree
重新计算 hash 值 -
如果 8333 连接不上,需要投票选出新节点 - 新来的孤儿区块,需要暂存起来而不是直接抛出异常
- 当两个节点对新区块产生了不同的意见,会分叉
- SPV 钱包节点的实现
学习笔记:
- 防止双花攻击的措施
- 时间戳机制:一个交易并不是在被矿工写到一个区块上时就生效了,而是要等这条链真正的成为了链上的最长链之后,才认为交易真正不可逆。这也就是为什么每次转账后,都建议等待 六次确认,交易所在区块之后每新增一个区块,就是一次确认,等待六次确认之后,大部分矿工都承认这条链是最长链,交易将不可逆转。
- 最长链原则 :由于随机数和网络延迟等原因,可能会出现两个矿工同一时间挖出区块,如果他们一起参与记账,就会造成区块链分叉。系统会根据最长链进行取舍,哪条链上新产生的区块可以使得区块链变得更长,哪条便是最长链(主链),而短链则被所有矿工淘汰,矿工通过记账来换取挖矿奖励,即使部分节点矿工作恶修改账本,其节点也不会承认,从而避免双花。