主页 > imtoken制作冷钱包 > 【写给程序员】比特币科普文章

【写给程序员】比特币科普文章

imtoken制作冷钱包 2023-10-28 05:12:19

区块链是当前的技术热点之一。 有人将其比作互联网,也有人称区块链没有未来。 可以肯定的是,当大多数人对区块链的认识还停留在比特币等加密数字货币的概念上时,企业和个人已经尝试将其应用到其他领域。 要想对一个事物做出合理的评价,深入的理解是必不可少的,而最快的理解方式就是从具体的应用入手。 最广为人知、最“成功”的区块链应用,仍然是比特币,它是与生俱来的。 网上有很多关于比特币的科普文章,但在我看来,这些文章要么过于抽象,要么过于通俗。 看完了,大概能得出几个概念,但是想一想,还是一头雾水。 本文是根据之前公司培训做的ppt整理而成。 主要阐述了比特币的核心概念。

注:本文旨在帮助大家理解比特币[&区块链],因此部分概念将有意简化,即不保证描述与实际场景完全一致。 关键点以粗体显示。

区块链 = 链接成链的块的集合

比特币发展意义_比特币未来会很值钱吗_比特币未来会如何发展PPT

肯定没有人反对,那么block里面包含的是什么? 暂时可以考虑包括以下内容:

比特币未来会如何发展PPT_比特币发展意义_比特币未来会很值钱吗

关注散列值,它存在于整个区块链中。 目前,散列函数有很多种。 以SHA256为例,有2256种可能的输出(训练时费了很大功夫才让大家对这个数的大小有一个感性的认识)。 哈希函数的特点是不可逆,即给定一个哈希值,基本上不可能计算出对应的输入。 此功能使其防篡改。 例如,在区块被其他节点广播确认后,如果你改变了区块中的其他字段(比如交易的比特币数量,存储在数据字段中),则如果是新数据计算出的哈希值≠ 原始哈希值,那么这个区块一定有问题。 通过这种方式,我们确保了区块的安全性/合法性。

目前,区块链典型应用之一的知识产权保护的关键是防篡改和关联计算。

数据本身的安全性如何? 众所周知,[公共]区块链是匿名的,那么如何知道数据属于谁,谁可以访问数据,这里引入密钥的概念。

密钥:一种用于加密和解密的规则

比特币未来会很值钱吗_比特币发展意义_比特币未来会如何发展PPT

根据加密密钥和解密密钥是否相同,可以分为对称加密和非对称加密。 你一定对它们非常熟悉。 它们在纯加解密方面的优缺点这里不再详述。 就效率而言,前者普遍高于后者。 所以,我们使用非对称加密并不是因为它的加密效果,而是因为它的“非对称”特性带来的好处,这种特性在现实中被用在很多场景中,比如调用第三方openapi,或者更复杂的oauth认证过程中,调用者用私钥对调用信息进行签名,服务器使用调用者的公钥验证调用者的合法性。 这个特性使得匿名和去中心化成为可能,一笔比特币交易可以如下图所示:

比特币未来会如何发展PPT_比特币发展意义_比特币未来会很值钱吗

比特币发展意义_比特币未来会如何发展PPT_比特币未来会很值钱吗

XX将1000B打入Bob的账户(用Bob的公钥加密),Bob的私钥解密取出

公钥不需要包含任何关于 Bob 的个人信息,所以虽然其他人可以使用公钥将数据绑定到这个“帐户”,仅此而已,他们不能也不需要知道公钥属于谁(除非公钥的拥有者泄露个人信息); 只要有人能解密,就说明这个人有对应的私钥,即他的身份是合法的(如果他把私钥给了别人,就无话可说了)。 这样,匿名交易就完成了。

当然,上面的例子是很不精确的。 首先,比特币网络是一个闭环。 Bob不能取出比特币(你见过比特币长啥样吗?),当然也不能主动存入。 这类似于我们在ATM机上只能在账户之间转账,而不能取现; 那么Bob的私钥解密后的比特币去了哪里呢? 答案是当Bob想把钱转入别人的公钥时,他会用私钥转钱; 之前XX转给Bob也是一样。 所以更准确的图如下:

比特币未来会如何发展PPT_比特币未来会很值钱吗_比特币发展意义

比特币交易链

现在让我们看看比特币中的加密和解密过程是如何工作的。

首先我们给它构造交易,可以简单理解为:交易=我的钱转给你=我的钱+转给你。

从上图可以看出:我的钱=别人转给我的公钥我用私钥解密的钱=别人转公钥的钱+我用私钥解密; transfer to you = 多少转给你的公钥key。

翻译成数据结构,例子如下:

    {
        from: {
            上一笔交易to数据的ID: "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

比特币未来会如何发展PPT_比特币未来会很值钱吗_比特币发展意义

key: 私钥解密(用于证明我拥有上一笔交易转出的钱) }, to: { 本笔输出的ID:
"8ae4538afc617cd284d36d135fe09f1a0d2f42a22d890d548f6f65cda45e6f1d2", 转出多少钱: 0.01500000, lock: 公钥加密(只有正确解密才能获得转出的钱) } }

我们将上述代码的钥匙和锁称为脚本。 锁和钥匙可以看作是问题和答案。 请注意,from 中的密钥解密了最后一次转移给我的交易的锁。 比如XX转了一笔钱给Bob,同时设置了一把锁:1+1=? ——? 是占位符,后面会换成key——Bob要花钱的时候,必须提供正确的key值(这里是2),否则无法通过节点的交易验证,并且Bob 还会给这个事务设置锁,等等。 钥匙和锁是可以互换的,只要等式一起成立。

通过将公钥和私钥代入脚本,可以构建如下交易:

XX致鲍勃——

    {

比特币未来会如何发展PPT_比特币未来会很值钱吗_比特币发展意义

from: ……, to: { 本笔输出的ID:
"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18", 转出多少钱: 10, lock: 转入方的公钥 } }

Bob 转发给 Alice——

    {
        from: {
            上一笔交易to数据的ID: "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
            key: ? 解密 (私钥加密(本次交易的散列值)后的密文)=本次交易的散列值

比特币未来会很值钱吗_比特币发展意义_比特币未来会如何发展PPT

}, to: …… }

节点验证Bob转给Alice的交易,会将之前的交易锁和当前的交易秘钥合并,这里是:转账方公钥解密后(私钥加密后(本次交易的哈希值) 密文) = 本次交易的哈希值。 易得,如果公私钥是一对,则等式成立。

所谓节点,可以理解为我们天天听到的比特币矿工。 他们一直收集交易并将它们打包成块,这个过程称为“挖矿”。 挖矿=创建一个新的有效区块,具体过程如下:

交易验证无误后,节点将其放入本地“未确认交易池”; 节点选择部分或全部未确认的交易(一般选择佣金比较高的交易,佣金=从金额-到金额,可以自己找零调整,比如XX转Bob10块,Bob用这个转Alice8块,转自己换1.5块,则佣金为0.5块),放入本地临时块; 计算临时块哈希值。

如图所示:

比特币未来会如何发展PPT_比特币发展意义_比特币未来会很值钱吗

图中最后一个区块的ID是区块链中最后一个有效区块的ID。 哈希值是瞬间计算出来的。 如果交易数据足够多,每秒可以产生数万亿个区块。 这样,吞吐量将得到利用。 但是上亿个区块所承载的数据不一定相同(根据节点自己的选择),更不用说同一个交易被多个节点打包的情况了。 为了账本的一致性,我们需要避免链分支(分叉)),只能将其中一个区块添加到链的末端,即只有一个区块可以被识别为有效。 那么如何选择这个区块并说服其他节点,这就是共识算法需要解决的问题。

比特币使用的共识算法是POW、工作量证明和工作量证明。 说到实现,就是增加计算hash值的难度。 如何改进?

中本聪说,你计算的哈希值必须满足一定的规则,比如必须是数字“9ce4538afc617cd284d361d53fe09f1a0d2f42a26d890d548f6f65cda45e6f1d2”,这样你的区块才能被识别。

此话一出,矿工纷纷吐槽:哇,中大神懂不懂,我把所有的数据(交易)打包了,哈希值还能改吗? 你说重新包装? 选择佣金最低的那个? 请停止炫耀。

比特币发展意义_比特币未来会如何发展PPT_比特币未来会很值钱吗

中本聪说,好吧,给你加一个字段,字段随便取,你算进去哈希值。 该字段值的变化肯定会影响哈希结果,所以,只要找到正确的随机数,就可以得到指定的结果,从而识别出区块。

现在,挖矿变成: 创建一个新的有效区块 = 计算符合规则的哈希值 = 获得一个随机数,使计算出的哈希值符合规则

比特币未来会如何发展PPT_比特币发展意义_比特币未来会很值钱吗

规则是:

比特币未来会很值钱吗_比特币未来会如何发展PPT_比特币发展意义

我们知道 2256 是一个非常大的数字。 求一个随机数(为了覆盖整个输出范围,随机数也必须大小相同),使结果恰好等于其中一个。 以目前的计算机能力比特币未来会如何发展PPT,可能要到时间尽头才能找到。 因此,这个规则的定义太难了。

然后,我们制定一个不难的规则,如下:

比特币发展意义_比特币未来会如何发展PPT_比特币未来会很值钱吗

只要哈希结果落在特定的区间内,这个难度的量化是不言自明的:如果红色区间占据了整个横条,那么难度是最低的,即得到的任意一个哈希值都满足条件,即一开始没有规则 Status; 如果占一半,那么从概率上来说,每两次就会成功一次,难度也不会太大; 如果调整为亿分之一,那么概率需要1亿次试错。 也就是说,我们可以通过调整区间大小来调整计算难度。 比特币目前保持平均10分钟的出块速度,会根据前几次的出块时间自动调整计算难度,这样速度就不会因为硬件发展等因素而改变。 另外,随机数的字节数不需要很大,在比特币中是4个字节。

挖矿时,nonce随机数是未知的。 需要从0到232进行测试,但是这个数字其实并不大,只有4294967296。以目前矿机每秒14T的算力,没必要全部计算到上限。 一秒钟,肯定不可能覆盖难度对应的哈希值域。 所以我们需要用到造币交易中的附带信息,多出来的字符串就成了多出来的nonce。 看看比特币挖矿的计算方式是什么? 区块链的人工验证给出了答案。 至于为什么是10分钟,这个见仁见智。 有人说考虑到网络延迟和带宽,10分钟是比较合适的时间比特币未来会如何发展PPT,也有人认为太长了。 例如,LTC 为 2.5 分钟。 其实这只是中本聪一开始的一个设定。 你要定一个时间,只要不是太短,就可以说是。

挖矿后,节点需要将区块放入链中。 该节点通过p2p向外部广播,其他节点收到该块后验证该块的有效性,如果正确则将该块存储在自己的本地链中,同时继续向外部广播,并开始下一轮挖矿比赛。 通过p2p可以使所有节点的本地链保持一致,从而实现去中心化。

值得讨论的是,如果多个节点同时找到有效的随机数,或者节点在发现新区块到网络确认的时间段内收到其他节点挖矿成功的消息,该选哪个节点?占上风? ? 答案是随意的,因为一般来说,这种临时分叉会随着后续区块的挖出而自动消失,因为比特币更喜欢最长链的分支,除非能保证每个分支的出块率正好是相同,否则总会有一定的时间差,导致其中一个分支变长成为主链,其余分支会被网络抛弃(可能恶意节点维护较短的分支,增加自己的分支)为了将来超越主链的算力,涉及51%攻击)。

在康奈尔大学研究人员 Ittay Eyal 和 Emin Gun Sirer 发表的论文中,他们描述了一个场景,只要他们拥有 25% 的算力,就可以成功攻击比特币网络。 参见自私挖矿:对比特币网络的 25% 攻击