/MyCoin

探讨一下数字货币的算法实现.

Primary LanguageGo

数字货币探讨

    此处探讨一下数字货币的算法,以期后续有机会实现。数字货币,就是以区块链技术实现的分布式账本。数字货币只是区块链的应用之一,区块链还可以实现电子合约,从而实现更广泛的应用。

共识算法 (POW 和 POS)

     POW是工作量证明算法,即证明我(本矿机)抱着合作的目的,为了产生这个区块已经花了一定的工作量,一般是让矿机凑一个随机数,让整个区块的hash值符合一定条件。

     POS算法,即权益证明算法。POW的缺点是耗费大量电能,而POS算法在POW算法的基础上进行了改进,他主要的**是限制参与POW游戏的矿机的数量,即符合一定条件的矿机才能用工作量证明来产生新的区块。POS就是要证明自己持有一定的“币龄”(币龄=持有货币数×持币时间),才可有资格挖矿。一旦成功挖出一个区块,则这些“币龄”被消耗掉。这种算法的缺点是有人可以积累大量的货币,以控制挖矿权,从而形成一个中心端。

     以太坊采用的POS算法叫Casper,在这种算法中抵押的不是“币龄”,而是货真价实的以太币,是用以太币来投票,以确定哪个区块可以成为正式的主链。

区块结构

比特币的区块结构

     先参考一下比特币的区块结构。

  1. 整体结构
数据项 字节长度 字段名 说明
Magic NO 4 魔数 常数0xD9B4BEF9
Blocksize 4 区块大小 用字节表示的该字段之后的区块大小
Blockheader 80 区块头 组成区块头的几个字段
Transaction counter 1-9 交易计数器 该区块包含的交易数量,包含coinbase交易
Transactions 不定 交易 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致
  1. 区块头
字节长度 字段 说明
4 版本 区块版本号,表示本区块遵守的验证规则
32 父区块头哈希值 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算
32 Merkle根 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算
4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,
同时全节点也会拒绝那些超出自己2个小时时间戳的区块
4 难度目标 该区块工作量证明算法的难度目标,已经使用特定算法编码
4 Nonce 为了找到满足难度目标所设定的随机数,
为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数
  1. Coinbase交易信息

     一个区块第一个交易规定为coinbase交易,即由挖矿产生的比特币奖励。此处略。

  1. 普通交易信息
字节长度 字段 说明
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 锁定脚本大小 用字节表示的后面的锁定脚本长度
不定 锁定脚本 一个定义了支付输出所需条件的脚本

拟采用的区块分类

  1. 创世区块

     即首个被挖出来的区块,作为整个区块链的根,一般此区块没有任何交易,也不产生新的电子货币。

  1. 普通区块

     包含若干交易的区块。

  1. 检查点区块

     每个矿机都要存储整个区块链,则要浪费大量存储空间。设置检查点区块的目的就是要归并一下以前的区块。

  1. 分叉区块(软分叉)

     如果挖矿规则改变则要产生一个分叉区块。分叉区块中重新设置一下某些挖矿规则参数。

交易结构

  1. 普通交易

     即电子货币的转账交易。

  1. 链码交易

     链码就是可以在链上执行的一段脚本,链码交易的目的是安装一段链码、执行链码、以及从链码中获取状态量。

对外接口

  1. 受理交易

     允许外部系统提交一个交易。本矿机检验其合法性,并纳入区块,准备挖矿。

  1. 反馈交易处理情况

     一旦交易所在区块被区块链网络确认,需反馈给提交交易的外部系统。

  1. 获取区块

     反馈指定区块的具体内容。

  1. 获取全链

     反馈从创世区块到当前区块的全部内容。

  1. 发送/广播区块

     挖出一个区块后,赶紧发送给其他矿机。

  1. 获取矿机清单

     在区块链网络中,每一个矿机未必知道其他所有矿机。此接口只返回目前本矿机知道的其他矿机的地址。

  1. 注册矿机

     向其他矿机告知自己的存在。

  1. 黑名单管理

     如果发现恶意矿机,则纳入黑名单中,拒绝其提交的区块。此接口需有一定的权限控制。

  1. 钱包账号管理

     即挖到矿后,以哪个账号来保存这些货币。此接口需有一定的权限控制。