主页 > imtoken官方app > 算力btc数量 比特币协议

算力btc数量 比特币协议

imtoken官方app 2023-08-17 05:13:08

如果先去掉去中心化的前提,我们都信任中央银行这样的中心化机构。 中央银行在印钞厂印钱后发行货币等等。 这是我们过去最常见的方式。 纸币等等,但是你想想如果央行不发行实物货币,而是发行虚拟货币,(我们都知道央行的公钥)我跟你交易的时候把这个虚拟货币转给你,还有你验证的是央行发行的货币吗? 这个想法好像没问题。 这只使用了密码学中公私钥体系的非对称加密算法,并没有使用区块链。 因为这是一个文件,这个文件有中央银行的签字,所以文件的内容是不能伪造的,但是我可以复印一份或者多份,这和实物货币是不一样的。 如果我有 100 元,我会从你这里买。 我付给你一百元,我没有一百元。 我不能花两次或更多。 这就是数字货币和实物货币的区别。 这叫二次攻击:double spending attack,数字货币面临的主要挑战之一就是如何解决double spending attack(两次花费),改进刚才的方法因为人民币是有编号的,那我要这个数字货币也添加一个数字,然后中央银行将维护一个数据库。 举个例子,我拿到一个edit number为1的数字货币,如果我给你这个数字货币,你不仅要验证是不是央行的,还要验证我的编号。 币花完了吗? 同时央行会改,因为我给你这个数字货币,那么这个数字货币就在你手里。 如果我有一个不好的想法,我复制了这个数字货币,我会把它给别人,这样别人就可以通过这个方法知道我是否在重复使用这个货币。 这样就解决了双花攻击的问题。 这个方案是正确的,可以在实践中使用,但它是一个中心化的方案。 数字货币的发行由中央银行控制,每一笔交易都需要得到中央银行的确认以证明其价值。 合法性,按照这个方法,我们能不能制定一个去中心化的解决方案,把中央银行的职能转给广大用户? 这是比特币数字货币体系需要解决的问题。 去中心化货币需要解决两个问题。 一是发行数字货币。 谁有权决定数字货币的发行? 现在是去中心化的,没有中央银行,什么时候发行,发行多少,应该由用户来决定。 第二个问题是如何验证交易的有效性,以及如何防止上面的双花攻击(spending twice)。

第一个问题是谁来发行货币。 在比特币系统中,由挖矿决定。 第二个问题是如何解决双花攻击(spend twice)。 其实解决方案和上面类似,也需要维护一个数据结构来检查这个币之前是否被使用过。 只是这个数据结构不是由央行维护,而是由所有用户共同维护。 这个数据结构就是区块链。比如用户A获得了货币发行权(铸币权),那么他发行了十个比特币

比特币系统中的每笔交易都包括输入和输出两部分。 输入部分要说明币的来源,输出部分要给出输入人公钥的hash。 比如A每人转了5个比特币给BC。 而B将2、3个比特币转入CD,转账过程中B还需要签字说明币的来源。 这个时候C把币给了E,这个时候E的证明有点过分了。 如上图所示,这就形成了一个小区块链。 注意里面有两种哈希指针。 第一个是将它们串成一个链表。 第二种哈希指针指向一个之前的交易。 为了解释货币的来源,为什么要解释货币的来源? 首先要证明货币不是凭空捏造的。 第二,防止双重支出攻击(spending twice)。 比如B已经给C和D转了钱,但是B又来了一趟要转给F,签名还是B的签名。 只看签名是没有问题的,但是检查币种来源就可以发现问题了。 这有效地防止了双花攻击(花费两次)。 回顾交易,你有没有想到一个问题? A和B进行交易时,B是否只需要知道A有没有转账,转了多少钱,A只需要知道B的公钥就可以了? 这种说法似乎是正确的。 是的,但也不行,因为B在交易过程中也需要知道A的公钥。 一种解释是,我想知道钱是从哪里来的,是谁给我的。 A的公钥是A的身份,所以B知道是A,把钱转给我。

其实还有一个更重要的原因,不仅仅是B需要知道A的公钥,所有的节点都需要知道A的公钥。 为什么? 为了验证A的签名,如果转账交易合法,就必须有A的签名。 我们都知道签名都是私钥签名公钥验证,所以区块链上的每个节点都需要独立验证,因为有些节点可能有恶意,不能依赖别人,所以当我收到这个交易的时候,我要验证它是否合法与否。 我是旁观者,需要验证,所以大家需要知道A的公钥。 那么问题来了,我们怎么才能知道A的公钥呢? A的公钥是自己在本次交易中给出的。 A把输入转给B,你需要知道货币的来源。 在输入中,还必须说明 A 的公钥是什么。 会有一些人为的安全漏洞。 如何为每笔交易避免这个问题。 两者都分为输入和输出两部分。 输入部分应注明币种来源和A的公钥,输出部分应注明付款方公钥的哈希值。 那么A的币就是在铸币交易中产生的。 其输出包含A的公钥哈希,所以本次转账中A的公钥必须与币源公钥的哈希一致。 如果不对,就说明这个币不是给你的,所以正好解决了人为伪造公钥的安全漏洞。 所以这些指向硬币来源的哈希指针非常有用。 在比特币系统中,这些验证过程是通过执行脚本来实现的。 每笔交易的输入是包含给定公钥的脚本,公钥也在脚本中,每笔交易的输出也是验证是否合法的脚本。 最重要的是结合当前交易的输入脚本和提供币种来源的输出脚本,看能否顺利执行。 如果能执行,就说明是合法的,否则就是非法的。

上例中,A的输入脚本拼接在上一笔交易的输出脚本下,一起运行。 如果没有错误,则通过。

上图简化了比特币的一些细节。 在实际系统中,每个区块可以包含很多交易。 这些交易被组织成一棵默克尔树(Merkle Tree)。 每个区块分为区块头和区块体。 两部分(Block header, Block body)包含了一些宏观信息,比如使用的是哪个版本的比特币协议,以及区块链中指向上一个区块的指针,以及整个默克尔树(Merkle tree)的根哈希值)为挖矿目标和随机数nonce,整个区块头的hash必须小于等于目标预置值H(区块头)≤目标区块头存储的是目标预置的编码值(n 位)。 这里需要注意的是,前一个区块的哈希值只算作该区块的区块头。 只有块头可以将块连接在一起。 块体呢? 有交易列表,不管区块头的区块体是什么,都取哈希,Merkle根哈希可以保证这里的交易列表(交易记录)不可篡改。

上述理论也有一个简化的假设。 据说每个节点都需要验证交易。 在实践中,系统中的节点分为全节点和轻节点。 全节点(full node)存储所有信息并验证每笔交易。 所以全节点也叫(fully validating node)轻节点(light node),它只保存Block header,一般来说,轻节点没有办法独立验证交易的合法性

例如算力btc数量,如果这笔交易是一次消费攻击(两次消费),轻节点不知道,因为它没有存储以前的交易,所以无法发现。 系统中的大部分节点其实都是轻节点,全节点的数量并不是很多。

一个问题,这些内容是如何写入区块链的?每个节点都可以发布交易,对吧,每个账户都可以发布交易

该交易被广播到所有节点。 有些交易是合法的,有些交易可能是非法的。 那么谁来决定下一个区块写入哪笔交易呢? 它们应该以什么顺序书写? 如果每个节点自己决定呢?比如我是一个节点,我收到各种交易,我判断哪些是合法的,哪些是非法的,然后打包写入下一个区块中构建本地区块链

每个节点独立决定好不好? 这肯定是不可能的,因为一致性不同。 我本地区块链和你本地区块链中的数据可能不一致。 什么是区块链? 它是一个去中心化的分类账。 既然是账本,账本的内容就必须统一。 不然的话,我记得的账本和你记得的账本不一样,那么最后计算用哪个账本呢? 正确的。 在分布式数据方面,称为账本的内容需要获得分布式共识。 分布式共识的一个简单例子是分布式哈希表。 比如系统中有很多机器共同维护一个全局哈希表,那么这里需要约定的内容就是键值对(key-value pairs)。 比如有人在我的机器A上插入一个键值对(key-value pairs)12345

然后不能在另一台机器上读取它。 这称为全局哈希表。 关于这种分布式共识有很多理论研究。 学术界研究了很多年,有很多不可能的结论(impossibility resalt),最著名的就是FLP impossibility resalt。 这三个大写字母是三位作者姓氏的大写字母。 他们都是分布式系统方面的专家。 他们的结论是什么? 在异步系统(asynchronras)中没有网络传输延迟。 上线时称为异步系统,即使有一个成员出现故障,也无法达成共识。 如果一个成员有错误,则无法达成共识,还有一个结论,也是著名的 CAP 定理。 三个字母 CAP 指的是分布式系统的三个属性。 我们要的三个属性是C.:Consistency(一致性),A:Aailability(有效性),

P:Partition tolerance(分区容忍度),这个CAP Theorem是指任何分布式系统,比如这个分布式哈希表至多只能满足这三个属性中的两个,不可能三个属性都满足。

一个著名的分布式共识协议:Paxos,这个协议可以保证一致性。 如果这个协议达成共识,那么这个共识必须是一致的。 不会说一个成员认为的共识与另一个成员认为的共识不同。 不是的,一定是Consistency(一致性),但是在某些情况下,这个Paxos不一定一直都能达成共识。 这种可能性在实践中比较小,但客观上也是存在的。 这些扩展和比特币之间的实际关系并不大。

说说比特币中的共识协议(Consensus in BitCoin)

比特币中共识要解决的问题之一是部分节点可能存在恶意。 我们假设系统中的大部分节点都是好的,恶意的只是一小部分。 那么在这种情况下如何设计共识协议呢?

如果这里使用投票,会出现很多问题,比如时间的问题,部分节点不作为的问题等等。

这里一个更大的问题是谁将投票。 任何基于投票的方案都必须首先确定谁有投票权。 必须有成员资格(资格)的问题。 如果严格定义这个区块链的成员(资格),并不意味着任何人都可以加入。 有的叫联盟链,只有一定条件的才能加入。 在这种情况下,下面基于投票的方案是可行的,因为它假设大多数人是好的,所以这是可行的,但在比特币系统中并非如此。 在比特币系统中创建账户并在本地生成公私密钥对非常容易。 也就是说,一个帐户不需要任何人的批准。 事实上,没有其他人知道您已经创建了一个帐户。 只有当你与外界产生交易时,别人才会知道。 那么这样的恶意节点就可以抓住这个漏洞,使用超级计算机来规避。 只要被封号的账号数量超过总票数的一半,那么就结束了,它就可以操纵投票结果了。 这叫做女巫攻击(sybil attack),那怎么办呢?简单的直接投票不行

比特币系统使用了一个非常聪明的机制来解决这个问题。 也采用投票,但不是根据账户数量,而是根据算力。 每个节点都可以在本地组装一个候选块并认为它是合法的。 把交易放到这个区块里,尝试各种nonce(随机数)值,回忆一下我之前写的

H(block header)≤ target 块头中有一个字段是一个随机数nonce。 组装后,尝试各种随机数。 这是一个4bytes,看哪个能满足这个不等式的要求。 找出来。 如果西洛落在指定的范围内,如果一个节点找到了与该节点匹配的nonce,则称它获得了记账权。 这种记账权是在比特币去中心化账本中写入下一个区块的权利。 只有找到这个 nonce 节点才有资格发布下一个区块。 其他节点收到区块后,必须验证区块的合法性。 比如首先验证区块头的内容是否正确,比如在区块头中有一个nBits字段,它实际上是目标预置值的一种编码。 检查nBits字段是否满足难度要求,然后检查nonce选择的nonce是否为区块头的hash≤目标预置值,换句话说,你真的有权利发布一个堵塞? 只需检查区块头中的所有项目并假设它们都符合要求,然后检查区块体中的交易列表以验证每笔交易是否合法。 第一个是合法的签名,第二个是之前没花过。 如果任何一个有问题,那么这个块就不能被接受,必须被丢弃。 假设一个区块经过检查符合要求,但我们仍然不愿意接受它,有没有这种可能?

如下所示:

如果某个节点是恶意的,则该节点可能没有收到它。

假设有一个节点获得了记账权来发布这个绿色区块,这个绿色区块中的一切都是合法的。 我们应该接受吗? 它插在中间。 插在这里有什么问题吗? 在这次交易之前,A把钱转给了B,但是在这个绿色的区块里,A把钱转给了自己。 这笔交易是合法的。 你可能会想A为什么要把B转让给自己。 这不是双重支出。 攻击? 判断一笔交易是否属于双花攻击,取决于区块所在的分支。 在这个分支上,硬币是否被花费了两次。 这个绿色的分支从一开始就不存在,比如A转B币 来源是第二个区块中的C转给A,所以要验证这个是币的来源和币之间是否已经花费了当前交易中间的区块还没有被花费,所以这笔交易是合法的。 但这让人难以接受。 这个绿色区块实际上回滚了上面的转账交易。 虽然这笔交易是合法的,但它并不在最长合法链(logest valid chai)上。 它是最长的合法链,后面的一个等于它的分支,也就是说比特币协议中接受的区块应该是延长的最长合法链,它后面应该是合法区块。 这个例子实际上是一个分叉攻击的例子

通过在区块链中间插入一个区块,回滚一个已经发生的交易。区块链在正常情况下也可能出现分叉

即如果两个节点同时获得记账权,则两个节点都在本地组装一个块,然后尝试各种nonce。 如果两个节点几乎同时找到了满足要求的相同nonce,则它们都可以在出块后,出现如上图所示的两个长度相等的分叉。 如果遵循最长法律链的原则,这两个是最长的,法律链应该接受哪一个?

默认情况下算力btc数量,在比特币协议中,每个节点首先接受它收到的节点,因此不同的节点根据其在网络中的位置接收不同的块。 有的节点可能先收到上面的,有的节点可能先收到。 下面的会先收到,那么什么是接收块

如何区分是否收到? 比特币协议中使用的称为本地链上。 如果它沿着你的街区向下延伸,它将被认为是你的释放。 比如收到上面的block之后,向下延伸一个block。 一个区块被批准,否则表示该区块未被批准。 如果系统中有两个矿工和两个节点同时发布区块,这种等长的临时分叉会持续一段时间。 知道有某一个分叉就是赢家,没有赢的就被丢弃。

发生这种情况时,您如何判断谁赢谁输?

这种情况就看谁的算力强,谁的运气好。 并不一定代表算力强的就赢,也不一定代表算力弱的就输。

还有,为什么会有人来争夺记账权? 这种记账权有什么好处?

先获得记账权的节点本身有一定的权利,可以决定哪些交易写入下一个区块,但这应该不是记账权的主要驱动力。 如果已经是驱动力,那就有问题了,因为我们希望所有合法的交易都应该写入区块链。 比特币设计了一个非常聪明的机制来解决这个问题。 这称为区块奖励。 账权节点可以在发布的区块中有一笔特殊的交易,就是之前的铸币交易。 在这个交易中,可以发行一定数量的比特币。 这就是如何验证交易的合法性。 现在回过头来看第一个问题,谁来决定发行货币,这种铸币交易是比特币系统中唯一发行新比特币的方式,其他一切只是将现有的比特币转移到另一个账户

包括有时候我们用美元去买比特币,这样就不会产生新的比特币。 这只是一个交换。 只有铸币交易是产生新比特币的唯一途径。 此交易不需要指定硬币的来源。 因为这个币是凭空产生的,怎么能少铸币呢? 当初比特币刚推出的时候,每个发布的区块可以产生50个比特币,但是​​协议规定,满21万个比特币后奖励减半为25个比特币,满21万个比特币后减半为12.5个比特币。 以此类推,比特币好像跌得很快,现在竞争比以前激烈多了,但是想想。 一开始,没有人这样做,就像房价一样。 本来价值不高,后来又稀有又昂贵。 后来比特币的价值开始一路暴涨,这也是为什么有很多节点在争夺这个记账权的原因。 那么失败区块的区块奖励就没有了。

一个问题,比特币需要达成的共识是什么?

上面给出的例子是分布式哈希表。 在该示例中,必须实现表内容中包含的键值对。 比特币要达成的共识是什么? 这个去中心化账本中的内容,那么谁能决定这个账本的内容呢? 只有获得记账权的节点才能写入。 如何取得记账权? 就是写这个H(block header)≤ target,那为什么说比特币的共识机制是靠算力来投票呢? 正因为如此,puzzle friendly 才能保证解题过程中没有捷径可走。 一个节点的算力是某个节点的十倍,因此获得记账权的概率也是该节点的十倍。 投票取决于计算能力。 这取决于你每秒要投票多少个nonce,哈希率(算力)决定了投票的权重。

你可能会想到女巫攻击(sybil attack)。 如果直接投票,就会出现女巫攻击(sybil attack),但实际上并不是因为他是靠算力投票的。 即使您创建的帐户更少,也没有任何效果。 这不会让你哈希率(算力)如何,不会影响你每秒尝试的nonce,所以投票权重没有改变。

比特币争夺记账权的一种说法也叫挖矿(mining)。 这是一个比较形象的说法,因为有人把比特币称为数字黄金,所以找到一个合法的nonce就像淘金一样,所以争夺记账权的节点称为矿工。 如果他获得了记账权,我们就说他挖了矿或者挖了块。 你可以把区块链中的每一个区块理解为被挖出来的。 因为这和之前的淘金一样,在很大的空间里想要找到一件小东西可不是件容易的事。