abbshr.github.io
abbshr.github.io copied to clipboard
比特币常识手册
椭圆曲线数字签名算法(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作为主分支:
- 最长
- 难度最大
- 接收时间最早
- 从网络的接受顺序
- 等待高度值增一
如果各挖各的矿, 会存在多分枝并存, 这时每个分支都有可能成为主链, 而算力最强的节点一定得到最长链. 如果一个节点的分支不是主分支, 则其收益也不会得到认可, 导致0收益. 所以为了降低此风险, 很多节点会联合在一起, 贡献一个分支, 使其保持最长.
多重消费问题
先用btc消费, 使tx进入一个block, 然后构造另一个包含该tx的block, 使相同的输入作为这个tx的输入, 而输出设定为自己的btc地址, 然后计算这个block hash, 并追赶主链, 一旦成功则相当于该tx包含的btc未花费, 就可以再次使用这些btc. 但攻击者能成功追赶并改变主链是一个小概率事件.