此区块链100篇文章为在博客上看到较好的区块链解释,所以搜集而来,转载博客原地址https://blog.csdn.net/weixin_37504041
因为比特币网络是一个点对点的网络,也就是peer-to-peer,简称P2P,所以这里需要先讲一下P2P的知识,讲这个主要是更好的理解比特币的支付与交易的过程。
1 | P2P |
P2P网络是指位于同一网络中的每台计算机都彼此对等,各个节点共同提供网络服务,不存在任何“特殊”节点,每个网络节点以扁平(flat)的拓扑结构相互连通。对比中心化网络,在P2P网络中不存在任何服务端(server)、中央化的服务。 那么问题来了,节点是如何发现其他节点的呢?
1.节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
2.节点会在失去已有连接时尝试发现新节点。
3.当建立一个或多个连接后,节点将一条包含自身IP地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
4.新接入的节点可以向它的相邻节点发送获取地址getaddr消息,要求它们返回其已知对等节点的IP地址列表。节点可以找到需连接到的对等节点。
5.在节点启动时,可以给节点指定一个正活跃节点IP,如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和BT下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。
上面的话可能有点难理解,举个生动的例子就是假设你和A是好闺蜜(建立过连接,对应第一点),现在你的一个男性朋友想追A,他想知道关于A的一些信息,这时他可以通过你来得到A的信息(新节点接入,对应第四点),那么这个时候A会把自己的信息告诉你,而你就会将这个信息告诉给你的男性朋友(对应第三点);如果此时你跟A吵架闹掰了,那么你可能会尝试找新的朋友(对应第二点),至于第五点可以理解为假如你现在有了男朋友,那么你每天醒来的时候第一个想见的可能就是你的男朋友,但如果没有男朋友的话,那么这个时候你的清单里会罗列一些你的“备胎”。这个是对上面那五个点的理解,主要P2P的本质就是节点与节点是平等的。
1 | 比特币的支付与交易 |
讲完了P2P的知识,现在来讲一下比特币的支付与交易过程。
传统上我们进行支付的过程是这样的:A(填写收款人的银行卡账号及转账金额) –> C(银行,验证A的信息是否正确及账户上余额是否充足,如果条件满足则将A上的账户余额减去相应的额度,并将B的余额增加相应的额度) –> B(B的账户上多了A转过来的钱),但是在比特币网络中是没有C这个节点的,也就是说没有中间机构来验证A的信息是否正确,余额是否充足,那么是如何做到每一笔交易是真是可靠的呢?
1 | 1.首先是付款人签署交易单 |
付款人需要输入自己的比特币地址以及收款方的比特币地址,还要输入转账比特币的个数,如5个比特币,然后付款方会发送一个请求给收款方(以P2P的形式发送),在发送这个请求之前付款人会先加上收款人的公钥(这里可以先理解为地址,但是两者是有区别的)和交易信息,然后再用自己的私钥加密整个请求,并把自己的公钥标记在这个请求上。这里需要注意的是付款人不仅要将这个请求发给收款方,还需要以P2P的方式广播出去告诉其他网络节点,让所有节点都接收到这个请求。
举个例子Alice要给Bob转账5个比特币,那么Alice首先要询问Bob的标识字符串(比特币地址),例如是“ABCDEFG”,同时Alice也有一个标识字符串例如是“HIJKLMN”,然后Alice写一张单子,内容为“HILKLMN支付5比特币给ABCDEFG”,然后用自己的保密印章(私钥)盖一个章,将这张单子交给Bob。
这个过程涉及到非对称加密和数字摘要的知识,在下一篇会详细讲解,看完就会知道为什么要这么做。
1 | 2.接着是收款人确认单据签署人 |
收款人收到这个请求后拿着付款人的公钥进行解密,如果能解密则说明付款人确实是拥有这个私钥的,进而说明这笔账是从付款人转过来的,还可以得到收款人的公钥(因为上面已经讲了付款人会将收款人的公钥跟交易信息进行加密)说明这笔账确实是转给收款人的。
1 | 3.确认付款人余额 |
通过上面的步骤是可以确定这笔账确实是付款人发起的,但是没办法有效的确认付款人是否真的有足够的余额进行转账(毕竟现在没有一个中心机构进行认证),所以这个时候就需要矿工(第四篇会讲)来进行确认,这是因为在比特币的世界里是没有余额这个概念的,我们在比特币钱包里看到的“余额”不是我们所理解的余额,它其实是UTXO(意思是未花费的交易输出,这个打算在第五篇讲),验证付款方是否有余额这个工作通常由矿工来做,而收款方不需要做这个工作,只需要验证这个请求是否是付款人发起的即可。