Qitmeer Network 周报(2020/11/23-2020/11/29)

每周一聊

区块链网络中的节点

加密货币的区块链网络架构是对等点(p2p)之间的网络架构。参与网络的计算机设备,执行着给定的区块链P2P协议,他们之间是对等的,是一个个对等的节点,所有这些节点集便构成了区块链网络。

整个网络以完全联合、去中心化和分布式的方式编排和协调每个用户在网络中所做的操作。这意味着全世界的计算机网络可以不断地相互传输新的事务。这个网络中的每台计算机都是一个节点,它已经下载了完整的区块链。这样,网络就变得冗余了,而协同工作使其在扩展方面具有可伸缩性。

由于区块链的分散化,任何人都可以参与其中。只需下载节点软件并执行它即可。通常,每个项目的主钱包都支持此功能。最初,网络从区块链的起源开始,直到与网络同步为止。此时,节点开始全面运行,不仅允许验证事务,而且支持区块链的整体映像。通常节点可以执行以下功能:钱包、区块链数据库、挖矿和路由。以比特币为例:

  • 钱包:指的是钱包软件,而非地址加私钥本身。钱包的功能包含收集钱包中的地址相关的 UTXO ,以便统计出地址余额,构建交易,发送交易等等转账相关的功能。

  • 区块链数据库:拥有完整的区块链数据,可以独立的验证所有交易而不需要外部参照。但这个数据庞大,所以并不是所有节点都会下载完整的最新的区块链。

  • 挖矿:挖矿节点会收集交易,制作区块头,然后参与 POW 算力比拼,找到随机数,生成区块并获得出块奖励和手续费。

  • 路由:所有类型的节点都会有这个功能。所有的节点有有义务帮助其他节点去验证和扩散交易,去查找其他节点,去维持整个网络的连接。

一个节点如果保有完整的、最新的包含全部交易信息的区块链拷贝,这样的节点,被称为“全节点”。更加准确地说,这样的节点应当被称为“完整区块链节点”,是维持着包含全部交易信息的完整区块链的节点。能够独立地建立并校验区块链,从第一区块(创世区块)一直建立到网络中最新的区块。全节点,可以独立自主地校验所有交易,而不需借由任何外部参照。

在比特币发展的早期,所有节点都是全节点;当前的比特币核心客户端,也是完整区块链节点。只有在近几年才出现了不需要维持完整的区块链的新型的轻量级客户端,也就是SPV节点,这类节点并不下载区块的全部数据,只保存了区块的头部信息以及自身的交易信息。早期,矿工挖矿大多都是独立挖矿,那时候挖矿节点也是全节点;但是后来随着矿池的出现,大多数矿工都加入了矿池去挖矿,这时候的矿池挖矿节点,虽然也参与挖矿,但是这类节点上只拼命运算,而不会去保存完整的区块链,他们只需要跟矿池服务器(也就是矿池节点)通信,而矿池节点是一个保存了完整区块链的节点。

比特币其实有两道防御机制,一是算力,二是组成比特币网络的全节点。全节点除了保存完整账本和验证交易外,另一个主要作用就是作为比特币网络的第二层防御。这一点中本聪在创世白皮书中就有提到,一旦有算力叛变试图改变比特币区块共识,全节点组成的比特币网络可以拒绝掉这些交易。如果用户只剩下用spv的能力,那么比特币网络将无法抵御算力的攻击。比特币网络中当前的节点数约为1万个全节点,过去的两年间虽然没有出现显著下降,但也没有显著的增长。

全节点维护着特定加密货币的区块链网络的完整性,保存着区块链账本的完整副本,能够独立验证交易。通常情况下,全节点数量越多,p2p网络的传输效率会越好,同时网络的安全性也会越高。试想和摧毁一个地区的几个节点相比,要摧毁来自世界各地的几千几万个节点就要困难的多了。

理论上,一个完整的区块链可以在单个节点上执行,但由于它存储在单个设备中,因此非常容易受到断电、黑客或系统故障等情况的影响。在区块链中运行的完整节点越多,它们在面对此类灾难时的恢复能力就越强。当区块链的数据分布在如此多的设备上时,想要一次删除所有这些数据是非常困难的。由于全球危机,大量节点突然下降并变得不可访问,从理论上讲,单个节点可以保持整个区块链的运行。即使所有节点都断开连接,也只需要一个具有完整区块链历史记录的节点就可以重新联机并使所有数据都可以再次访问。

或许不是所有人都需要运行一个全节点,但是即便是你运行了也给全节点而不使用它,在边际上,对于网络其实也是有一点帮助的。其次,你运行了一个完整的节点,你可以无忧无虑的使用比特币等加密货币,甚至还有隐私优势。

我们知道一个完整的节点可以独立验证交易,交易验证的过程比较复杂,包括账户余额验证、双重支付判断等。我们以比特币为例,来看一下这个交易验证的内容具体有哪些。

当比特币客户端创造一笔新交易,即是创建了一笔交易输入与交易输出,然后客户端会向相邻节点广播交易内容,再由相邻节点向其他节点广播,不断扩散到整个比特币网络。

当节点收到一笔交易时,会先进行验证,验证成功才会进行转发,否则交易将被丢弃,保证 无效交易不会在网络中被大量传播 ,验证内容如下:

  • 交易的语法与数据结构是否正确

  • 输入输出不能为空

  • 交易大小不能超过MAX_BLOCK_SIZE(块最大大小)

  • 输出值必须在允许的范围内(大于1聪(1亿分之一比特币),小于2100万)

  • 交易输入hash不能为0

  • nLockTime小于或等于INT_MAX。nLocktime与nSequence的值满足MedianTimePast(MedianTime是这个块的前面11个块按照block time排序后的中间时间)

  • 交易大小大于等于100字节

  • 交易中的签名数量(SIGOPS)小于签名操作数量上限

  • 解锁脚本(scriptSig)只能够将数字写入栈中,并且锁定脚本(scriptPubkey)必须要符合isStandard的格式(将会拒绝非标准交易)

  • 匹配交易在交易池或区块链中存在

  • 对于每一个输入,引用的交易输出如果在交易池中已经存在,交易将被拒绝(不允许双重支付)

  • 对于每一个输入,如果匹配的交易输出无法在交易池或区块链上找到,将交易放入孤立交易池(orphan pool)

  • 对于每一个输入,如果引用的交易输出是一个coinbase输出,该输入必须至少获得 COINBASE_MATURITY(100)个确认。

  • 对于每一个输入,引用的输出必须存在,并且没有被花费。

  • 使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内(小于2100万,大于0)

  • 交易输入总值必须小于引用的交易输出总值

  • 拒绝交易费过低(小于minRelayTxFee)的交易

  • 每一个输入的解锁脚本必须可以正确匹配相应输出的锁定脚本。

以上条件会随着比特币的发展会发生变化,可能会加入更多条件防止DOS攻击,也有可能放宽条件接受更多类型的交易。

完整的节点维护着整个区块链历史记录,相同的信息在多个地方存在存储备份,为区块链提供了冗余。因此全节点对于区块链网络的重要性不言而喻。但是,在矿池挖矿盛行的今天,大多数矿工都不再独立挖矿,而是集中在少数几个矿池里,这对区块链网络的发展是极其不健康的。比特币的全网算力在近几年可以说是成倍的增长,但全节点数量却没有发生明显的增长,一个原因就是大量矿工都选择了矿池挖矿,其次,由于运行一个全节点也需要一定的成本,在没有任何经济激励的情况下,普通人运行一个全节点的动力是不足的。因此对于一个区块链网络来说,从网络建康发展以及安全性与性能方面考虑,给予一定的经济激励以拓展区块链网络的全节点数量,是一件值得思考的事。

以上文中观点,纯属社区个人观点,如有不当,请指正。

qitmeertalk.org 时刻欢迎您来聊)


Qitmeer Network 周报

新闻动态

  • Qitmeer Medina Network 代币 Pmeer 已于2020年11月30日上线了全球领先的综合性数字货币矿池 F2pool,双方协作举办了以 F2pool&Qitmeer 为主题的线上AMA活动。

    相关公告:https://blog.f2pool.com/zh/announcement/pmeerfpga

项目技术进展

底层核心代码更新


Qitmeer Network Development Report

News

  • Qitmeer Medina Network token pmeer has been listed on F2Pool, the world’s largest comprehensive digital currency mining pool, on November 30, 2020, and the two partners are collaborating to host an online AMA on the theme of F2pool & Qitmeer.

    Related Announcement:https://blog.f2pool.com/zh/announcement/pmeerfpga

Project Development Progress

Core Code Update


Qitmeer Common Links