挖矿

求一个满足条件的block hash值,其中可变动的有nonce和coinbace的extra nonce, 故挖矿的尝试有两个循环。通过不断尝试,使得H(block header) <= target。 将hash值转换成16进制,前面就会出现一段区域的。如:

1
2
3
00000000000000000000e008b353e7ff04e61631a4ba3808291105e5f9b569be

target = difficulty_target / difficulty

难度值越高,目标值越小。比特币系统每2016块调整一次difficulty值,以确保每平均每10分钟出一个块。

1
2
expected / actual = 20160 / actual
new difficulty = difficulty * (expected / actual) //新的难度值

如果系数大于1(比如区块出块速度大于预期),难度值将提高;

如果系数小于1(比如区块出块速度小于预期),难度值将降低。

矿工奖励来源有二:出块奖励,即在coinbase交易中铸币转给自己;交易手续费。初始矿工奖励有50 BTC,而后每210000个块减半,故总的BTC个数为

$$ 21000050 + 2100025 + 21000012.5+… = 21000050*(1+ \frac{1}{2} + \frac{1}{4} + …)= 2100w $$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;
    ...

账户余额

比特币系统是transaction-based ledger类型,各个权节点维护一个UTXO(Unspent Transaction Output)数据结构的数据,每个账户的余额即该账户未花掉交易的输出的总和,这个可以保证每个BTC有合法来源,防止double spending.

例子:昨天alice分别收到2BTC和3BTC,今天alice转给Bob 5 BTC,则需要将前面两笔交易的output作为当前交易的input,矿工会验证并没有其他交易在先前的区块当中,已经使用过这笔Unspent Output 。若output大于input则需要将多余的BTC转给自己,使交易平衡。

优点

  • UTXO因为没有帐户的存在,因此容许平行进行多笔交易。假如你有许多的UTXOs,你可以同时进行多笔交易而不会被阻挡。

  • 再来就是匿名性,如上面提过得,你可以轻易的隐藏自己的交易目的

  • UTXO也被认为比较安全且有效率,可以透过Simple Payment Verification(SPV)来快速验证检验交易。

utxo

而ETH系统,则是account-based ledger类型,转帐不需要说明币的来源,还有方便在其上面开发应用。

比特币全节点

  • 一直在线
  • 在本地硬盘上维护完整的区块链信息
  • 在内存里维护UTXO集合,以便快速检验交易的正确性
  • 监听比特币网络上的交易信息,验证每个交易的合法性
  • 决定哪些交易会被打包到区块里
  • 监听别的矿工挖出来的区块,验证其合法性

节点为了穿过防火墙而用TCP通信

比特币区块大小限制

1M

比特币矿池

矿池的pool manager 承担了同步、验证、维护UTXO集合等任务,将自己的计算puzzle交由miner群来做,miner可以借助专门的矿机ASIC完成计算block hash后交给pool manager。

难度值过小会怎么样

出块的时间会特别短,在同一时间内发布相同区块的可能性变大,系统分叉的可能性也增大,系统总算力会分散而易受到攻击

比特币脚本

硬分叉和软分叉

默认大多数节点能进行软件升级变为新节点

  • 硬分叉

    ​ 永久分叉,分成两个系统,需要通过chainId标识不同的链以防止在分叉后的不同链上的交易回放。分叉前的余额可以在两个链系统中使用。经典例子:ETH和ETC

    原因:更新软件的后新节点可以接受旧节点发布的区块,而旧节点不认可新节点挖出的区块。

    1M->4M

  • 软分叉

    旧节点认可新节点发布的区块,但新节点不认可旧节点发布的区块,导致旧节点每挖出的区块都会因分叉而最终无效

    如:软件升级,将区块大小限制从1M调到0.5M

存储文件hash

  • 发一个转账交易,将hash放在toAddress, 缺点:文件内容会放在UTXO内存中

  • proof of Burn

    OP_RETURN

    ​ …….

零知识证明

​ 零知识证明指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确以外的任何信息。

同态隐藏

  • 如果x,y不同,那么它们的加密值E(x)和E(y)也不相同。
  • 给定E(x)的值,很难反推出x的值
  • 给定E(x)和E(y)的值,我们可以很容易地计算出一些关于x,y的加密函数值。
    • 同态加法:通过E(x)和E(y)计算出E(x+y)
    • 同态乘法:同过E(x)和E(y)计算出E(xy)的值
    • 拓展到多项式

盲签

  • 用户A提供SerialNum,银行在不知道SerialNum的情况下返回签名Token,减少A的存款
  • 用户A把SerialNum和Token交给B完成交易
  • 用户B拿SerialNum和Token给银行验证,银行验证通过,增加B的存款
  • 银行无法把A和B联系起来
  • 中心化

零币和零钞

  • 零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证
  • 零币(zerocoin)系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务。
  • 零钞(zerocash)系统使用zk-SNARKs的协议,不依赖一种基础币,区块链中记录交易的存在性和矿工用来验证系统正常运行所需关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行。

存储区块使用的数据库

使用key-value数据库存储区块,hash值作为key,比特币使用的是leveldb数据库

参考

https://www.cnblogs.com/mailer/p/9854326.html

https://zhuanlan.zhihu.com/p/28805231

https://cloud.tencent.com/developer/news/245238