3-BTC实现
简介
transaction- based ledger 基于交易的账簿。
UTXO :
Unspent Transaction Output。 还没有花掉的交易的 输出 的集合。
同一笔交易可能有的输出在 UTXO里面有的不在里面(花掉了),UTXO中的每一个元素要给出 产生这个元素的hash 值,以及它在这个交易里 是第几个输出,就可以定位到这个UTXO中的输出。
UTXO 用于交易前检测 这个钱是不是没有被花掉,每一个 full block 都要维护 UTXO。
transaction free
我们之前说过抢到了记账权 会有一个 block reward,但是 他凭什么给你记账呢?而不去选自己喜欢的人加入 这个区块的账簿中呢?这里就涉及到我们说的交易费用。
每隔21万个区块减半
btc 设计的每隔10分钟会有一个新的区块产生。
设计了 每隔21万个区块,就要减半一次。所以大约4年一次减半。
account-based ledger 基于账户的账簿
block介绍
上面的例子解释一下:
(左)
这个区块中包括 686 个交易
总输出 XXX 个btc
总交易费
height 是区块的高度也就是 区块的序号;
时间戳
挖矿难度(每隔2016个block调整一次难度,为了保证出块时间在 10分钟左右。)
nonce 随机数,这个是最后找到的符合难度要求的 nonce;
出块奖励
(右)
区块的头的 hash 值; 调整 nonce 让 H(block header) <= target ,成立的这个hash值。
前一个区块的头的 hash 值;
merkle root ,前面说过的,它来验证 交易是否在 block body 中。
block header
这个随机数,是一个32位的无符号整数。
由于 miner 太多,32位的无符号整数即便是遍历完 也无法满足 提高target难度的要求,要给出更多的空间去给miner 去算,我们看看 block header 的内容。
看看还有哪些内容是可以变的。
其中 merkle根hash 值 改的比较多。
coinbase transaction(铸币交易)
每一个 发布的 block 中 有一个 铸币交易(coinbase transaction),btc 产生新的币的唯一方式;
我们可以看见 coinbase transaction 是没有输入的,属于 凭空创造;CoinBase 内写入任何内容是没有人管的,我们改变其中的值,逐层做hash 最终会影响到 root 的hash 值;如下图所示:
由此可知 我们可以把 coinbase transaction的域 单做 随机数 nonce ,来弥补block header 中 nonce 只有4字节也就是32位的缺点,例如将 其前8个字节 当 nonce随机数用;
正式的挖矿中一般就是两层循环,一层循环nonce 一层循环coinbase 域 的随机数位 ;
transaction
一个普通的交易,output 是之前的哪个交易的output 不是这个交易的output,下方有输入脚本和输出脚本,
将这个交易中的 Input Scripts 和 前一个提供币的来源的交易的 Output Scripts 配对,如果这两个脚本拼接在一起能够顺利的执行,那这个交易就是合法的。
hash puzzles(求解)
上面 H hash 仅仅是对 block header 求hash ,tx 内容并不直接 hash 而是间接汇总到 merkle root hash 值里,在 block header 中 影响到 hash 过程。
出块
伯努利二项分布 独立随机,实验的次数很多成功的概率很低,可以用柏松分布 。概率密度随着出块时间降低,服从指数分布;
已经挖了十分钟如果还没哟挖到,将来还要挖多久才能 挖到的概率不会变化。progress free\memoryless
总共约 2100万个btc
链上信息确认
上图说的是 获得记账权的 M结点恶意,想要把给A的币 又转一份一样的给自己,最后,让自己 M>M` 的链变成长链,从而让 M>A 的链被回滚掉,因为 M>A 的交易中可能伴随着 实物或者其他不可撤回的交易已经到手,所以M就能白嫖到 这个 M>A 的交易中伴随着的不可撤回交易物;
上图是一个失败的 M 恶意结点操作, 6个区块(约一小时)后会认定6个区块前的链为不可篡改链。
当然 ,M>A 后 再 M>M` 伴随着非法的 双花交易,UTXO中无记录,别的诚实结点不会承认这笔交易;
selfish mining
挖到了记账权以后 偷偷藏起来,等于自己偷偷藏了好多个区块,藏了一条链,上图中的 M>A 和M>M` 竞争的时候,突然打出一串链,抢到主链,实现 前面说的 赚到 不可撤回物品的目的;
或者干脆就是 抢主链 赚交易费;
以上的做法有个前提条件,就是你的算力在 这里面要有非常大的比重,最好51%以上,即便这样也是按照概率看的,也可能selfish mining 失败。