Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
95 0 0
01 导语/ ^6 f1 K: {2 W* Q8 h$ Y
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
* C0 r" [5 [1 N: J! d" r本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:& I; y+ p  ]3 U" `% A
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。# |1 r1 p/ E$ k7 [+ l$ g
02 Storage API 使用方法* \$ n% a8 D; k. \) w3 L8 J
2.1 GetContext & GetReadOnlyContext
- U  k9 ^. Y2 V8 r* `: oGetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。3 j/ Y4 f3 s3 L0 H# J
2.2 Put1 Q9 o0 C# l! R; m# r; T
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
9 ^. W6 W# O2 e: g* T2.3 Get0 I' ?. q6 G' [0 n  W5 A. j& D( I
Get 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
) E; S0 Q3 i  b# S' f- `2.4 Delete+ S* w) b$ i$ X- ~& p
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:3 n+ Q! Y/ b5 n1 m( r
03 Storage API 代码示例) `$ E) ]4 i9 a% j. g% Q2 n, B
下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
- k8 T1 ?) x5 E5 |# ^from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
+ B: h2 ]4 o4 A$ ?7 H, qt Notify
% [, s; T. Z8 k8 Q# U! Hdef Main(operation,args):
% P# k" B1 B6 j; A8 K    if operation == 'get_sc':# W- g1 F2 F. q' ?/ t
        return get_sc()# o& Q2 o* ?2 X+ l* o( ~
    if operation == 'get_read_only_sc':
* @. z$ d) j( @# i0 z        return get_read_only_sc()8 k9 _( t6 X6 M$ C" W' t. N+ r
    if operation == 'get_data':2 Q: Y; V1 t, h" t% r+ r' P% E6 W
        key=args[0]
# x( E% k7 Y4 D/ T1 [% R8 d! |& e% k2 K        return get_data(key)) v& G, T5 a; @* g* y" S5 h+ f( c1 Q
    if operation == 'save_data':
# M0 Q2 l* T+ ?9 n/ F  |9 [7 A        key=args[0]
# d% }/ R- V: k2 b: C, d0 o( _        value=args[1]
- |" w7 C+ B% x5 r        return save_data(key, value)* ^& O# o* x  v; f$ U
    if operation == 'delete_data':% N2 a8 g- N4 H2 [
        key=args[0]
6 |% I& l" b" F$ h0 Y        return delete_data(key): H. E& S9 P9 h! T* G
    return False2 Y* R7 _8 u/ M' \: ]0 ?; n
def get_sc():* w8 i+ s/ r: p5 u8 ?% |
    return GetContext() # 获取智能合约句柄
1 @- j% z# u9 @5 L; o. Edef get_read_only_sc():
" P. s" m& Z3 w, h' w4 U: B( T+ t    return GetReadOnlyContext() # 获取智能合约只读句柄, B  I- k7 |- u$ J) n$ W
def get_data(key):
9 E6 ?4 T6 }0 Z( t; D    sc=GetContext()
+ h5 l# V' D5 t1 ~5 C* C    data=Get(sc,key) #查询数据
4 X! z& K* T/ r) L" X    return data
/ E* ^: j/ x2 p" @0 Q& jdef save_data(key, value):
5 C& d( t/ S+ ~& B$ \* C    sc=GetContext() , \  }  R# E2 L; H
    Put(sc,key,value) # 新增,修改数据7 B: f& I$ O; A. x2 R
def delete_data(key):# ^4 N# b! C2 p1 a
    sc=GetContext() 4 e/ X' H7 x# N: @1 X0 F
    Delete(sc,key) # 删除数据```
9 x% F7 T  f/ _1 q6 \/ u* E04 后记
* A6 k. l; O1 u: [& l, V& H" K7 n区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11