Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
94 0 0
01 导语5 M6 X, [# M- w, A% D& M2 F
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。. R+ e$ W0 ?- n) F3 O! \2 t
本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:. F. Y5 L5 |4 X, f" D5 h6 ]- g
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。2 s1 `8 L4 X6 s7 d2 u
02 Storage API 使用方法
  ^3 `0 F% `2 [  E+ F1 }4 V9 N2.1 GetContext & GetReadOnlyContext0 r' N: g+ L7 S1 u$ h) g% p
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。" @7 t. {9 i- \/ V8 y7 ~; [6 c
2.2 Put
; t$ W: E# d9 ?( s! e) B- L4 bPut 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
; S# V3 [, j4 u* ~& ?2.3 Get) [. L& [! N6 d
Get 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
% m7 e' C$ v, e! r$ A2.4 Delete4 s8 p  }; ^) X: n6 M6 F
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:3 {+ R8 l- N  f6 W- d
03 Storage API 代码示例
9 a) E$ i' @3 `. s- ]下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。6 @! X* v4 x3 z0 d- c  Z: q) x! ^1 p# @
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
1 o* l9 U+ C7 G' o& g( Z& S9 ?t Notify4 d( ], e# P. F& D
def Main(operation,args):
  ?9 E0 N4 I( b. ]8 O* R$ f# d    if operation == 'get_sc':; F9 ~+ x! c) S# o
        return get_sc()1 \7 N- o3 K4 P
    if operation == 'get_read_only_sc':
8 `# I8 u0 S) h7 N% m        return get_read_only_sc()
8 M% r( X% F  y! N& ?  W! n    if operation == 'get_data':
! C7 V1 S; |2 x        key=args[0]
9 s1 f4 o2 k2 _9 P9 G$ m# J- C        return get_data(key)  ?/ t- {) E3 ^
    if operation == 'save_data':
" s8 r4 ?/ @7 e. ^! |        key=args[0]
" O8 l3 V- q5 j, A5 W' C' C: [- T0 z        value=args[1]
- x% U4 r/ S7 s  x3 c5 Z+ U& F        return save_data(key, value)# M3 {/ A* S  ?! ^( U: X
    if operation == 'delete_data':0 a6 [. Y8 O2 `( Q8 V" M) F
        key=args[0]
8 ~. m/ X( x1 ^+ D        return delete_data(key)- Y* j+ ~8 ]$ e1 _7 I
    return False
2 ^, l7 C+ g4 @+ u6 k3 N% kdef get_sc():
& J5 z( L0 d- w: [/ b% O8 \    return GetContext() # 获取智能合约句柄
) ^1 P) C  }6 s+ M  k5 T9 ]$ rdef get_read_only_sc():
! Q5 m9 L. j! ^. h6 D6 Q    return GetReadOnlyContext() # 获取智能合约只读句柄
+ s( A# b) R3 N+ tdef get_data(key):( d$ |  Z5 |8 O
    sc=GetContext()
$ P1 S: r5 ]! K* X5 [5 R8 [! e    data=Get(sc,key) #查询数据- i" |. X" m7 l# v# w! [
    return data. B9 r: B$ S+ x( z
def save_data(key, value):  Q" H6 ^( C) j, G; F* |& e" I
    sc=GetContext()
: j( k( c% V$ n, x    Put(sc,key,value) # 新增,修改数据
$ g7 Z0 Z, e  O; F5 _- I# Tdef delete_data(key):
0 M( `5 g. e% y4 F" V    sc=GetContext() ' d5 @) x, q7 `2 o
    Delete(sc,key) # 删除数据```
! Q8 ~; L" H2 @! I$ e5 m04 后记1 |6 @9 [  s& \& B
区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11