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
通过如下链接查看如何使用:
在上回,我们将示例代码中的函数初步抽象为get_data(baseKey, url)
和__do_get_data(userCode, appCode, chainCode, funcName, baseKey, url)
两个函数,并将其挂在 Operator
类下。
我们现在要做如下改进:
__init__
初始化函数内__init__
是一个特殊的函数,它在我们构建对象的时候被调用。例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
这是一个「人」类,当我们执行personA = Person("Jack", 15)
的时候,Jack
与15
便分别作为姓名与年龄赋值给 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 # 签名文件地址
观察get_data
、save_data
、update_data
、delete_data
、get_history
五个方法,发现可以抽象为两种方法 —— 仅使用baseKey
的方法(get、delete、get_history)与使用baseKey
和baseInfo
的方法(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)
……
节点返回的生数据是这样的:
{'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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!