Bootstrap

BSN-DID研究--主题2:发证方函数

本文开始对帮助手册的API进行调用, 分析具体的输入参数和返回结果。
主题1 :创建DID、上链、查询、验证, 主要是 帮助手册的14.4.2 发证方
-------------------------------------------------------------------------------------------
1 注册发证方
方法名:   registerAuthIssuer(RegisterAuthorityIssuer register)
方法描述: DID用户申请成为发证方角色,注册成功则发证方信息上链。
【说明】 参数中包含了一个私钥,就是DID的主私钥。该私钥不能丢失, 以后发证时要用这个私钥签名的。
               这个私钥并不会传送给服务端,只是在函数内计算公钥签名,对请求数据进行签名的。以后相关的函数中也会要求传入私钥进行计算。
public static void registerAuthIssuerTest() {
    DidDataWrapper didDataWrapper = didClient.createDid(true);
    RegisterAuthorityIssuer register = new RegisterAuthorityIssuer();
    register.setDid(didDataWrapper.getDid());
    register.setPrivateKey(didDataWrapper.getAuthKeyInfo().getPrivateKey());
    register.setName("MetaPorts company");
    System.out.println("registerAuthIssuerTest()  register = "+JSONArray.toJSONString(register));
    
    boolean registerresult = didClient.registerAuthIssuer(register);
    System.out.println("registerAuthIssuerTest()  registerresult = "+registerresult);
}
运行结果:
registerAuthIssuerTest()  register = 
{"did":"did:bsn:4GpA5R4hvix2cLxUDPjLsuLZFD2t","name":"MetaPorts company","privateKey":"19735796550396724256944876838556861168110780296787174707640481151280248118014"}
registerAuthIssuerTest()  registerresult = true
2 查询发证方
方法名:   queryAuthIssuerList(AuthIssuerList query)
方法描述:  通过DID标识符查询是否是发证方,以及通过名称可识别出可签发哪类凭证。
【说明】输入参数did,如果指定为具体的did字符串,查询结果就是一条。
  page,指定第几页。 size:指定每页多少条记录。
目前来看, 发证方的测试数据大约400条。 允许每页50条记录,条数再多的话(size=100)就报告字符串溢出了。
public static void queryAuthIssuerListTetst() {
        DidDataWrapper didDataWrapper = didClient.createDid(true);
        RegisterAuthorityIssuer register = new RegisterAuthorityIssuer();
        register.setDid(didDataWrapper.getDid());
        register.setPrivateKey(didDataWrapper.getAuthKeyInfo().getPrivateKey());
        register.setName("xxxx company");
        boolean registerresult = didClient.registerAuthIssuer(register);
        AuthIssuer queryIssuer = new AuthIssuer();
        queryIssuer.setPage(1);
        queryIssuer.setSize(10);
//        queryIssuer.setDid(didDataWrapper.getDid());   
        queryIssuer.setDid("");  
        Pages<AuthorityIssuer> issuerList = didClient.queryAuthIssuerList(queryIssuer);
        List<AuthorityIssuer> result = issuerList.getResult();
//        AuthorityIssuer issuer = result.get(0);   //这种做法是不行的,必须用下面的写法才能解析出具体对象
        System.out.println("=================="+JSONArray.toJSONString(result));
        String ret = JSONArray.toJSONString(result);
        JSONArray jarray = JSONArray.parseArray(ret);
        for(int i=0;i<jarray.size();i++){
            System.out.println(jarray.get(i));
            JSONObject jobj = jarray.getJSONObject(i);
            System.out.println("name : "+ jobj.get("name"));
            System.out.println("did : "+ jobj.get("did"));
        }
    }
指定did="did":"did:bsn:21UKCBwnCgaYYKpEG5Jd2DDzyR99",运行结果:
==================[{"name":"xxxx company","did":"did:bsn:21UKCBwnCgaYYKpEG5Jd2DDzyR99"}]
{"name":"xxxx company","did":"did:bsn:21UKCBwnCgaYYKpEG5Jd2DDzyR99"}
name : xxxx company
did : did:bsn:21UKCBwnCgaYYKpEG5Jd2DDzyR99
指定did="",  运行结果:
==================[{"name":"testname","did":"did:bsn:uWEju29UN5kce13iRrwa7Zk8HPJ"},{"name":"xxxx company","did":"did:bsn:Nd9gpybVfCB3LnnFRitGNNXyjrL"},{"name":"xxxx company","did":"did:bsn:aNs5oYjCytvAU1mTWfhk731FS29"},{"name":"xxxx company","did":"did:bsn:4CzoqqbeGir2RbiMSxhudjwXXD8d"},{"name":"xxxx company","did":"did:bsn:3LCSy1v9WDFhG2GZjQ4iniscAHiz"},{"name":"xxxx company","did":"did:bsn:4TwbnUN2CbWVwHdBaR98shg2GxDV"},{"name":"xxxx company","did":"did:bsn:3SCN2AUmh3pJVuwvTDb3Coy6koxa"},{"name":"xxxx company","did":"did:bsn:4RxVPyL6ae2bH6TYECzfmVhPfoVH"},{"name":"xxxx company","did":"did:bsn:4KiRgTu36MxpxmMi7BiD8zXZq9Uv"},{"name":"xxxx company","did":"did:bsn:4Z9qpPZeSWiikvyMZksEnKPx97Pk"}]
{"name":"testname","did":"did:bsn:uWEju29UN5kce13iRrwa7Zk8HPJ"}
name : testname
did : did:bsn:uWEju29UN5kce13iRrwa7Zk8HPJ
{"name":"xxxx company","did":"did:bsn:Nd9gpybVfCB3LnnFRitGNNXyjrL"}
name : xxxx company
did : did:bsn:Nd9gpybVfCB3LnnFRitGNNXyjrL
{"name":"xxxx company","did":"did:bsn:aNs5oYjCytvAU1mTWfhk731FS29"}
name : xxxx company
did : did:bsn:aNs5oYjCytvAU1mTWfhk731FS29
{"name":"xxxx company","did":"did:bsn:4CzoqqbeGir2RbiMSxhudjwXXD8d"}
name : xxxx company
did : did:bsn:4CzoqqbeGir2RbiMSxhudjwXXD8d
{"name":"xxxx company","did":"did:bsn:3LCSy1v9WDFhG2GZjQ4iniscAHiz"}
name : xxxx company
did : did:bsn:3LCSy1v9WDFhG2GZjQ4iniscAHiz
{"name":"xxxx company","did":"did:bsn:4TwbnUN2CbWVwHdBaR98shg2GxDV"}
name : xxxx company
did : did:bsn:4TwbnUN2CbWVwHdBaR98shg2GxDV
{"name":"xxxx company","did":"did:bsn:3SCN2AUmh3pJVuwvTDb3Coy6koxa"}
name : xxxx company
did : did:bsn:3SCN2AUmh3pJVuwvTDb3Coy6koxa
{"name":"xxxx company","did":"did:bsn:4RxVPyL6ae2bH6TYECzfmVhPfoVH"}
name : xxxx company
did : did:bsn:4RxVPyL6ae2bH6TYECzfmVhPfoVH
{"name":"xxxx company","did":"did:bsn:4KiRgTu36MxpxmMi7BiD8zXZq9Uv"}
name : xxxx company
did : did:bsn:4KiRgTu36MxpxmMi7BiD8zXZq9Uv
{"name":"xxxx company","did":"did:bsn:4Z9qpPZeSWiikvyMZksEnKPx97Pk"}
name : xxxx company
did : did:bsn:4Z9qpPZeSWiikvyMZksEnKPx97Pk
3 注册凭证模板
方法名:     registerCpt(RegisterCpt registerCpt)
方法描述: 发证方自定义凭证模板,可以约定哪些属性值申请人要必须提供的。比如高校毕业证的模板,可以约定“姓名”、“学号”为必须填写的信息。
【说明】注册模板时无需指定cptId,等到注册成功返回cptId。
public static void registerCptTest() {
    DidDataWrapper didDataWrapper = didClient.createDid(true);
    RegisterAuthorityIssuer register = new RegisterAuthorityIssuer();
    register.setDid(didDataWrapper.getDid());
    register.setPrivateKey(didDataWrapper.getAuthKeyInfo().getPrivateKey());
    register.setName("xxxx company");
    boolean registerresult = didClient.registerAuthIssuer(register);
    RegisterCpt registerCpt = new RegisterCpt();
    registerCpt.setDid(didDataWrapper.getDid());
    registerCpt.setTitle("test cpt template 01");
    registerCpt.setDescription("test cpt tempalte 01 long descriptuion");
    registerCpt.setType("Proof");
    registerCpt.setPrivateKey(didDataWrapper.getAuthKeyInfo().getPrivateKey());
    Map<String, JsonSchema> cptJsonSchemas = new HashMap<>();
    JsonSchema jsonSchema1 = new JsonSchema();
    jsonSchema1.setDescription("user name");
    jsonSchema1.setRequired(true);
    jsonSchema1.setType("String");
    cptJsonSchemas.put("name", jsonSchema1);
    JsonSchema jsonSchema2 = new JsonSchema();
    jsonSchema2.setDescription("user sex");
    jsonSchema2.setRequired(false);
    jsonSchema2.setType("String");
    cptJsonSchemas.put("sex", jsonSchema2);
    JsonSchema jsonSchema3 = new JsonSchema();
    jsonSchema3.setDescription("user age");
    jsonSchema3.setRequired(true);
    jsonSchema3.setType("Number");
    cptJsonSchemas.put("age", jsonSchema3);
    registerCpt.setCptJsonSchema(cptJsonSchemas);
    System.out.println("registerCptTest()  registerCpt = "+JSONArray.toJSONString(registerCpt));
    
    CptBaseInfo cptBaseInfo = didClient.registerCpt(registerCpt);
    System.out.println("registerCptTest()  cptBaseInfo = "+JSONArray.toJSONString(cptBaseInfo));
}
运行结果:
registerCptTest()  registerCpt = 
{
    "cptJsonSchema":{
        "sex":{
            "description":"user sex",
            "required":false,
            "type":"String"
        },
        "name":{
            "description":"user name",
            "required":true,
            "type":"String"
        },
        "age":{
            "description":"user age",
            "required":true,
            "type":"Number"
        }
    },
    "description":"test cpt tempalte 01 long descriptuion",
    "did":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr",
    "privateKey":"23084912555970257285541363210643018905213545822808257650593849408195914596083",
    "title":"test cpt template 01",
    "type":"Proof"
}
registerCptTest()  cptBaseInfo = {"cptId":732210021407470105,"cptVersion":1}
4 查询凭证模板列表
方法名:    queryCptListByDid(QueryCpt query)
方法描述: 任何人都可通过DID标识符查询其所有的凭证模板。同一个个人/组织有可能会注册多个凭证模板。比如高校除了毕业证模板外,可能还有学位证模板、肄业证模板等。
public static void queryCptListByDidTest() {
        QueryCpt query = new QueryCpt();
        query.setDid("did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr");   //查指定DID的所有证书模板, 必填字段,不能为null
        query.setPage(1);
        query.setSize(10);
        try {
            Pages<CptInfo> pages = didClient.queryCptListByDid(query);
            System.out.println("queryCptListByDidTest() size = "+pages.getResult().size());
            //不能这样写代码,必须用JSONObject
//            for(CptInfo cpt : pages.getResult()){
//                System.out.println(cpt.getCptId() + ",  "+cpt.getTitle());
//            }
            System.out.println("=================="+JSONArray.toJSONString(pages.getResult()));
            String ret = JSONArray.toJSONString(pages.getResult());
            JSONArray jarray = JSONArray.parseArray(ret);
            for(int i=0;i<jarray.size();i++){
                System.out.println(jarray.get(i));
                JSONObject jobj = jarray.getJSONObject(i);
            }
        }catch (Exception e){
            System.out.println("query cptList failed:query cpt list by did failed:server process failed\n "+e.getMessage());
        }
        System.out.println("==================");
    }
运行结果:
queryCptListByDidTest() size = 1
==================
[
    {
        "cptJsonSchema":{
            "sex":{
                "description":"user sex",
                "type":"String",
                "required":false
            },
            "name":{
                "description":"user name",
                "type":"String",
                "required":true
            },
            "age":{
                "description":"user age",
                "type":"Number",
                "required":true
            }
        },
        "cptId":732210021407470105,
        "description":"test cpt tempalte 01 long descriptuion",
        "create":"2022-10-02 14:07:47",
        "update":"2022-10-02 14:07:47",
        "proof":{
            "creator":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr",
            "type":"Secp256k1",
            "signatureValue":"FQGx87YB9jTW/p8cNXdhGYL3G51ULZ2xJD50hEmq4BEwg3uX+Bw66Y1MOykKNAFnmOnrHkCpxA1PkU3dpBTg/wE="
        },
        "cptVersion":1,
        "title":"test cpt template 01",
        "publisherDid":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr"
    }
]
{"cptJsonSchema":{"sex":{"description":"user sex","type":"String","required":false},"name":{"description":"user name","type":"String","required":true},"age":{"description":"user age","type":"Number","required":true}},"cptId":732210021407470105,"description":"test cpt tempalte 01 long descriptuion","create":"2022-10-02 14:07:47","update":"2022-10-02 14:07:47","proof":{"creator":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr","type":"Secp256k1","signatureValue":"FQGx87YB9jTW/p8cNXdhGYL3G51ULZ2xJD50hEmq4BEwg3uX+Bw66Y1MOykKNAFnmOnrHkCpxA1PkU3dpBTg/wE="},"cptVersion":1,"title":"test cpt template 01","publisherDid":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr"}
==================
5 查询凭证模板
方法名:    queryCptById(Long cptId)
方法描述: 通过某个具体的凭证模板ID查询其内容。
【说明】cptId是个Long类型数字
public static void queryCptByIdTest() {  
    CptInfo cptInfo = didClient.queryCptById(732210021407470105L);
    System.out.println(JSONArray.toJSONString(cptInfo));
}
运行结果:
{
    "cptId":732210021407470105,
    "cptJsonSchema":{
        "sex":{
            "description":"user sex",
            "required":false,
            "type":"String"
        },
        "name":{
            "description":"user name",
            "required":true,
            "type":"String"
        },
        "age":{
            "description":"user age",
            "required":true,
            "type":"Number"
        }
    },
    "cptVersion":1,
    "create":"2022-10-02 14:07:47",
    "description":"test cpt tempalte 01 long descriptuion",
    "proof":{
        "creator":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr",
        "signatureValue":"FQGx87YB9jTW/p8cNXdhGYL3G51ULZ2xJD50hEmq4BEwg3uX+Bw66Y1MOykKNAFnmOnrHkCpxA1PkU3dpBTg/wE=",
        "type":"Secp256k1"
    },
    "publisherDid":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr",
    "title":"test cpt template 01",
    "update":"2022-10-02 14:07:47"
}
6  更新凭证模板
方法名:    updateCpt(RegisterCpt registerCpt)
方法描述: 发证方对自己已注册过的凭证模板内容进行更新。凭证模板更新不影响已签发的凭证。
【说明】 第一次注册凭证模板时, 模板的版本号为1。 以后每次更新模板,版本号+1。
               更新模板不会改变模板编号cptId。
public static void updateCptTest(){
    //这是原来模板内容
    RegisterCpt registerCpt = new RegisterCpt();
    registerCpt.setDid("did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr");
    registerCpt.setTitle("test cpt template 01");
    registerCpt.setDescription("test cpt tempalte 01 long descriptuion");
    registerCpt.setType("Proof");
    registerCpt.setPrivateKey("23084912555970257285541363210643018905213545822808257650593849408195914596083");
    Map<String, JsonSchema> cptJsonSchemas = new HashMap<>();
    JsonSchema jsonSchema1 = new JsonSchema();
    jsonSchema1.setDescription("user name");
    jsonSchema1.setRequired(true);
    jsonSchema1.setType("String");
    cptJsonSchemas.put("name", jsonSchema1);
    JsonSchema jsonSchema2 = new JsonSchema();
    jsonSchema2.setDescription("user sex");
    jsonSchema2.setRequired(false);
    jsonSchema2.setType("String");
    cptJsonSchemas.put("sex", jsonSchema2);
    JsonSchema jsonSchema3 = new JsonSchema();
    jsonSchema3.setDescription("user age");
    jsonSchema3.setRequired(true);
    jsonSchema3.setType("Number");
    cptJsonSchemas.put("age", jsonSchema3);
    registerCpt.setCptJsonSchema(cptJsonSchemas);
    //新增地址字段
    JsonSchema jsonSchema4 = new JsonSchema();
    jsonSchema4.setDescription("user address");
    jsonSchema4.setRequired(true);
    jsonSchema4.setType("String");
    cptJsonSchemas.put("address", jsonSchema4);
    registerCpt.setCptId(732210021407470105L);
    CptBaseInfo cptBaseInfo2 = didClient.updateCpt(registerCpt);
    System.out.println(JSONArray.toJSONString(cptBaseInfo2));
    CptInfo cptInfo  = didClient.queryCptById(cptBaseInfo2.getCptId());
    System.out.println(JSONArray.toJSONString(cptInfo));
}
运行结果:
{"cptId":732210021407470105,"cptVersion":2}
{"cptId":732210021407470105,"cptJsonSchema":{"address":{"description":"user address","required":true,"type":"String"},"sex":{"description":"user sex","required":false,"type":"String"},"name":{"description":"user name","required":true,"type":"String"},"age":{"description":"user age","required":true,"type":"Number"}},"cptVersion":2,"create":"2022-10-02 14:07:47","description":"test cpt tempalte 01 long descriptuion","proof":{"creator":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr","signatureValue":"zMbSjUkua3qdO7DeIETpKQEXNDHs+zmHv7c8+7RMVkoB2LRjwpcqVvQDFJ03W824pDXchfXcE/u9g11EB1LHyQE=","type":"Secp256k1"},"publisherDid":"did:bsn:fEsNK8gjTFCBEgtXfvR2avPgJzr","title":"test cpt template 01","update":"2022-10-02 14:38:25"}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;