abbshr.github.io icon indicating copy to clipboard operation
abbshr.github.io copied to clipboard

比特币常识手册

Open abbshr opened this issue 9 years ago • 0 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. 但攻击者能成功追赶并改变主链是一个小概率事件.

abbshr avatar Feb 06 '15 02:02 abbshr