每笔交易消息主要记载比特币从输入账户转移到输出账户。交易消息包含以下几个字段:当前版本号、输入账户的个数、输入账户、输出账户个数、输出账户和时间戳。其中,输入账户包含表明比特币来源的交易的哈希值、该输入账户的序号、解锁代码长度和解锁代码,输出账户包含金额、锁定代码的长度和锁定代码。
每个节点在传播消息之前都会独立检验消息是否满足特定的要求。只有通过验证的交易消息才会进入本地的交易记录池中,并传播到其他节点。这也使得不符合要求的交易消息在最初的时刻就会被抛弃,从而可以防范拒绝服务攻击。比特币采用的是未花费余额(Unspent Transaction Output,UTXO)账户结构,每笔交易的输入必须是经过私钥签名的某笔交易的未花费的输出。验证内容包含以下几个方面:
(1)交易的语法和数据结构必须正确。
(2)输入与输出列表都不能为空。
(3)交易的字节大小要小于最大区块大小。
(4)每个输出值和输入值之和,都必须在允许的范围内。
(5)没有哈希值等于0、输入个数N等于-1的输入。
(6)锁定时间小于或等于INT_MAX。
(7)交易的字节数大于或等于100。
(8)交易中的签名个数小于签名个数的上限。
(9)解锁脚本只能够将数字压入栈中,并且锁定脚本必须要符合标准格式。
(10)交易记录池中必须有匹配的交易,或主链中必须有匹配的交易。
(11)如果引用的输出已经存在于池中的任何其他交易,则这个输入的交易将被拒绝。
(12)对于每个输入,在主链和交易池中寻找引用的输出交易。如果输出交易没有相关的输入,则该交易将成为孤立交易,将被加入到孤立交易池中。(www.xing528.com)
(13)对于每个输入,如果引用的输出是基础发行类交易的输出,则该类输出至少要经过100次确认后才可以被引用。
(14)对于每个输入,引用的输出是必须已有的且没有被花费掉的输出。
(15)输入值的来源是引用的输出值,并检查各个输入值及其加总值是否在允许的范围内。
(16)如果输入值之和小于输出值之和,则交易被拒绝。
(17)如果交易费用太低以至于不能进入空的区块,则交易被拒绝。
(18)每个输入的解锁脚本必须依据相应输出的锁定脚本来验证。
在新区块产生之后,接受到新区块消息的节点会独立验证新区块的有效性。如果新区块通过检验,则节点将新区块加在区块链的末尾。新区块应用满足以下条件。
(1)区块的数据结构在语法上有效。
(2)区块标题的哈希值小于目标难度值。
(3)区块的时间戳早于未来两个小时。
(4)区块大小在可接受的大小范围内。
(5)第一个交易是基础发行交易。
(6)区块内的交易符合前文提到的18个验证条件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。