存证交易模型

SDK根据antblockchain-gl协议实现完整的内容存证交易模型,包括交易编码、交易验证、加密套件、交易签名。

存证交易 Builder

开发 SDK 中推荐使用 TransactionBuilder 来构建内容存证交易。

不同的交易模型需要获取不同的 builder 来构建。

构建一笔存证交易的代码示例如下:

TransactionDO tx = TransactionBuilder.getContentOnlyNotaryPayloadBuilder()
  .setContent(bizData)
  .setCategory(category)
  .setTimestamp(System.currentTimeMillis())
  .build();

目前,支持的交易类型 builder 如下:

// 获取引用存证模型builder
TransactionBuilder.getLinkNotaryPayloadBuilder()
// 获取内容存证模型builder
TransactionBuilder.getContentOnlyNotaryPayloadBuilder()
// 获取hash存证模型builder
TransactionBuilder.getHashOnlyNotaryPayloadBuilder()
// 获取密文存证模型builder
TransactionBuilder.getEncryptNotaryPayloadBuilder()
// 获取隐私分享模型builder
TransactionBuilder.getEncryptShareNotaryPayloadBuilder()
// 获取纯密文存证模型builder
TransactionBuilder.getEncryptContentOnlyNotaryPayloadBuilder()

存证交易

交易包含以下属性。其中不同交易类型有对应的 Payload 子类承载具体内容,交易类型与 Payload 子类之间的映射见 Payload 类型。

// 交易结构版本号
int version

//交易类型
int type

//随机数,确保交易唯一性
long nonce

//交易内容
Payload payload

交易的几个关键方法如下:

  • 模型编码:marshal() 对交易进行编码;unmarshal() 对交易进行解码。

  • 验证交易:verify() 根据协议对交易进行有效性验证。

  • 交易哈希:getTxHash() 模型不存储 hash,该方法对交易序列化后计算 hash。

Payload 类型

Payload 目前仅支持存证模型,已支持的 Payload 子类如下:

  • ContentOnlyNotaryPayloadDO

  • HashOnlyNotaryPayloadDO

  • LinkNotaryPayloadDO

  • EncryptContentOnlyNotaryPayloadDO

  • EncryptShareNotaryPayloadDO

  • EncryptNotaryPayloadDO

下面是对各个子类的详细说明。

ContentOnlyNotaryPayloadDO

  • 内容存证模型

    如果一个源文件需要存证,可以选择将源文件写上链。该模型限制了512K大小的源文件存储,在该范围内的存证文件可以选择写入上链。对于内容过大的存证(如图像、视频等)可以选择LinkNotaryPayloadDO使用链接模型的方式上链存证。

  • 存证结构

    • content:存证内容。

      • 类型:byte[] 区块链不限制编码方式,存证内容请根据业务情况进行编码。

      • 长度:小于等于512K。

HashOnlyNotaryPayloadDO

  • 哈希存证模型

    如果一个文件需要存证,且不希望源文件上链,或者文件过大不适合写上链,,以选择将文件的Hash值上链。

  • 存证结构

    • hash:源文件的hash值。根据链外的实际源文件进行摘要计算得到该hash值。

      • hash算法:区块链无法获取源文件,无法验证该hash是否有效。该模型推荐使用sha-256,限制256位的摘要值。

      • 类型:byte[]

      • 长度:固定为32字节。

LinkNotaryPayloadDO

  • 链接存证模型

    如果一个文件需要存证,且不希望源文件上链,或者文件过大不适合写上链,可以选择将文件的Hash值上链,此外且将文件的链接(文件固定的URI)写入链。将来检索数据时,可以根据URI去取源文件。

  • 存证结构

    • link:存证内容的链接,可以写入URI,或者其他可以用于定位源文件的线索。

      • 内容:源文件的URI,或者其他可检索的地址。

      • 类型:byte[](内容字符串经编码得到byte数组,区块链不校验,也不限制编码方式,具体可根据业务情况进行编解码)。

      • 长度:小于等于64K。

    • hash:源文件的hash值。根据link在链外检索到实际源文件,再对源文件进行摘要计算得到该hash值。

      • hash算法:区块链无法获取link源文件,无法验证该hash是否有效。该模型推荐使用sha-256,限制256位的摘要值。

      • 类型:byte[]

      • 长度:固定32byte。

EncryptNotaryPayloadDO

  • 隐私存证模型

    如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链存证。

  • 存证结构

    • contentHash:存证的明文内容的 hash 值。区块链无法约束存证明文的 hash 就是该 hash 值。

      • hash算法:区块链无法获取数据明文,无法验证该hash是否有效。该模型推荐使用sha-256,限制256位的摘要值。

      • 类型:byte[]

      • 长度:固定32字节

    • encryptContent:源文件的密文。由加密key及nonce对明文加密得到该值,通过加密key及nonce解密该值,得到密文值。

      • 类型:byte[]

      • 长度:小于等于512K

    • nonce:加密iv。通过AES进行加密时指定随机生成的iv,解密时需要使用该值。

      • 类型:byte[]

      • 长度:小于等于16字节,使用AES GCM算法时,该值一般长度为12字节

EncryptShareNotaryPayloadDO

  • 分享隐私存证模型

    如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链存证。对明文进行加密的 key 通过另外一把私密 key 进行 key wrap 后公开,读取该密文数据时,用私密 key,对 wrap key 进行解密后得到密文的 key,最终得到密文。 业务可以通过该加密规则进行业务设计,例如使用 KDF 算法设计密钥树,根据数据的安全级别、分享范围等给数据分配对应的私密 key,通过该私密 key 对特定范围内的数据进行加密。向指定的对象分享该 key 即可分享这范围内的数据。

  • 存证结构

    • contentHash:存证的明文内容的Hash值。区块链无法约束存证明文的Hash就是该Hash值。

      • hash算法:区块链无法获取数据明文,无法验证该hash是否有效。该模型推荐使用sha-256,限制256位的摘要值。

      • 类型:byte[]

      • 长度:固定32字节。

    • encryptContent:源文件的密文。由加密key及nonce对明文加密得到该值,通过加密key及nonce解密该值,得到密文值。

      • 类型:byte[]

      • 长度:小于等于512K。

    • keyName:密钥的kdf推导路径。密钥tree父节点根据该路径可以推导出私密key。

      • 类型:byte[]

      • 长度:最长512字节。

    • keyWrap: 加密key的warp key。加密key随机生成,对明文进行加密的,该key有私密key进行key warp后公开。使用时,通过私密key对warp key解密,得到加密key,通过该加密key对密文进行解密。

      • 类型:byte[]

      • 长度:该模型支持antblockchain加密库,对wrap key限制40字节。

    • nonce:加密iv。通过AES进行加密时指定随机生成的iv,解密时需要使用该值。

      • 类型:byte[]

      • 长度:小于等于16字节,使用AES GCM算法时,该值一般长度为12字节。

EncryptContentOnlyNotaryPayloadDO

  • 隐私存证模型

    如果一个文件需要存证,且不公开内容,可以选择将源文件通过对称加密算法加密后上链存证。

  • 存证结构

    • encryptContent:源文件的密文。由加密key及nonce对明文加密得到该值,通过加密key及nonce解密该值,得到密文值。

      • 类型:byte[]

      • 长度:小于等于512K

    • nonce:加密iv。通过AES进行加密时指定随机生成的iv,解密时需要使用该值。

      • 类型:byte[]

      • 长度:小于等于16字节,使用AES GCM算法时,该值一般长度为12字节。