主页 > imtoken安全码 > btc合法吗 BTC-变现(3)

btc合法吗 BTC-变现(3)

imtoken安全码 2023-04-12 07:35:36

BTC-实施

区块链是一种去中心化的账本,比特币采用基于交易的账本模型。 但是,系统并没有显示记录账户中包含比特币的数量。 事实上,它需要从交易记录中计算出来。 在比特币系统中,全节点需要维护一个名为**UTXO(Unspent Transaction Output 未花费交易输出)**的数据结构。

UTXO 集合中的每个元素都应给出生成此输出的交易的哈希值,以及它在交易中的哪个输出。 通过这两条信息,可以定位UTXO中的输出。

每笔交易都会消耗输出,但也会产生新的输出。

如果有人收到 BTC 转账但从未花费过,那么此信息将始终存储在 UTXO 中。 这种情况可能是用户不想花费这些BTC(比如:中本聪),也可能是忘记了私钥,无法花费。 因此,UTXO 逐渐增加,但目前,数据可以完全存储在一个普通的服务器硬盘中。

每个交易可以有多个输入和多个输出,但输入的总和必须等于输出的总和(总输入 = 总输出)。

有一些交易的总输入略大于总输出,这个差额作为交易手续费,交给有记账权的节点。 公开课笔记4中最后提到“交易记录保存在区块中,如果只设置区块奖励,会不会有节点只想发布区块获得区块奖励而不打包交易?”

因此,BTC系统设计了交易手续费(transaction fee)。 获得记账权的节点,除了获得区块奖励外,还可以获得打包交易的手续费。 但目前,交易手续费远低于区块奖励。 当未来区块奖励减少时,区块链的维护可能主要靠交易手续费。

比特币是一种基于交易的模型,与之相对应的,还有一种基于账户的模型(如:以太坊)。 根据账户模式要求,系统显示记录账户余额。 也就是说可以直接查询当前账户余额的币种。 可见比特币模式具有更好的隐私性,但也付出了一定的代价。 在进行交易时,由于没有账户的概念,无法知道账户中还剩多少BTC,所以必须说明币种的来源(防止双花攻击)。模型自然避免了这个缺陷。 转账交易是一个(多个)账户余额的数字减法和另一个(多个)账户余额的数字加法。

BTC系统中的具体区块信息

如下图,是一个区块的信息(截取自视频中的截图btc合法吗,来自blockchain.info)

image-20210818104151181

可以看出,区块哈希和前一个区块哈希都是以一长串0开头,挖矿本身就是尝试各种nonce,使得生成的区块哈希值小于或等于目标阈值。 目标阈值,用十六进制表示btc合法吗,前面是一长串0

以下是区块头代码中实现的数据结构。 其中的几个字段在公开课的注释4(比特币区块信息)中已经有说明,这里不再赘述。

image-20210818104202176

可以看出nonce是一个32位的无符号整数数据,在挖矿的过程中不断调整,但是可以看出nonce的值最多为2^32(2的32次方)。 但是并不需要遍历所有这些nonce,才能找到符合要求的nonce。 由于这几年矿工越来越多,挖矿难度调整的比较大(难度调整请关注后续博文,会有专门的难度调整介绍),搜索2^32的空间太小了,只调整nonce不一定能得到正确的结果。

还有哪些域可以调整?

下图是区块头中各个字段的描述。 仅仅调整nonce是不够的,可以通过修改Merkle Tree的根哈希值来调整。

思考:打包的交易和顺序确定了,根哈希值不就确定了吗? 如何修改?

Coinbase 交易(coinbase 交易)

image-20210818104219008

公开课笔记4中提到,每一个发布区块的人都可以获得快速奖励,即他可以在该区块中发布一个铸币交易(coinbase transaction),这也是产生新比特币的唯一途径在比特币系统中。 以下是一次铸币交易的内容:

image-20210818104230926

如你所见,有一个 CoinBase 字段,可以在其中写入任何内容,这里写什么都没有关系。 所以你可以在这里添加一些任意的信息,这样它就不能被篡改(也不能被删除)。

(比如:提前写股票预测结果的hash值,写人生感谢,写爱情誓言(不能删除,想想十年前发的非主流QQ空间删不掉的痛苦,呵呵呵呵) )

因此,我们只要改变写入的内容,就可以改变Merkle Tree的根哈希值。

k

下图显示了一个小型区块链。 假设左下角的交易是coinbase交易,可以看出交易的变化会一步步往上传递,最后Merkle Tree的根哈希值会发生变化。

image-20210817230432727

因此,在实际挖矿中,有两层流通。 外层循环调整coinbase字段(可以规定只用它的前x字节作为另一个nonce),计算出区块头中的root hash值后,内层循环再次调整nonce。

普通转账交易

image-20210818104243122

如果输入脚本和输出脚本的拼接能够顺利无误地执行,则交易是合法的。

采矿过程的概率分析

挖矿本质上就是不断尝试各种nonce来解开这样一个谜题。 随机数的每次尝试都可以被视为伯努利试验。 最典型的伯努利实验就是抛硬币,正面和反面的概率分别为p和1-p。 在采矿过程中,伯努利实验成功的概率非常小,失败的概率非常高。 挖矿就是多次进行伯努利实验,每次都是随机的。 这些伯努利试验构成了一系列独立的伯努利试验(a series of independent Bernoulli trials)。 根据概率论的相关知识,伯努利实验本身是没有记忆的。 也就是说无论之前做了多少次实验,都不会对后面的实验产生任何影响(车牌摇号也是一样,心痛。。。)。

对于挖矿来说,就是通过多次伯努利实验来尝试随机数,最终找到一个符合要求的随机数。 在这种情况下,可以使用泊松分布进行近似,因此从概率论可以推断出系统出块时间服从指数分布。 (需要注意的是,出块时间指的是整个系统的出块时间,不是挖矿个体的出块时间)

image-20210818104254101

系统平均出块时间为10分钟,这是为系统本身设计的,通过难度调整维持平均出块时间。

指数分布本身也是无记忆的。 也就是说,对于整个系统来说,10分钟过去了,还没有人挖出一个区块,所以平均还需要等10分钟(很违反直觉)。 换句话说,你未来要挖多久,与你已经挖了多久没有关系。

虽然这看起来像是一件可怕的事情,但过去的工作可能是徒劳的。 但实际上,这是挖矿公平性的保证。 对于在算力上有优势的矿工来说,他们之前所做的很多工作可能还是白费了。

比特币总量计算

image-20210818104303973

也就是说,比特币系统中已开采和未开采的比特币总数为 2100 万枚。

事实上,挖矿的运作并不是在解决数学问题,而是一种纯粹的算力比拼。 也就是说,挖矿的过程没有任何实际意义,但挖矿的过程对维持比特币系统的稳定起到了重要作用。

因此,只要大部分算力掌握在好的节点手中,就可以保证比特币系统的稳定性。

比特币越来越难挖,区块奖励越来越少,是否意味着它未来挖矿的动力会越来越低?

事实上,恰恰相反。 在比特币容易挖矿的早期,比特币并不被人们看好。 后来,比特币的估值提高,吸引了其他人参与挖矿,进一步推动了比特币价值的提升,进而吸引了更多的人。 参与其中。

当区块奖励趋于 0 时,整个系统将依赖交易手续费运行,交易手续费将成为维持比特币系统运行的重要保障。

比特币系统安全分析

比特币通过挖矿获得保障

大部分算力掌握在好用户手中,能否保证不良交易记录不会被写入区块链?

需要注意的是,算力低的用户并不是完全无法获得记账权,只是概率很小的问题。 但实际上,即使是一个算力很小的恶意节点,也有一定的概率获得某个区块的记账权。

如何防范这种攻击? ? ?

如果M->B交易之后有好几个区块,如下图,大多数诚实节点是不会认出后面的链的。 于是,就变成了恶意节点挖下链,其他节点挖上链的算力竞争。 由于区块链中的大部分节点都是良性节点,上链最终会获胜,而恶意节点的链将得不到认可,造成投资成本的浪费。

image-20210818104322917

因此,一个简单的预防措施是等待更多的确认块。 在比特币协议中,默认情况下需要等待 6 个确认块才能认为记录是不可变的。 平均出块时间为10分钟,确认6个区块需要1小时。 可以看出等待时间比较长。

需要注意的是,在比特币系统中,如果出现以下情况,各节点将使用自己先收到的区块所在的链作为主链,不会识别后收到的合法区块(但会先保存) . 这时就变成了分两批算力去挖1和2,哪一条成为主链取决于哪条链先挖下一个区块,这样两条等长合法链的长度不一致,并且最终的赢家成为最长的合法链条。

image-20210818104338549