区块链网站|NFTS BTC教学指南 关于比特币的十个问题

关于比特币的十个问题

广告位

十问比特币

来源|鸵鸟区块链

摘要:无论市场形势如何,我们都需要花一些时间去研究和思考。本文将以一问一答的形式追溯比特币的设计逻辑,以及中本聪如何巧妙地将一系列技术结合起来,再用经济学原理解决技术上无法解决的问题,从而证明任何单一的技术特征都不构成区块链的本质。

这两天的心情估计和过年一样。

之前的那些日子,有人黯然离场,有人静下心来思考。

但是,无论如何,静下心来思考,永远是正确的选择。一方面,必然的价格决定信仰;另一方面,作为各种技术的结合,区块链有太多的概念可以被窃取、炒作和混淆。

所以在这个特殊的时间,我带着一些疑问回到比特币的设计逻辑。中本聪的伟大之处在于巧妙地将一系列技术结合起来,用经济学原理解决了技术上无法解决的问题。任何单一的技术特征都不能构成区块链的精髓。

当从不同角度解读区块链很正常的时候,我特别想穿越时空,回到中本聪设计比特币的现场,探究他是如何思考的。背后的逻辑是什么?所以我试着用这篇文章来讨论中本聪是如何一步步设计出“点对点电子现金系统”的,以及如何将这些区块链中使用的核心技术与逻辑联系起来:

对等网络、非对称加密签名、哈希函数、UTXO、智能合约、分布式账本、共识机制、区块链结构等。

其中,中本聪贡献了UTXO交易簿记方法,并创新性地将这些技术与经济激励结合起来。

接下来,我们开始把这些技术和提出问题、解决问题的想法结合起来。

问题1:如何理解电子现金和记账?

既然要设计一个电子现金系统,那就先讨论一下电子现金的概念。

如果给出上面的笔记本,我们认为什么情况下可以这样保存?

情况一:在银行系统,神V支付1元钱给本聪。

针对该交易,银行将在其自己的账户中进行转账:

这种记账本质上是债务的转移。本来银行欠V神1元,却变成了银行欠本聪1元。即本聪有权用这笔费用向银行提现1元。

情况二:现实中,本聪找V神借1元钱。

这时,神V会给本聪一张白条:

将来,本蚕丛会用这张白条向上帝索要欠款。

场景三:对等网络中,V神向本聪发送1元电子现金。

这个时候,神V居然发来了账号。如果大家都认同账户中的1元钱,也就是大家都愿意兑现,那么基于比特流的账户就可以作为电子现金在网络中自由流通。

情况四:神V付给本聪一元现金。

在这种情况下,实物转移后实物现金已经入账,但钱本质上也是这样的账。本聪拿着1元现金,最后想把这1元纸币的价值兑现给社会。

我们可以看到,四种情况虽然不同,但可以采用相同的记账方法。电子现金系统本质上是在网络上用账本记录价值的转移,但网络的自由性使得价值的传递面临不可避免的风险。

问题二:电子现金在单笔转账中可能会产生哪些问题?

为了分析方便,我们借用场景3“V神送1元电子现金给本聪”,暂时搁置电子现金的问题。

我们在网络中收发电子现金有以下几种记账方式会出现什么问题?

1.我们不知道发送或接收这个交易的人是本聪还是V神本人,即真实身份和网络身份不能真正对应;

2.本聪或者V神可以否认这个记账,谎称没有发生交易;

3.本聪或V神篡改交易;

这三个问题的实质是:

1.身份的真实性(与交易相对应):确认交易的发起方和接收方。

2.交易事实:交易是否真实发生,无法伪造。

3.事实不可篡改:交易后不可篡改。

针对这些问题,我们寻找解决方案。

问题三:如何解决交易的真实性?确保交易不能被伪造或篡改?

1.传统思维:集中担保记账。

我们通常的做法是用可信的第三方做担保,比如V神和本聪的好朋友BM做担保:

会计格式(一式三份)

这种记账方法的学术术语是“三式记账法”。基于BM的公信力,BM可以对V神和本聪的身份真实性以及双方交易的事实进行认证。之后任何一方篡改交易都可以找到BM的记账本实现仲裁。

但是如果BM作恶了呢?

问题4:如何防止仲裁员作恶?

针对如何防止仲裁者作恶,实际上我们在思考如何在一个网络中进行点对点的自由支付,既可以保证支付的安全性,又不需要中间人的帮助。

为了实现这种安全性,我们首先介绍一种技术:非对称加密签名。

首先,简要说明数字签名生成和验证的过程:

1生成:使用generateKeys方法输入keysize来生成一对公钥和私钥。

2签名:将一个消息和私钥作为输入,输出一个签名的消息。

3验证:输入一个消息、一个签名消息和一个公钥,输出为真,则签名为真。

我们可以通过使用非对称加密签名来解决两个问题:

1.公私钥就是身份,解决了身份问题,具有一定的匿名性。钱包地址是公钥的哈希值;

2.可以用对应于私钥的公钥来验证交易的真实性。

我们使用数字签名实现如下记账:

在这次支付中,本蚕丛使用V神的公钥来验证支付,并确认它是由V神支付和签名的,从而实现:

1.真实性:只有私钥的所有者可以签署自己的付款。

2.真实性:公钥验证支付,证明支付已经发生,没有私钥,无法伪造。

3.不可篡改:没有私钥,就不能修改已确认的交易。

那么就出现了一个新的问题。如果私钥的所有者篡改了交易会怎样?

另一方面,上述支付只发生在两个人之间。实际上,支付发生在一个更大的网络中。网络中各节点如何确认支付是否被自己篡改,账户中是否有足够余额?

问题五:随着P2P网络中节点和交易的增加,如何保证支付的有序和防篡改?

假设在第一笔交易的基础上增加了一些交易(交易1“V神付给本聪1元钱”):

交易2 V神付2元给本聪。

交易3本聪支付1元给V神。

交易4本聪支付2元给BM。

首先,在P2P网络中,为了让每个节点验证全网的所有支付,每个支付都必须广播到全网,这样每个节点才能接收并记录全网的支付,并做出判断。

当V神收到交易2和交易3时,因为是两个节点之间的有限交易,所以更容易判断交易的有效性。

第三节介绍,当BM收到交易4时,作为一个新节点,需要重新验证之前的所有交易,判断本聪的账户中是否有余额支付,因此需要检索和引用之前的交易。本聪还需要在《支付4》中提供证明其支付能力的证明。

此时,为了验证已经发生的交易的支付,我们引入一个技术散列指针:

hash函数简单的解释就是任意长度的输入经过hash计算后都可以生成定长输出。

哈希函数有三个特征:

1.输入和输出之间存在唯一的对应关系,即使两个输入之间的差异很小,也无法获得相同的哈希值。

2.如果哈希值已知,则不能反向计算输入值。

3.哈希计算不规则。要得到特定的值或者特定的域哈希值,只能尝试随机输入。

这些功能可用于轻松关联两项付款:

一方面,哈希指针指向的前一笔支付可以很容易地计算出前一笔交易的哈希值,判断是否等于这个哈希值,确定上下文;

另一方面,如果前面的事务有任何细微的变化,就不可能计算出相同的哈希值,这苏恩

如下,支付1、2、3和4用散列指针连接成一个链。一方面可以确认所有支付的顺序,另一方面已经发生的支付不能被篡改。

根据前三笔交易,本聪仍有支付2中收到的2元,本蚕丛在支付4中用哈希指针直接引用支付2,即用V神支付的2元支付BM。

当BM收到该款项时:

1.您可以使用哈希链来确保以前的每个事务都没有被篡改。

2.如果不放心,还可以用本聪和V神的公钥来验证所有交易的真实性。

3.审核所有交易,并确认Ben Cong对付款2的引用有效且正确。

到目前为止,我们已经在有限节点系统中实现了非对称加密技术、P2P网络广播和哈希链结构:

1.非对称签名解决了没有中间人的点对点支付,保证了支付对应的唯一网络身份(公钥和私钥)的真实性和不可伪造性。

2.账簿记录已经发生的付款,可以按照顺序依次用哈希指针连接,保证不可篡改,同时方便查阅账目中的付款。

但现实中,我们面临的是更大规模的点对点支付需求,这引发了我们的新思考:

1.支付规模快速增长后,我们应该选择什么样的记账方式来更高效地记录和审核交易?

2.已经发生的交易因为哈希链结构无法篡改,但是如何避免现在发生的重复支付?

比如,本聪向BM支付2元后,向第四个人发起支付5,用同样的2元支付给第四个人。此时第四个人可能还没有收到支付4的广播,甚至全网其他节点收到双支付后也无法处理支付4和支付5。

问题6:在大规模并行支付需求的情况下,交易应该如何核算?

对于这个问题,我们通常选择账户记账法,即对于每一笔支付记录,一个账户支付给另一个账户,计算该账户支付后的余额。

比如一开始,本聪的账户有3元,V申的账户有0元。当本琮想付给伏申1元钱时:

1.检查本聪账户余额是否充足,如果不充足,终止交易。

2.从本聪的账户上减去1元,在V申的账户上加1元。

3.此时,本聪账户有2元,V申账户有1元。

中本聪并没有使用这种记账方式,而是发明了比特币的UTXO方案,这也是本文开头介绍的、被中本聪使用的为数不多的原创技术之一。

UTXO(未用交易输出)是一种基于交易行为的记账方案。

我们先做个简单的演示,假设系统奖励本聪3元,V神0元,那么记账形式是:

因为是系统奖励,这次支付的输入没有对应的前期输出(放出来),只有V神0元和本聪3元的输出。

然后,我们以这种格式记录四笔付款:

分析交易1:

基于交易的簿记必须确保每笔交易都有一个来源(输入)和一个目的地(输出)。本交易1中的输入源用哈希指针指向“支付0”中的输出:本聪3元。

输出指向V神和本聪的地址。UTXO的特点是将输入源(即花费的输出)作为一个整体输入,全部消耗掉,而不是取一部分输入,即在交易1中,输入本聪的3元,然后1元输出到V神的地址,2元反向输出到本聪的地址。

后面三个支付的思路都是一样的,就不赘述了。

所以我们说一个人有多少比特币是指这个人的地址里有多少UTXO(未使用的输出),也就是我们可以理解为,在UTXO方案里,没有我们通常意义上的钱的概念,只有未使用的输出,一个人可以生成无数的公私钥对,拥有无数的地址,这些地址的UTXO之和需要钱包来管理。本文不会对钱包做过多阐述。

比特币中UTXO方案的代码如下:

1.元数据:交易规模、输入数量、输出数量、本次交易的哈希值、锁定时间。

2.输入:对应于前一个事务的输出、前一个事务的哈希值、前一个输出地址

在这种结构中,比特币脚本代码可以自动处理签名验证、支付验证等工作。比特币的脚本代码实际上是智能合约概念的来源。

在改进比特币的历史上,曾经有过各种关于脚本代码功能扩展的想法,即能否在一个点对点的电子现金系统中,通过自动执行代码,实现“在一定条件下必须执行的代码”和“点对点支付行为”的结合?

这就是后来的以太坊。本文暂不细说契约,但有机会在后面的文章中演绎以太坊的逻辑。

至于为什么要用UTXO方案而不是基于账号的方案。再回到本节第四个问题,可能是解决大规模交易效率和并行交易的问题。

1.如果我们使用基于帐户的方案,数据记录的对象是帐户的状态,即每个帐户对应的交易和对应的余额。如果记账是基于交易的,那么对象就是UTXO,也就是UTXO对应的地址。

在电子现金系统中,虽然公私钥可以实现部分匿名,但是一旦一个地址对应了一个特定的人的行为,匿名性就会丧失,所以人们更愿意使用更多的地址进行支付交易,这样就会产生大量的废弃账户和冗余数据。

基于UTXO的方案可以在一定意义上保证每条记录的有效性,从数据库层面来说,UTXO方案可以节省存储空间,提高查询效率。

2.如果本聪同时支付V神1元和BM支付本聪1元,基于账户的方案不能同时共享本聪的账户状态,所以不能并行发生。UTXO方案基于每个UTXO的状态,因此它可以并行处理同一个帐户的多个事务。

当然,关于UTXO方案有很多点,包括一些缺点和问题,但本文还是要回到设计的逻辑上来。毕竟,我们正在为一个电子现金系统设计一个数据库存储方案。我们对中本聪采用这种方案倾向于理解为支付系统的效率要求,也回答了本节讨论的支付系统大规模效率和并行支付的问题。

让我们接着讨论双重付款的问题。

问题7:如何解决重复支付的问题?

我们仔细考虑双重支付问题的核心。事实上,在大规模对等网络中,我们无法解决分布式账簿的一致性问题。当一个节点未能同步最新最准确的账簿时,就会受到双重支付的攻击。

要解决这个问题的本质,谁来记账的问题,就是大家都可以记账;或者有限可知节点核算(pbft,Pax OS);或者选举一个可信的节点,记录大家认可的公共账本。所以虽然网络是分布式的,但是我们还是选择使用可靠的公共账本来解决重复支付的问题。

因为在开放网络中,节点可以随意进出:

1.不可能让每个节点都处于持续更新的状态。

2.节点状态未知,因此无法确认网络中的节点是暂时脱机还是永久脱机。

3.女巫攻击,并且生成公钥和私钥的成本很低。如果采用一人一票制,大量的低成本节点会破坏共识过程。

所以没有办法直接套用有限节点的投票百分比法,只能选择一种机制进行竞争记账。

记账节点是有限还是无限,实际上涉及到区块链中经常提到的公链、私链、联盟链的问题,以及公链争夺公书记账权的共识机制。

这里不讨论,重点讨论在一个节点完全自由进出,所有节点都有记账权的分布式网络中,如何设计一个竞争记账的公式机制,通过一个可靠的分布式公共账本解决重复支付问题,达成分布式共识。

说到分布式共识,其实又回到了一个点对点支付网络的本质,也就是分布式网络的问题。

分布式网络有一个上限定理:

一个分布式系统最多能同时达到一致性、可用性和分区容错。

作为一个交易系统,它必须实现两个目标:

可用性:数据能否正常更新,即支付能否正常进行,在某些节点失效或恶的情况下。

分区容错:你能容忍因为账本更新不同步导致的错误分区(即区块链结构的分叉)吗?

其中必须满足可用性,必须发生分区错误,因此点对点支付系统必须不满足高一致性的要求。

到目前为止,我们需要解决的是在低一致性网络中解决:

如何避免女巫攻击?

如何争夺记账权(分布式网络公共账簿),达成记账共识,避免重复支付。

问题8:如何解决女巫攻击的问题?

我们可以这样理解女巫攻击。因为发送邮件的成本很低,所以我们经常会收到垃圾邮件。

因此,解决女巫攻击的核心是使攻击成本大于收益,避免大量低价恶意节点争夺记账权。此时,我们引入工作负载证明(POW)的概念。

我们选择哈希函数SHA256来证明工作量。

此时,我们回想起散列函数的第三个特征,如果给定下面的散列函数:

“哈希(给定信息的随机数)=特定域的哈希值”

当一个给定的信息和一个随机数进行哈希运算得到一个特定的值或特定的域值时,这个随机数只能通过穷举的方法得到。

也就是说,工作负载证明pow的特征:

1.很难找到对应于特定域的哈希值的随机数。

2.利用给定信息和随机值计算哈希值非常简单。

下面是一些哈希值,给你一个直观的感受。

(哈希值的每个数字可能是0123456789abcdef):

示例:

6797 aed 6 e 76 de 66 DCD 7 ad 5 FD 3 FD 2d 3 f 4d 567

7 F6 CDC 908 f 908 ddae 325 da 4 E5 acef 5 Fe 675 ef 5

000006 e 76 de 66 DCD 7 ad 5 FD 3 FD 2 AE 325 da 4 e 5

00000000000000000 DC 908 CD 7 ad 5 FD 3 FD 2 ad

一般哈希运算得到的哈希值和前两个差不多,但是当需要第三个甚至第四个哈希值时,就需要大量的穷举运算来试随机数。我们一般所说的比特币挖矿,就是寻找随机数的过程。

再次总结一下POW的特点:

1.只能用穷举法求随机值。

2,所以求随机值的过程全靠运气。

3.可调难度:调整0的个数。

4.难度调整可以按照一个标准来进行:工作量证明的成本高于作恶的收益。

到目前为止,我们已经用pow机制解决了女巫攻击问题,使得争夺记账权的行为是有成本的。

但与此同时,会出现一个新的问题:

如果成本大于收益,如何激励节点竞争记账?

例如:

1000元起有转账,记账工作量成本调整为1000元。这时候,你花500元的成本,就有50%的概率获得记账权。对于这种记账方式,节点根本就没有足够的动力,更别说竞争记账了。

问题9:如何激励节点争夺记账权?

我们想到两种方法:

打包交易块并为交易块记账。

记账员的比特币奖励和交易费奖励。

打包交易每次交易多,收益多,在一定程度上缓解了激励问题,但一个节点用双支付攻击一个区块的所有交易一般不现实。

因此,中本聪以奖励比特币的形式,用一大笔钱奖励记账打包的行为,使得节点有足够的动力记账。

这是比特币设计最巧妙的地方,在纯技术结合的基础上引入经济激励:

基于这种激励形式,虽然在技术上已经赋予了双倍支付很大的成本,但是双倍支付问题的最终解决方案是让全网所有节点利益一致。

1.当初为了维护比特币网络,记账节点小心翼翼的记账,避免每个区块重复支付等问题,使得比特币支付网络具备了支付功能和价值。这样一个点对点的支付网络所带来的价值,使得比特币拥有了自己的价格,由于一定的金融属性,比特币有了涨价的金融基础。

2.这个时候节点矿工就有了比特币和计算能力。如果比特币网络不可靠,他们手中持有的币和挖矿设备就失去了价值。因此,为了一致的利益共识和经济激励,节点将负责支付网络。记账,甚至花更多的钱继续争夺记账权。相应的,全网计算能力的提升,让比特币网络更加可靠。

3.工作量证明机制和比特币奖励机制的结合,使得网络中的所有节点拥有共同的利益。因此,从技术角度来看,工作量证明机制实现了全网计费规则的共识;从经济角度来说,通过工作量证明争夺记账权的节点已经形成了牢不可破的利益共识,所以这两个层面的共识是互为补充的,两者都无法达成全网统一可靠的账本。

分析到这一点,我们应该对网络的运行规律有一个清晰的认识,他的运行原则如下:

1.允许任意节点自由进出网络,节点间进行点对点支付和广播交易。

2.同时,节点可以参与竞争记账。

3.竞争节点枚举随机数,用工作量证明竞争记账正确。

4.试用随机数的记账节点对交易进行打包,验证交易,生成有效块,并向全网广播。

5.其他节点接收广播验证:事务的有效性和块的有效性。

6.核实区块后,节点更新账簿,终止工作量证明工作,更新未确认交易池。

7.该节点在已验证的块后面寻找新的块。

8.永远来来回回。

让我们来看看区块链的结构:

为这个区块链结构提出几个要点:

1.链式结构实际上有两层,一层是每个事务指向前一个事务,另一层是打包事务的块,与前一个块1相连。我们应该认识到,事务指向的前一个事务不一定在区块链的前一个块上。

2.Merkle root是指记录在块体中的事务用hash指针一层一层指向一个Merkle root。由于块头很小而块体很大,且一个事务只对应一个Merkle根,所以在验证事务时,节点可以只下载块头并寻找Merkle根来提高验证效率。

3.在区块的交易中,第一个是基于货币的交易,记录了奖励比特币的数量和对应记账矿工的地址。基于货币的交易是比特币的发行方式。比特币每10分钟打包成一个块,现在每个块奖励12.5个比特币,每四年减半。

说到这里,虽然为了共同的利益,矿工们一般都会选择谨慎记账,排除重复支付和有问题的交易,但是会出现另一个问题:

两个记账节点同时找到有效块怎么办?分叉问题。

问题10:如何处理区块链的分歧?

这个问题的答案其实就是不处理。区块链有自己的运行规则,区块链网在运行过程中自然会有最长的链条,大家把最长的链条作为全网的有效公开账本:

1.不干涉,按照交易规则和共识规则自动操作。

2.节点选择最合理最长的区块链。

3.竞争可能会持续几个区块,最后节点切换到更长的链进行挖掘。

这种方式的特点:

1.当前块不能保证事务状态,这是由最长的链决定的。

2.确认越多,新链条的替换成本就越高,交易的防篡改性就越强。

所以一般来说,我们会等一些确认,才会认为交易真的成功,比如比特币的六次确认。

本质上,最长的链条其实是最重的链条,计算能力最强,共识牢不可破。

写在最后:

至此,我们已经完整地设计了一个点对点的电子现金系统。

我们选择点对点的网络,希望建立一个没有第三方的可以自由传递价值的网络;

我们使用非对称签名来解决身份、真实性和完整性问题

在对等网络的记账和数据存储过程中,我们使用哈希函数构建链式结构,使得我们的交易有序可追溯,确认后的账本难以篡改。Hash函数不仅链接支付,还搭建了区块链账本的基础设施,也是后面工作量证明的技术方案。

在解决谁来记账、建立可靠的公共账本的问题时,我们利用工作量证明pow共识机制来争夺记账权,并创造性地将其与经济激励相结合,进一步解决重复支付的问题,同时使全网拥有牢不可破的利益共识。这个最长的链代表了有效的簿记机制,并且自然地解决了区块链分叉的问题。

当然,分叉问题不需要解决。区块链的世界是一个自由的世界。只要一群节点愿意认同其他共识或新技术来建立一个新的区块链,一个新的社区就可以被硬分叉。这也许就是区块链的魅力所在。它是免费的,不怕节点的不一致和任意访问。我们用一整篇文章来梳理设计思路,最后发现共识其实是区块链的灵魂。

而这种共识,恰到好处,也必须建立在利益的基础上。因为符合人性;因为它使共识变得广泛。人类社会不乏协作,但很少有人像比特币一样达成如此广泛大规模的共识。也许这就是区块链的意义,改变了共识的方式,降低了共识的成本,提高了共识的效率,产生了大规模协作的价值。

感谢本文的启发:《最小可行性区块链原理解析》。

参考书目:《区块链 技术驱动金融》,《区块链技术指南》

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/btb/btbjiaoxue/59224.html

作者: 币圈小哥

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部