SDK 1.0 版本的打造 | BSN 联盟链开发(三)
SDK 的 1.0 版本出炉~
> **系列索引:** [上链与背后的流程 | 联盟链开发(一)](https://learnblockchain.cn/article/358) [动手编 SDK | 联盟链开发(二)](https://learnblockchain.cn/article/359) [SDK 1.0 版本的打造 | 联盟链开发(三)](https://learnblockchain.cn/article/380) [将 SDK 发布到 PIP | 联盟链开发(四)](https://learnblockchain.cn/article/385) [什么样的数据应该上链?| 联盟链开发 (五)](https://learnblockchain.cn/article/557) [BSN 相关问与答 | 联盟链开发(六)](https://learnblockchain.cn/article/683) [链上简历应用 — 设计 | 联盟链开发(七)](https://learnblockchain.cn/article/684) [FISCO BCOS 介绍 | 联盟链开发(八)](https://learnblockchain.cn/article/692) [WeIdentity 极速体验 | 联盟链开发(九)](https://learnblockchain.cn/article/1094) [给Remix升个级 | 联盟链开发(十)](https://learnblockchain.cn/article/984) [伪代码简述 ECDSA 签名过程 | 联盟链开发(十一)](https://learnblockchain.cn/article/1038) [WeIdentity 的多签及限量凭证的实现 | 联盟链开发(十二)](https://learnblockchain.cn/article/1285) --- [上回](https://learnblockchain.cn/article/359),我们开始了亲手做 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__`是一个特殊的函数,它在我们构建对象的时候被调用。例如: ```python class Person: def __init__(self, name, age): self.name = name self.age = age ``` 这是一个「人」类,当我们执行`personA = Person("Jack", 15)`的时候,`Jack`与`15`便分别作为姓名与年龄赋值给 `personA` 这个对象了。 对于我们操作工 `Operator` 来说,以下这些变量,或者说属性是要在初始化的时候被赋值的: ```python 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_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`: ```python ''' 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): …… ``` 五个公共函数通过调用私有函数来实现: ```python ''' 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 对返回值进行处理 节点返回的生数据是这样的: ```json {'header': {'code': 0, 'msg': '处理成功'}, 'body': {'blockInfo': {'txId': '664c8d82d22ef5dc0c3df34e6558cbecdfa315598fb848d721cb2c4436c5d57d', 'status': 0, 'blockHash': ''}, 'ccRes': {'ccCode': 200, 'ccData': ……, 'mac': 'MEUCIQCr4vuQpObIsZKLutZ/QEzDoZcg+EFbtFSeyzV/V9fkTAIgSbJvdT8iaYsIscoZwLYveTJAlTeaxbT/o9X7+HvF8HM='} ``` 里面包含了一些冗余信息,我们要将其进行处理,只返回「是否成功」、「交易id」、「处理内容」三项: ```python 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`所调取: ```python 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 已经开发完毕了。 看下效果: [![](https://learnblockchain.cn/image/show/attachments-2020-01-Mx621Fnq5e2924d6cd1c6.png)](https://learnblockchain.cn/image/show/attachments-2020-01-Mx621Fnq5e2924d6cd1c6.png) 成功调取内容。 下一篇中,我会讲 SDK 的发布全流程。再接下来,就是使用「SDK」进行区块链应用开发的案例了。~ (´・ω・`)~ **仓库链接:** https://github.com/leeduckgo/bsn_py_sdk --- [![](https://learnblockchain.cn/image/show/attachments-2020-01-UFE6tCRK5e2914f8ae3b3.jpeg)](https://learnblockchain.cn/image/show/attachments-2020-01-UFE6tCRK5e2914f8ae3b3.jpeg)
系列索引: 上链与背后的流程 | 联盟链开发(一) 动手编 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)
的时候,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 # 签名文件地址
2 进一步抽象
观察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)
……
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
区块链技术网。
- 发表于 2020-01-23 11:40
- 阅读 ( 1337 )
- 学分 ( 24 )
- 分类:BSN
评论