Edit me

数字身份

Version 1.0.0

English / 中文

介绍

数字身份相关介绍可参考ONT ID 身份标识协议及信任框架

钱包文件及规范

钱包文件是一个Json格式的数据存储文件,可同时存储多个数字身份和多个数字资产账户。具体参考钱包文件规范

为了创建数字身份,您首先需要创建/打开一个钱包文件。

//如果不存在钱包文件,会自动创建钱包文件。
OntSdk ontSdk = OntSdk.getInstance();
ontSdk.openWalletFile("Demo3.json");

注:目前仅支持文件形式钱包文件,也可以扩展支持数据库或其他存储方式。

数字身份数据结构

Identity数据结构说明

ontid 是代表身份的唯一的id label 是用户给身份所取的名称。 lock 表明身份是否被用户锁定了。客户端不能更新被锁定的身份信息。默认值为false。 controls 是身份的所有控制对象ControlData的数组。 extra 是客户端开发者存储额外信息的字段。可以为null。

//Identity数据结构
public class Identity {
	public String label = "";
	public String ontid = "";
	public boolean isDefault = false;
	public boolean lock = false;
	public List<Control> controls = new ArrayList<Control>();
	public  Object extra = null;
}

algorithm是用来加密的算法名称。 parameters 是加密算法所需参数。 curve 是椭圆曲线的名称。 id 是control的唯一标识。 key 是NEP-2格式的私钥。

public class Control {
    public String algorithm = "ECDSA";
    public Map parameters = new HashMap() ;
    public String id = "";
    public String key = "";
    public String salt = "";
    public String hash = "sha256";
    @JSONField(name = "enc-alg")
    public String encAlg = "aes-256-gcm";
    public String address = "";
}

数字身份接口

1. 注册身份

创建数字身份指的是产生一个Identity数据结构的身份信息,并写入到到钱包文件中。

Identity identity = ontSdk.getConnect().createIdentity("passwordtest");
//创建的账号或身份只在内存中,如果要写入钱包文件,需调用写入接口
ontSdk.getWalletMgr().writeWallet();

向链上注册身份

只有向区块链链成功注册身份之后,该身份才可以真正使用。

有两种方法实现向链上注册身份

方法一,注册者指定支付交易费用的账户地址

Identity identity = ontSdk.getWalletMgr().createIdentity(password);
ontSdk.nativevm().ontId().sendRegister(identity2,password,payerAcct,gaslimit,gasprice);

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Identity identity = ontSdk.getWalletMgr().createIdentity(password);
Transaction tx = ontSdk.nativevm().ontId().makeRegister(identity.ontid,password,payerAcc.address,ontSdk.DEFAULT_GAS_LIMIT,0);
ontSdk.signTx(tx,identity.ontid,password);
ontSdk.getConnect().sendRawTransaction(tx);

链上注册成功后,对应此ONT ID的身份描述对象DDO将被存储在本体区块链上。

关于DDO的信息可以从ONT ID 身份标识协议

2. 身份管理

导入身份

当用户已经拥有了一个数字身份或者数字账户,SDK支持将其导入到钱包文件中。

Note: 建议导入一个数字身份之前,建议查询链上身份,如果链上身份DDO不存在,表示此数字身份未在链上注册,请使用上面注册数字身份的方法把身份注册到链上。

Identity identity = ontSdk.getWalletMgr().importIdentity(encriptPrivateKey,password,salt,address);
//写入钱包      
ontSdk.getWalletMgr().writeWallet();

参数说明: encriptPrivateKey: 加密后的私钥 password: 加密私钥使用的密码 salt: 解密私钥用的参数 address: 账户地址base58编码

移除身份

ontSdk.getWalletMgr().getWallet().removeIdentity(ontid);
//写入钱包
ontSdk.getWalletMgr().writeWallet();

设置默认账号或身份

//根据账户地址设置默认账户
ontSdk.getWalletMgr().getWallet().setDefaultAccount(address);
//根据identity索引设置默认identity
ontSdk.getWalletMgr().getWallet().setDefaultIdentity(index);
ontSdk.getWalletMgr().getWallet().setDefaultIdentity(ontid);

3. 查询链上身份信息

链上身份DDO信息,可以通过ONT ID进行查询。

//通过ONT ID获取DDO
String ddo = ontSdk.nativevm().ontId().sendGetDDO(ontid);

//返回DDO格式
{
	"Attributes": [{
		"Type": "String",
		"Value": "value1",
		"Key": "key1"
	}],
	"OntId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy",
	"Recovery": "TA6AhqudP1dcLknEXmFinHPugDdudDnMJZ",
	"Owners": [{
		"Type": "ECDSA",
		"Curve": "P256",
		"Value": "12020346f8c238c9e4deaf6110e8f5967cf973f53b778ed183f4a6e7571acd51ddf80e",
		"PubKeyId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy#keys-1"
	}, {
		"Type": "ECDSA",
		"Curve": "P256",
		"Value": "1202022fabd733d7d7d7009125bfde3cb0afe274769c78fd653079ecd5954ae9f52644",
		"PubKeyId": "did:ont:TA5UqF8iPqecMdBzTdzzANVeY8HW1krrgy#keys-2"
	}]
}

4. 身份属性

4.1 更新链上DDO属性

方法一,指定支付交易费用的账户

//添加或者更新属性
String sendAddAttributes(String ontid, String password,byte[] salt Attribute[] attributes,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 password String 数字身份密码 必选,私钥解密的密码
  salt byte[]   必选
  ontid String 数字身份id 必选,身份Id
  attributes Attribute[] 属性数组 必选
  payerAcct Account 交易费用支付者账户 必选,
  gaslimit long gaslimit 必选
  gasprice long gas价格 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Transaction makeAddAttributes(String ontid, String password, byte[] salt,Attribute[] attributes,String payer,
                                          long gaslimit,long gasprice)

示例代码

Transaction tx = ontSdk.nativevm().ontId().makeAddAttributes(ontid,password,salt,attributes,payer,gaslimit,0);
ontSdk.signTx(tx,identity.ontid,password);
ontSdk.getConnect().sendRawTransaction(tx);

4.2 移除链上DDO属性

方法一

String sendRemoveAttribute(String ontid,String password,byte[] salt,String path,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 password String 数字身份密码 必选
  salt byte[]   required
  ontid String 数字身份ID 必选,身份Id
  path byte[] path 必选,path
  payer String payer 必选,payer
  payerpassword String 支付交易费用的账户地址 必选
  gas long 支付的交易费用 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Transaction makeRemoveAttribute(String ontid,String password,salt,String path,String payer,long gaslimit,long gasprice)

示例代码:

Transaction tx = ontSdk.nativevm().ontId().makeRemoveAttribute(ontid,password,salt,path,payer,gaslimit,0);
ontSdk.signTx(tx,identity.ontid,password);
ontSdk.getConnect().sendRawTransaction(tx);

5. 身份公钥

一个身份可以有多个控制人,身份中的公钥是控制人的公钥列表。

5.1 添加公钥

方法一

String sendAddPubKey(String ontid, String password,byte[] salt, String newpubkey,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 password String 数字身份密码 必选
  salt byte[]   required
  ontid String 数字身份ID 必选,身份Id
  newpubkey String 公钥 必选, newpubkey
  payerAcct Account Payment transaction account 必选,payer
  gaslimit long gaslimit 必选
  gasprice long gas价格 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Transaction makeAddPubKey(String ontid,String password,byte[] salt,String newpubkey,String payer,long gaslimit,long gasprice)

参数说明请参考方法一sendAddPubKey

示例代码

Transaction tx = ontSdk.nativevm().ontId().makeAddPubKey(ontid,password,byte[] salt,newpubkey,payer,gaslimit,gasprice);
ontSdk.signTx(tx,identity.ontid,password);
ontSdk.getConnect().sendRawTransaction(tx);

方法三,recovery机制 recovery可以为ontid添加公钥

String sendAddPubKey(String ontid,String recoveryAddr, String password, byte[] salt,String newpubkey,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 ontid String 数字身份ID 必选,身份Id
  recoveryAddr String recovery地址 必选
  password String recovery密码 必选
  salt byte[]   required
  newpubkey String 公钥 必选, newpubkey
  payer String payer 必选,payer
  payerpwd String 支付交易费用的账户地址 必选
  gaslimit long gaslimit 必选
  gasprice long gas价格 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法四(recovery机制)

Transaction makeAddPubKey(String ontid,String recoveryAddr,String password,byte[] salt,String newpubkey,
                                          String payer,long gaslimit,long gasprice)

参数说明请参考方法三

5.2 删除公钥

方法一,删除公钥

String sendRemovePubKey(String ontid, String password,byte[] salt, String removePubkey,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 password String 数字身份密码 必选
  salt byte[]   required
  ontid String 数字身份ID 必选,身份Id
  removePubkey String 公钥 必选, removePubkey
  payer String payer 必选,payer
  payerpassword String 支付交易费用的账户地址 必选
  gas long 支付的交易费用 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Transaction tx = ontSdk.nativevm().ontId().makeRemovePubKey(ontid,password,salt,removePubkey,payer,gas);
ontSdk.signTx(tx,identity.ontid.replace(Common.didont,""),password,salt);
ontSdk.getConnect().sendRawTransaction(tx);

方法三,恢复人机制

String sendRemovePubKey(String ontid, String recoveryAddr,String password, byte[] salt,String removePubkey,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 ontid String 数字身份ID 必选,身份Id
  recoveryAddr String recovery地址 必选
  password String recovery密码 必选
  salt byte[]   required
  newpubkey String 公钥 必选, newpubkey
  payerAcct Account Payment transaction account 必选,payer
  gaslimit long gaslimit 必选
  gasprice long gas价格 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法四(recovery机制)

Transaction makeRemovePubKey(String ontid,String recoveryAddr, String password,byte[] salt, String removePubkey,String payer,
                                          long gaslimit,long gasprice)

参数说明请参考方法三

6. 身份恢复人

当ontid中控制人私钥丢失时,身份恢复人可以设置新的控制人。

6.1 添加恢复人

方法一

String sendAddRecovery(String ontid, String password,byte[] salt, String recoveryAddr,Account payerAcct,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 password String 数字身份密码 必选
  salt byte[]   required
  ontid String 数字身份ID 必选,身份Id
  recoveryAddr String recovery账户地址 必选,recovery
  payerAcct Account payerAcct 必选,payer
  gaslimit long gaslimit 必选
  gasprice long gas价格 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二,将构造好的交易发送给服务器,让服务器进行交易费用账号的签名操作。

Transaction makeAddRecovery(String ontid, String password,byte[] salt, String recoveryAddr,String payer,long gaslimit,long gasprice)

示例

Transaction tx = ontSdk.nativevm().ontId().makeAddRecovery(ontid,password,salt,recovery,payer,gas);
ontSdk.signTx(tx,identity.ontid.replace(Common.didont,""),password,salt);
ontSdk.getConnect().sendRawTransaction(tx);

6.2 修改recovery

方法一

String sendChangeRecovery(String ontid, String newRecovery, String oldRecovery, String password,,byte[] salt,long gaslimit,long gasprice)
参数 字段 类型 描述 说明
输入参数 ontid String 数字身份ID 必选,身份Id
  newRecovery String newRecovery账户地址 必选,newRecovery
  oldRecovery String oldRecovery账户地址 必选,oldRecovery
  oldRecovery password String oldRecovery password 必选
  password String 数字身份密码 必选
  salt byte[]   required
  gaslimit long gaslimit 必选
  gasprice long gasprice 必选
输出参数 txhash String 交易hash 交易hash是64位字符串

方法二

Transaction makeChangeRecovery(String ontid, String newRecovery, String oldRecovery, String password,byte[] salt,long gaslimit,long gasprice)

参数说明请参考上面的方法一