Edit me
English 中文

数字身份与可信声明

Version 0.7.0

1.1 创建身份

ONT ID是一个去中心化的身份标识,能够管理用户的各种数字身份认证。数字身份(Identity)是ONT SDK导出的一个核心类,该类包含代表身份的ONT ID属性。

关于数字身份的具体信息请查阅ONT TS SDk 中相关内容。

可以通过SDK来创建一个身份。创建身份的过程中会基于用户的私钥生成ONT ID。

关于ONT ID 的规范参见ONT ID生成规范

创建身份需要提供的参数如下:

privateKey 用户的私钥。可以通过SDK提供的方法安全地生成私钥。

password 用来加密和解密私钥的密码。

label 身份的名称

params 用来加密私钥的算法参数。可选参数。默认值如下:

{
    cost: 4096,
    blockSize: 8,
    parallel: 8,
    size: 64
}
import {Identity, Crypto} from 'ontology-ts-sdk';
//generate a random private key
const privateKey = Crypto.PrivateKey.random();

var identity = Identity.create(privateKey, password, label)
console.log(identity.ontid)

1.2 将ONT ID登记到链上

身份创建完成后,还需要将身份的ONT ID注册到链上,身份才算真正地创建完成。

发送ONT ID上链是需要发送交易的过程。可以通过调用SDK提供的方法构造交易对象。

一种比较典型的场景是通过传递刚刚创建的ONT ID和用户的私钥来构造交易对象。

构建交易

import {OntidContract} from 'ontology-ts-sdk';
import {TransactionBuilder} from 'ontology-ts-sdk'

//suppose we already got a identity
const did = identity.ontid;
//we need the public key, which can be generate from private key
const pk = privateKey.getPublicKey();
const gasPrice = '0';
const gasLimit = '20000;
const tx = OntidContract.buildRegisterOntidTx(did, pk, gasPrice, gasLimit);
Transaction.signTransaction(tx, privateKey);

该方法返回的是交易对象序列化好的参数,接下来是发送该参数。可以通过websocket或者http请求的方式发送。这里我们以websocket为例,这样能够监听链上推送回来的消息,来确认ONT ID是否上链成功。

添加交易Payer的签名

发送ONT ID上链的交易需要消耗手续费,我们需要给交易指定一个Payer,并添加Payer的签名。

import {TransactionBuilder} from 'ontology-ts-sdk'
//we also need an account to pay for the gas
//supporse we have an account and the privateKey
tx.payer = account.address
//Then sign the transaction with payer's account
//we already got transaction created before,add the signature.
TransactionBuilder.addSign(tx, privateKeyOfAccount)

发送交易

我们多种发送交易的方式,如Websocket, Restful和RPC。这里以Restful的方式为例。我们可以指定交易发送到的节点,如果不指定,默认发送到测试网。

import {RestClient, CONST} from 'ontology-ts-sdk'

const rest = new RestClient(CONST.TEST_ONT_URL.REST_URL);
rest.sendRawTransaction(tx.serialize()).then(res => {
    console.log(res)
})

返回结果如下:

{ Action: 'sendrawtransaction',
  Desc: 'SUCCESS',
  Error: 0,
  Result: 'dfc598649e0f3d9ff94486a80020a2775e1d474b843255f8680a3ac862c58741',
  Version: '1.0.0' }

如果结果返回状态成功,表明ONT ID上链成功。我们可以通过查询接口查询链上ONT ID的相关信息。

1.3 查询DDO

###构建交易

import {OntidContract} from 'ontology-ts-sdk';
//we use identity's ONT ID to create the transaction
const tx = OntidContract.buildGetDDOTx(identity.ontid)

###发送交易 查询交易不需要消耗gas,也就不需要指定payer和payer的签名。发送交易方法的第二个参数表示发送的是否是预执行的交易。预执行的交易只在接收到它的节点上运行,不需要等待共识。一般用来查询数据。

import {RestClient} from 'ontology-ts-sdk';
const rest = new RestClient();
rest.sendRawTransaction(tx, true).then(res => {
    console.log(res);
}

返回的结果如下:

{ Action: 'sendrawtransaction',
      Desc: 'SUCCESS',
      Error: 0,
      Result:
       { State: 1,
         Gas: 20000,
         Result: '26010000002103547c5abdbe66677ba7001cefd773f01a19c6360b15ee51c6db43911f046564fc0000' },
      Version: '1.0.0' }
      

Result 就是序列化后的DDO(ONT ID object) 我们可以通过反序列化得到详细数据。

const ddo = DDO.deserialize(response.Result.Result);
console.log(ddo);

2. 签发可信声明

用户可能会有多种不同的身份。比如拥有公安部颁发的身份证的用户,都拥有中国公民这种身份,用户可以在生活中的某些场景中,出示自己的身份证,来声明自己的这种身份;身份证就是公安部对我们公民身份的认证。

再比如某所大学毕业的学生,可以获得该大学的毕业生的身份。这个身份可以通过学校给学生颁发的毕业证来证明。现在,还有一种新的方式来认证这种某大学毕业生的身份。这就是通过区块链技术,将某种可信声明同用户的ONT ID绑定起来。同样地,用户可以向多个不同的机构或平台获取不同的可信声明。

任何一个ONT ID的所有者(Owner)均可以向自己或他人签发可信声明。

政府机关、大学、银行、第三方认证服务机构(比如CA机构)、生物识别科技公司等等可作为现实信任机构,可以作为特定的合作方,加入到在本体生态中。 如果你可能成为认证服务合作方,请参见认证服务合作方接入标准

我们以中国复旦大学颁发数字毕业证书来举例,说明如何获取第三方授予用户的的身份声明。

假设Alice是复旦大学的学生,向学校申请毕业证的数字证明。学校验证确认了Alice的身份后,通过调用SDK的api生成一份可信声明,该声明包含Alice的毕业信息,和用学校的私钥对声明做的签名。

构建可信声明

import {Claim} from 'ontology-ts-sdk';

const signature = null;
const useProof = false;
const claim = new Claim({
	messageId: '1',
	issuer: 'did:ont:AJTMXN8LQEFv3yg8cYKWGWPbkz9KEB36EM',
	subject: 'did:ont:AUEKhXNsoAT27HJwwqFGbpRy8QLHUMBMPz',
	issueAt: 1525800823
}, signature, useProof);

claim.version = '0.7.0';
claim.context = 'https://example.com/template/v1';
claim.content = {
	Name: 'Alice',
	Age: '22',
	......
};

可信声明的属性如下:

signature 可信声明的签名。用来验证可信声明。在初始化时可以为空。

useProof 指定声明序列化的规范为JWT或者JWT-X.改值为true表明使用JWT-X.

messageId 声明的ID

issuer 声明签发者的ONT ID.

subject 声明接收者的ONT ID.

issueAt 创建声明时的时间。以时间戳表示。

version 声明的版本。

context 声明的模板在线保存的url。

content 声明的内容。JSON格式。

在链上存证可信声明

声明的签发者可以将声明存证到链上。 方法的参数如下:

url 发送交易到的节点的websocket url

privateKey 签发者的私钥。用来签名交易。

gasPrice 交易的gas price

gasLimit 交易的gas limit

payer 交易gas的payer

const url = 'http://polaris1.ont.io:20335';
const gasPrice = '500';
const gasLimit = '20000';
const payer = new Address('AMLn5W7rz1sYd1hGpuQUfsnmUuUco22pM8');
const privateKey = new PrivateKey('44fd06de5a6529f3563aad874fb6c8240....')
const result = await claim.attest(url, gasPrice, gasLimit, payer, privateKey);

返回结果为true表明声明存证成功。

2.3 撤销声明

声明的签发者可以撤销可信声明。 方法的参数如下: url 发送交易到的节点的websocket url

privateKey 签发者的私钥。用来签名交易。

gasPrice 交易的gas price

gasLimit 交易的gas limit

payer 交易gas的payer

const url = 'http://polaris1.ont.io:20335';
const gasPrice = '500';
const gasLimit = '20000';
const payer = new Address('AMLn5W7rz1sYd1hGpuQUfsnmUuUco22pM8');
const privateKey = new PrivateKey('44fd06de5a6529f3563aad874fb6c8240....')
const result = await claim.revoke(url, gasPrice, gasLimit, payer, privateKey);

返回结果为true表明撤销声明成功。

2.4 验证可信声明

在上面一节我们举例说明了如何获取第三方授予的身份声明,用户在需要的时候可以出示这些声明。同时,这些声明可以通过SDK提供的方法来验证是否是真实的、未篡改的。

我们以Alice同学求职的情况为例说明验证可信声明的过程。

Alice向公司B求职时,提供了复旦大学授予的数字毕业证书,该证书是一份符合claim声明格式的JSON文件。公司B可以通过调用ONT SDK的方法来验证该声明。任何需要验证声明的用户都可以调用相关方法,查询声明在链上的状态,验证声明。

方法的参数如下: url 节点的Restful接口url

const url = 'http://polaris1.ont.io:20335';
const result = await claim.getStatus(url);

如果声明的状态为“已存证”且声明签发者也正确,则表明声明通过验证。