二、交易和批次
通过创建和应用交易来对状态进行修改。客户创建一个交易并发送给验证组件。验证组件应用该交易,从而状态改变。
交易往往都打包进一个批次。一个批次里的所有交易要么一起被递交,要么都不递交。所以,批次是引发状态变化的最小单位。
交易批次的整体结构包括批次、批次头、交易和交易头。
1. 交易数据结构
交易采用Protocol Buffers来序列化。它包括数值字节和字符串,两种信息类型。
在交易(Transaction)里存放三部分信息,分别是标头内容(header)、标头签名(header_signature)、负载信息(payload)。其中标头内容是序列化的交易头文件。
在交易头文件(TransactionHeader)里,存放十项信息:分别是批次公钥(batcher_public_key),依赖条件(dependences),家族名称(family_name),家族版本(family_version),输入(inputs),随机数(nonce),输出(outputs),加密负载信息(payload_encoding),负载信息哈希值(payload_sha512),签名者公钥(signer_public_key)。
1.1 交易头,签名,公钥
交易(Transaction)的标头内容(header)存放的是一个序列化的交易头文件(TransactionHeader)。标头内容(header)被交易发起者用私钥进行签名(私钥不会随同交易发送),完成的签名被存放在交易(Transaction)中的header_signature。标头内容(header)以序列化的字节形式呈现,这样就可以通过交易回执上的签名来验证它。
在交易头文件(TransactionHeader)里:
(1)验证处理(程序)将用signer_public_key里的公钥来对标头字符进行签名并存放结果到交易(Transaction)的标头签名(header_signature)。
(2)batcher_public_key区域必须和用来对该交易所在的批次进行签名的公钥相匹配。
(3)交易完成后的序列化文件使用交易执行者的私钥(椭圆曲线加密)来签名。
验证组件接受标准化的64字节压缩签名,这是签名的R部分和S部分的结合体。一些资料库会包含一个额外的头字节,可恢复的身份域,或提供DER加密签名。锯齿湖拒绝任何非64字节的签名。
注意:椭圆曲线签名必须采用“low S”形式(即“low S”签名)。也就是说这里的椭圆曲线签名必须计算(R,S)和(R,N-S),此处的N是secp256k1曲线的阶。有效的签名是在(S,N-S)中取最小值。否则,锯齿湖将拒绝交易签名。Python3的锯齿湖SDK和来自于比特币的椭圆曲线加密资料库的不存在以上问题。如果使用如mbed TLS和openSSL的资料库,就不是采用以上标准化签名方法。
提示:因为发送交易者生成的原始的头字节将被用于验证签名。所以,最好采用原始的头字节来做验证,而不是先反序列化到一个对象(例如一个python对象),然后再序列化成字节。因为序列化的过程会受到编程语言和资料库的影响,导致序列化后的结果与原来的签名不匹配。
1.2 交易家族
在锯齿湖里,交易家族是指一个可扩展体系,它制定了一组可行的交易集合。制定和实施一个新的交易家族将添加现有可用交易的分类。比如说,在应用开发者指南中将介绍如何写自己的交易家族。我们制定了一个名叫“XO“的交易家族,它制定了一系列玩“石头剪刀布“的交易。
除了交易家族的名称(family_name),每个交易还会制定家族版本信息(family_version)。借助版本信息,可以协调网络中所有节点共同升级某个交易家族。
1.3 依赖条件、输入和输出地址
由于一个交易可能基于其他交易之上,所以它必须等那些它依赖的交易执行完毕后再执行。
交易中的依赖条件区域会明确说明必须先执行的依赖交易。明确的依赖条件将有利于那些存在依赖关系但又无法放在同一个批次里执行的交易(比如说这些互相依赖的交易是在不同时间段里发送的)。
为协助并行处理,一个交易的输入和输出区域里包含了状态地址。通过与状态交互,计划器决定了交易与交易之间明确的依赖关系。状态地址可能与叶子节点的地址或者与部分前缀地址完全匹配。输入地址会被状态读取,输出地址会写入状态。当输入和输出地址被客户指定后,交易执行时输入和输出会在交易中被声明。部分地址信息可以作为通配符使用以便交易指定默克尔树的局部(包括分叉)而不只是叶子节点。
1.4负载(信息)
在交易执行时,负载(信息)作为一个传递变化给状态的方式。只有执行中的交易家族可反序列化负载(信息)。系统中的其他组件看到的负载(信息)只是一组字符序列。
作为标头的一部分,Payload_sha512包含了负载(信息)字符的SHA-512哈希值,它经过签名并将被验证,但负载(信息)区域不会(被签名和验证)。可以通过计算负载(信息)的SHA-512值,并和Payload_sha512匹配来验证负载(信息)是否和标头匹配。
1.5 随机数
随机数区域里包含了一个由客户随机生成的字符串。如果两个交易碰巧拥有相同的内容,借助随机数可以确保两个交易会生成不一样的标头签名。
网友评论