此处探讨一下数字货币的算法,以期后续有机会实现。数字货币,就是以区块链技术实现的分布式账本。数字货币只是区块链的应用之一,区块链还可以实现电子合约,从而实现更广泛的应用。
POW是工作量证明算法,即证明我(本矿机)抱着合作的目的,为了产生这个区块已经花了一定的工作量,一般是让矿机凑一个随机数,让整个区块的hash值符合一定条件。
POS算法,即权益证明算法。POW的缺点是耗费大量电能,而POS算法在POW算法的基础上进行了改进,他主要的**是限制参与POW游戏的矿机的数量,即符合一定条件的矿机才能用工作量证明来产生新的区块。POS就是要证明自己持有一定的“币龄”(币龄=持有货币数×持币时间),才可有资格挖矿。一旦成功挖出一个区块,则这些“币龄”被消耗掉。这种算法的缺点是有人可以积累大量的货币,以控制挖矿权,从而形成一个中心端。
以太坊采用的POS算法叫Casper,在这种算法中抵押的不是“币龄”,而是货真价实的以太币,是用以太币来投票,以确定哪个区块可以成为正式的主链。
先参考一下比特币的区块结构。
- 整体结构
数据项 | 字节长度 | 字段名 | 说明 |
---|---|---|---|
Magic NO | 4 | 魔数 | 常数0xD9B4BEF9 |
Blocksize | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 |
Blockheader | 80 | 区块头 | 组成区块头的几个字段 |
Transaction counter | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 |
Transactions | 不定 | 交易 | 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 |
- 区块头
字节长度 | 字段 | 说明 |
---|---|---|
4 | 版本 | 区块版本号,表示本区块遵守的验证规则 |
32 | 父区块头哈希值 | 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算 |
32 | Merkle根 | 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算 |
4 | 时间戳 | 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值, 同时全节点也会拒绝那些超出自己2个小时时间戳的区块 |
4 | 难度目标 | 该区块工作量证明算法的难度目标,已经使用特定算法编码 |
4 | Nonce | 为了找到满足难度目标所设定的随机数, 为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数 |
- Coinbase交易信息
一个区块第一个交易规定为coinbase交易,即由挖矿产生的比特币奖励。此处略。
- 普通交易信息
字节长度 | 字段 | 说明 |
---|---|---|
4 | 交易版本号 | 明确这笔交易参照的规则 |
1-9 | 输入计数器 | 包含的交易输入数量 |
不定 | 交易输入 | 一个或多个交易输入 |
1-9 | 输出计数器 | 包含的交易输出数量 |
不定 | 交易输出 | 一个或多个交易输出 |
4 | 锁定时间 | 一个区块号或UNIX时间戳 |
4.1 普通交易输入信息
字节长度 | 字段 | 说明 |
---|---|---|
32 | 交易哈希值 | 指向被花费的UTXO所在的交易的哈希 |
4 | 输出索引 | 被花费的UTXO的索引号,第一个是0 |
1-9 | 解锁脚本大小 | 用字节表示的后面的解锁脚本长度 |
不定 | 解锁脚本 | 满足UTXO解锁脚本条件的脚本 |
4 | 序列号 | 固定值0xFFFFFFFF |
注:UTXO 是 Unspent Transaction Output 的缩写。
4.1 普通交易输出信息
字节长度 | 字段 | 说明 |
---|---|---|
8 | 总量 | 用聪表示的比特币值 |
1-9 | 锁定脚本大小 | 用字节表示的后面的锁定脚本长度 |
不定 | 锁定脚本 | 一个定义了支付输出所需条件的脚本 |
- 创世区块
即首个被挖出来的区块,作为整个区块链的根,一般此区块没有任何交易,也不产生新的电子货币。
- 普通区块
包含若干交易的区块。
- 检查点区块
每个矿机都要存储整个区块链,则要浪费大量存储空间。设置检查点区块的目的就是要归并一下以前的区块。
- 分叉区块(软分叉)
如果挖矿规则改变则要产生一个分叉区块。分叉区块中重新设置一下某些挖矿规则参数。
- 普通交易
即电子货币的转账交易。
- 链码交易
链码就是可以在链上执行的一段脚本,链码交易的目的是安装一段链码、执行链码、以及从链码中获取状态量。
- 受理交易
允许外部系统提交一个交易。本矿机检验其合法性,并纳入区块,准备挖矿。
- 反馈交易处理情况
一旦交易所在区块被区块链网络确认,需反馈给提交交易的外部系统。
- 获取区块
反馈指定区块的具体内容。
- 获取全链
反馈从创世区块到当前区块的全部内容。
- 发送/广播区块
挖出一个区块后,赶紧发送给其他矿机。
- 获取矿机清单
在区块链网络中,每一个矿机未必知道其他所有矿机。此接口只返回目前本矿机知道的其他矿机的地址。
- 注册矿机
向其他矿机告知自己的存在。
- 黑名单管理
如果发现恶意矿机,则纳入黑名单中,拒绝其提交的区块。此接口需有一定的权限控制。
- 钱包账号管理
即挖到矿后,以哪个账号来保存这些货币。此接口需有一定的权限控制。