SDK 1.0 版本的打造 | BSN 联盟链开发(三)

  • 李大狗
  • 更新于 2020-01-23 11:40
  • 阅读 1228

SDK 的 1.0 版本出炉~

系列索引: 上链与背后的流程 | 联盟链开发(一) 动手编 SDK | 联盟链开发(二) SDK 1.0 版本的打造 | 联盟链开发(三) 将 SDK 发布到 PIP | 联盟链开发(四) 什么样的数据应该上链?| 联盟链开发 (五) BSN 相关问与答 | 联盟链开发(六) 链上简历应用 — 设计 | 联盟链开发(七) FISCO BCOS 介绍 | 联盟链开发(八) WeIdentity 极速体验 | 联盟链开发(九) 给Remix升个级 | 联盟链开发(十) 伪代码简述 ECDSA 签名过程 | 联盟链开发(十一) WeIdentity 的多签及限量凭证的实现 | 联盟链开发(十二)


上回,我们开始了亲手做 SDK 的过程。这次,我们将 SDK 开发 1.0 版本开发完成。

有需要的同学可以通过pip进行 SDK 的安装:

pip3 install bsn-sdk

通过如下链接查看如何使用:

https://github.com/leeduckgo/bsn_py_sdk


在上回,我们将示例代码中的函数初步抽象为get_data(baseKey, url)__do_get_data(userCode, appCode, chainCode, funcName, baseKey, url) 两个函数,并将其挂在 Operator类下。

我们现在要做如下改进:

  • 将函数中硬编码的变量放在类的__init__初始化函数内
  • 进一步的对函数进行抽象
  • 对返回值进行处理

1 1 __init__

__init__是一个特殊的函数,它在我们构建对象的时候被调用。例如:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

这是一个「人」类,当我们执行personA = Person("Jack", 15)的时候,Jack15便分别作为姓名与年龄赋值给 personA 这个对象了。

对于我们操作工 Operator 来说,以下这些变量,或者说属性是要在初始化的时候被赋值的:

def __init__(self, userCode, appCode, chainCode, url, cert_path):
    # 用户参数
    self.userCode = userCode
    self.appCode = appCode
    self.chainCode = chainCode
    self.url = url # 节点地址
    self.cert_path = cert_path # 签名文件地址

2 进一步抽象

观察get_datasave_dataupdate_datadelete_dataget_history五个方法,发现可以抽象为两种方法 —— 仅使用baseKey的方法(get、delete、get_history)与使用baseKeybaseInfo的方法(save、update),因此我们可以抽象出两个私有函数__handle_with_key__handle_with_key_and_value

    '''
        private functions.
    '''
    def __handle_with_key(self, userCode, appCode, chainCode, url, cert_path, funcName, baseKey):
        ……

    def __handle_with_key_and_value(self, userCode, appCode, chainCode, url, cert_path, funcName, baseKey, baseInfo):
        ……

五个公共函数通过调用私有函数来实现:

    '''
        public functions.
    '''
    def get_data(self, baseKey):
        funcName = "get"

        return self.__handle_with_key(self.userCode, self.appCode,
        self.chainCode, self.url, 
        self.cert_path, funcName, baseKey)

                ……
    def update_data(self, baseKey, baseInfo):
        funcName = "update"

        return self.__handle_with_key_and_value(self.userCode, self.appCode,
        self.chainCode, self.url, self.cert_path,
        funcName, baseKey, baseInfo)
        ……

3 对返回值进行处理

节点返回的生数据是这样的:

{'header': {'code': 0, 'msg': '处理成功'}, 'body': {'blockInfo': {'txId': '664c8d82d22ef5dc0c3df34e6558cbecdfa315598fb848d721cb2c4436c5d57d', 'status': 0, 'blockHash': ''}, 'ccRes': {'ccCode': 200, 'ccData': ……, 'mac': 'MEUCIQCr4vuQpObIsZKLutZ/QEzDoZcg+EFbtFSeyzV/V9fkTAIgSbJvdT8iaYsIscoZwLYveTJAlTeaxbT/o9X7+HvF8HM='}

里面包含了一些冗余信息,我们要将其进行处理,只返回「是否成功」、「交易id」、「处理内容」三项:

txId = payloadDicted['body']['blockInfo']['txId']
context = self.__handle_payload(payloadDicted['body']['ccRes']['ccData'], funcName)
return {"success": True,"payload": {"txId": txId, "context": context}}

最后抽象为__handle_res(self, payloadDicted, funcName)__handle_payload两个函数,被__handle_with_key__handle_with_key_and_value所调取:

    def __handle_res(self, payloadDicted, funcName):
        try:
            if payloadDicted['header']['code'] == 0:
                ……
                return {"success": True,"payload": {"txId": txId, "context": context}}
            else:
                ……
                return {"success": False, "payload": error_msg}
        except:
            ……
            return {"success": False, "payload": "unknow error"}
    def __handle_payload(self, payload, funcName):
        if funcName in ["save", "get", "delete", "update"]:
            return payload
        elif funcName == "getHistory":
            return json.loads(payload)

至此为止,1.0 版本的 BSN-SDK 已经开发完毕了。 看下效果: 成功调取内容。 下一篇中,我会讲 SDK 的发布全流程。再接下来,就是使用「SDK」进行区块链应用开发的案例了。~ (´・ω・`)~

仓库链接: https://github.com/leeduckgo/bsn_py_sdk


点赞 3
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
李大狗
李大狗
面向炫酷编程