3-BTC实现

简介

transaction- based ledger 基于交易的账簿。

UTXO :

Unspent Transaction Output。 还没有花掉的交易的 输出 的集合。

同一笔交易可能有的输出在 UTXO里面有的不在里面(花掉了),UTXO中的每一个元素要给出 产生这个元素的hash 值,以及它在这个交易里 是第几个输出,就可以定位到这个UTXO中的输出。

UTXO 用于交易前检测 这个钱是不是没有被花掉,每一个 full block 都要维护 UTXO。

transaction free

我们之前说过抢到了记账权 会有一个 block reward,但是 他凭什么给你记账呢?而不去选自己喜欢的人加入 这个区块的账簿中呢?这里就涉及到我们说的交易费用。

截屏2024-11-13 21.41.15

每隔21万个区块减半

btc 设计的每隔10分钟会有一个新的区块产生。

设计了 每隔21万个区块,就要减半一次。所以大约4年一次减半。

截屏2024-11-13 21.47.57

account-based ledger 基于账户的账簿

block介绍

截屏2024-11-13 21.53.10

上面的例子解释一下:

(左)

这个区块中包括 686 个交易

总输出 XXX 个btc

总交易费

height 是区块的高度也就是 区块的序号;

时间戳

挖矿难度(每隔2016个block调整一次难度,为了保证出块时间在 10分钟左右。)

nonce 随机数,这个是最后找到的符合难度要求的 nonce;

出块奖励

(右)

区块的头的 hash 值; 调整 nonce 让 H(block header) <= target ,成立的这个hash值。

前一个区块的头的 hash 值;

merkle root ,前面说过的,它来验证 交易是否在 block body 中。

block header

截屏2024-11-13 22.08.40

这个随机数,是一个32位的无符号整数。

由于 miner 太多,32位的无符号整数即便是遍历完 也无法满足 提高target难度的要求,要给出更多的空间去给miner 去算,我们看看 block header 的内容。

截屏2024-11-13 22.11.58

看看还有哪些内容是可以变的。

其中 merkle根hash 值 改的比较多。

coinbase transaction(铸币交易)

每一个 发布的 block 中 有一个 铸币交易(coinbase transaction),btc 产生新的币的唯一方式;截屏2024-11-17 21.54.50

我们可以看见 coinbase transaction 是没有输入的,属于 凭空创造;CoinBase 内写入任何内容是没有人管的,我们改变其中的值,逐层做hash 最终会影响到 root 的hash 值;如下图所示:

截屏2024-11-17 22.01.10

由此可知 我们可以把 coinbase transaction的域 单做 随机数 nonce ,来弥补block header 中 nonce 只有4字节也就是32位的缺点,例如将 其前8个字节 当 nonce随机数用;

正式的挖矿中一般就是两层循环,一层循环nonce 一层循环coinbase 域 的随机数位 ;

transaction

截屏2024-11-17 22.15.54

一个普通的交易,output 是之前的哪个交易的output 不是这个交易的output,下方有输入脚本和输出脚本,

截屏2024-11-17 22.21.23

将这个交易中的 Input Scripts 和 前一个提供币的来源的交易的 Output Scripts 配对,如果这两个脚本拼接在一起能够顺利的执行,那这个交易就是合法的。

hash puzzles(求解)

截屏2024-11-17 22.30.56

上面 H hash 仅仅是对 block header 求hash ,tx 内容并不直接 hash 而是间接汇总到 merkle root hash 值里,在 block header 中 影响到 hash 过程。

出块

截屏2024-11-17 22.40.08

伯努利二项分布 独立随机,实验的次数很多成功的概率很低,可以用柏松分布 。概率密度随着出块时间降低,服从指数分布;

已经挖了十分钟如果还没哟挖到,将来还要挖多久才能 挖到的概率不会变化。progress free\memoryless截屏2024-11-17 23.04.17

总共约 2100万个btc

链上信息确认

截屏2024-11-17 23.21.07

上图说的是 获得记账权的 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 失败。