abbshr / abbshr.github.io

人们往往接受流行,不是因为想要与众不同,而是因为害怕与众不同

Home Page:http://digitalpie.cf

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

比特币常识手册

abbshr opened this issue · comments

椭圆曲线数字签名算法(ECDSA)为比特币系统运转的可靠基石.

私钥: 随机生成的32byte(256位)数字
公钥: 分为压缩公钥(33byte)和非压缩公钥(65byte)
签名: 对私钥进行HASH运算. 由签名和私钥可推出
地址: 为方便交易而使用的公钥替代物(25byte)

私钥→公钥→地址, 这一过程是不可逆推的.

tx hash id = SHA256(SHA256(tx data))
tx fee = sum(input) - sum(output)
  /* 计算tx hash id 
   * in JavaScript
   */
  hex = new Buffer(tx_data, 'hex');
  B_hash = crypto.createHash('sha256').update(crypto.createHash('sha256').update(hex).digest()).digest();
  // 将Big-Endian转化为Little-Endian
  L_hash = Array.prototype.reverse.call(B_hash);
  txid = L_hash.toString('hex');

每个tx只会在best chain(主链)的某一个block里出现一次, 但可能出现在其他分支中.

每生成210000个block时(4年左右), 来自coinbase的奖励减半. 计算方法: 50 >> (height / 210000) + Fees

全网达到2100W个btc后将不再有coinbase的奖励, 而挖矿收入来源仅剩下Fees(交易矿工费)

BTC系统中, 产生coinbase即发行货币

block大约每10分钟生成一个, 时间由全网算力调整.

挖矿: 即工作量证明. 其实质为计算block hash(生成新的block)的过程, 成功(加入best chain)概率为n%, 即该节点算力占全网的百分比.

区块头(block header)包含"前一个block header的hash"(32byte), "该block中全部tx打包的hash"(32byte), "时间戳"(4byte), "难度"(4byte), "随机数"(4byte)

block hash计算方法: 将header连接得到16进制表示形式, 按little-endian存入内存, 两次SHA256计算得到hash, 最后逆序.

  hex = new Buffer(header, 'hex');
  hash = crypto.createHash('sha256').update(crypto.createHash('sha256').update(hex).digest()).digest();
  revhash = Array.prototype.reverse.call(hash).toString('hex');

分支博弈

因为多个挖矿节点的存在, 必然会导致不同block chain的产生, 而网络会根据如下优先级顺序来选取那条block chain作为主分支:

  1. 最长
  2. 难度最大
  3. 接收时间最早
  4. 从网络的接受顺序
  5. 等待高度值增一

如果各挖各的矿, 会存在多分枝并存, 这时每个分支都有可能成为主链, 而算力最强的节点一定得到最长链. 如果一个节点的分支不是主分支, 则其收益也不会得到认可, 导致0收益. 所以为了降低此风险, 很多节点会联合在一起, 贡献一个分支, 使其保持最长.

多重消费问题

先用btc消费, 使tx进入一个block, 然后构造另一个包含该tx的block, 使相同的输入作为这个tx的输入, 而输出设定为自己的btc地址, 然后计算这个block hash, 并追赶主链, 一旦成功则相当于该tx包含的btc未花费, 就可以再次使用这些btc. 但攻击者能成功追赶并改变主链是一个小概率事件.