Edit me

可信声明及存证

Version 1.0.0

English / 中文

1. 可信声明

可验证声明用来证明实体的某些属性。

可信声明存证合约提供了可信声明的存证服务。即存证可信声明Id,签发者ONT身份,属主ONT身份等信息,以及记录可用性信息即是否被吊销等信息。

可信声明规范说明文档请参考:可信声明规范

1.1 数据结构和规范

具体标准请参考https://github.com/kunxian-xia/ontology-DID/blob/master/docs/en/claim_spec.md

java-sdk采用JSON Web Token的格式表示claim以便于在声明发行者和申请者之间进行传递,jwt格式包含三部分header,payload,signature.

  • Claim 具有以下数据结构
class Claim{
  header : Header
  payload : Payload
  signature : byte[]
}
class Header {
    public String Alg = "ONT-ES256";
    public String Typ = "JWT-X";
    public String Kid;
    }

字段说明 alg 使用的签名框架 typ 可以是下面两个值中的一个 JWT: 表示区块链证明不包含在claim中 JWT-X: 表示区块链证明是claim中的一部分 kid 用于签名的公钥

class Payload {
    public String Ver;
    public String Iss;
    public String Sub;
    public long Iat;
    public long Exp;
    public String Jti;
    @JSONField(name = "@context")
    public String Context;
    public Map<String, Object> ClmMap = new HashMap<String, Object>();
    public Map<String, Object> ClmRevMap = new HashMap<String, Object>();
    }

ver Claim版本号 iss 发行方的ontid sub 申请方的ontid iat 创建时间 exp 超期时间 jti claim的唯一标志 @context 指定声明内容定义文档URI,其定义了每个字段的含义和值得类型 clm 包含claim内容的对象 clm-rev 定义个claim 的撤销机制,

1.2 创建可信声明

根据用户输入内容构造声明对象,该声明对象里包含了签名后的数据。 创建claim:

  • 1.查询链上是否存在Issuer的DDO
  • 2.签名者的公钥必须在DDO的Owners中存在
  • 3.claimId 是对claim中删除Signature、Id、Proof的数据转byte数组,做一次sha256,再转hexstring
  • 4.对要签名的json数据转成Map对key做排序。
  • 5.Signature中Value值:claim 删除Signature、Proof后转byte数组, 做两次sha256得到的byte数组。
Map<String, Object> map = new HashMap<String, Object>();
map.put("Issuer", dids.get(0).ontid);
map.put("Subject", dids.get(1).ontid);
Map clmRevMap = new HashMap();
clmRevMap.put("typ","AttestContract");
clmRevMap.put("addr",dids.get(1).ontid.replace(Common.didont,""));
String claim = ontSdk.nativevm().ontId().createOntIdClaim(dids.get(0).ontid,password,salt, "claim:context", map, map,clmRevMap,System.currentTimeMillis()/1000 +100000);

createOntIdClaim

String createOntIdClaim(String signerOntid, String password,byte[] salt, String context, Map<String, Object> claimMap, Map metaData,Map clmRevMap,long expire)

功能说明: 创建可信声明

参数 字段 类型 描述 说明
输入参数 signerOntid String 签名者ontid 必选
  password String 签名者密码 必选
  salt byte[] 解密需要的参数 必选
  context String 指定声明内容定义文档URI,其定义了每个字段的含义和值得类型 必选
  claimMap Map 声明的内容 必选
  metaData Map 声明发行者和申请者ontid 必选
  clmRevMap Map claim的撤回机制 必选
  expire long 声明过期时间 必选
输出参数 claim String 可信声明  

1.3 验证可信声明

验证claim步骤:

  • 1.查询链上是否存在Metadata中Issuer的DDO
  • 2.Owner是否存在Sgnature中的PublicKeyId
  • 3.对要验签的json数据转成Map对key做排序。
  • 4.删除Signature做验签(根据PublicKeyId的id值查找到公钥,签名是Signature中Value做base64解码)
    boolean b = ontSdk.nativevm().ontId().verifyOntIdClaim(claim);
    

verifyOntIdClaim

boolean verifyOntIdClaim(String claim)

功能说明: 验证可信声明

参数 字段 类型 描述 说明
输入参数 claim String 可信声明 必选
输出参数 true或false boolean    

2. 可信声明存证合约使用步骤

该合约提供存储、吊销、查询状态等功能。

2.1. 初始化SDK

使用存证合约之前先初始化,并设置合约地址。

String ip = "http://127.0.0.1";
String restUrl = ip + ":" + "20334";
String rpcUrl = ip + ":" + "20336";
String wsUrl = ip + ":" + "20335";
OntSdk wm = OntSdk.getInstance();
wm.setRpc(rpcUrl);
wm.setRestful(restUrl);
wm.setDefaultConnect(wm.getRestful());
wm.openWalletFile("RecordTxDemo.json");
wm.setCodeAddress("803ca638069742da4b6871fe3d7f78718eeee78a");

Note: codeAddress是存证合约地址。

2.2 将可信申明保存到链上

sendCommit

String sendCommit(String issuerOntid, String password,byte[] salt, String subjectOntid, String claimId, Account payerAcct, long gaslimit, long gasprice)

功能说明: 将数据保存到链上,声明存证,当且仅当该声明没有被存证过,且Commit函数是由committer调用,才能存证成功;否则,存证失败。存证成功后,该声明的状态就是已存证(committed)。

参数说明:

参数 字段 类型 描述 说明
输入参数 issuerOntid String 可信申明签发者数字身份ontid 必选
输入参数 password String 数字身份密码 必选
输入参数 subjectOntid String 可信申明申请者ontid 必选
输入参数 claimId String 可信申明claim唯一性标志,即Claim里面的Jti字段 必选
输入参数 payerAcct String 交易费用支付者账号 必选
输入参数 gaslimit String gaslimit 必选
输入参数 gasprice String gasprice 必选
输出参数 交易hash boolean    

示例代码

String[] claims = claim.split("\\.");
JSONObject payload = JSONObject.parseObject(new String(Base64.getDecoder().decode(claims[1].getBytes())));
String commitHash = ontSdk.neovm().claimRecord().sendCommit(dids.get(0).ontid,password,dids.get(1).ontid,payload.getString("jti"),account1,ontSdk.DEFAULT_GAS_LIMIT,0)

2.3. 查询可信申明的状态

sendGetStatus

String sendGetStatus(String claimId)

功能说明:查询可信申明的状态

参数说明:

claimId: 可信申明claim唯一性标志,即Claim里面的Jti字段

返回值:有两部分: 第一部分,claim的状态:”Not attested”, “Attested”, “Attest has been revoked”;第二部分是存证者的ontid

示例代码

String getstatusRes2 = ontSdk.neovm().claimRecord().sendGetStatus(payload.getString("jti"));

2.4. 撤销可信申明

sendRevoke

String sendRevoke(String issuerOntid,String password,byte[] salt,String claimId,Account payerAcct,long gaslimit,long gas)

功能说明:撤销可信申明

参数 字段 类型 描述 说明
输入参数 issuerOntid String 可信申明签发者数字身份ontid 必选
输入参数 password String 数字身份密码 必选
输入参数 salt String issuer的salt 必选
输入参数 claimId String 可信申明claim唯一性标志,即Claim里面的Jti字段 必选
输入参数 payerAcct String 交易费用支付者账号 必选
输入参数 gaslimit String gaslimit 必选
输入参数 gasprice String gasprice 必选
输出参数 交易hash boolean    

示例代码

String revokeHash = ontSdk.neovm().claimRecord().sendRevoke(dids.get(0).ontid,password,salt,payload.getString("jti"),account1,ontSdk.DEFAULT_GAS_LIMIT,0);