Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
174 0 0
01 导语
- y/ n" r& x4 G* H) K& o1 k: ]上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
! k; P. n( F# t& F5 e' ?! y本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:( N  e8 A" U. P# U6 e
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。' P$ c3 ]8 R2 t6 D4 Y
02 Storage API 使用方法  c+ y( ?; c4 y3 Q- K
2.1 GetContext & GetReadOnlyContext7 Q- u3 |! x" l
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。
. b6 p& o$ R- _* |. w2 {. X2.2 Put
3 y2 F- J: D% X  mPut 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
$ F+ Z# S3 \* b$ \/ U2.3 Get
5 ^  A1 m& f, o# `: F- F3 fGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
& q0 \; Q  e1 B* S7 I8 L2.4 Delete
4 A8 x! f( V/ `2 [+ Z" H/ Z, y& `Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:$ R' b/ Q) o0 j$ Z7 J
03 Storage API 代码示例" y/ C' p/ K' s$ i
下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
" x8 t8 k1 y& r" }6 Mfrom ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor" j) o: h/ h  O
t Notify
3 P; b" s, E- p7 p, O4 Sdef Main(operation,args):
5 W/ J: g1 s" _$ K9 e    if operation == 'get_sc':
/ X* _! F  q+ M        return get_sc()
4 s' K- S5 i9 I/ I1 K    if operation == 'get_read_only_sc':
- w$ Q+ o5 k" d9 {% \2 F+ }        return get_read_only_sc()
# i  U6 {8 {7 a3 i) s! B+ C. ~    if operation == 'get_data':
2 q# P7 y; a5 u. {! b        key=args[0]) L  R7 H& M$ Y! s7 o& I% p# S+ i
        return get_data(key)
' o% @! Z- g! Z. n* d0 y    if operation == 'save_data':
7 u, N  S& d' \6 V        key=args[0]. f, h5 N6 D; u/ n$ `7 K. D* i7 J5 }
        value=args[1]
7 T) s$ v8 u" b6 _        return save_data(key, value)
$ p0 f4 t, Q4 A; }8 U. v    if operation == 'delete_data':
7 X- F: H6 [; h9 ]7 k        key=args[0]. G) G: F$ B1 [+ N
        return delete_data(key)
0 x$ K0 X& m. l6 K/ T    return False
' S; p$ J. Q+ k& m6 V( v  ~+ \% L7 vdef get_sc():# s! _+ t/ q' o, v8 D1 A  e
    return GetContext() # 获取智能合约句柄
0 ?* ~/ t% p# V- Q/ }- Zdef get_read_only_sc():
9 _5 s' _; c4 m7 C, j5 w) ]1 s7 r    return GetReadOnlyContext() # 获取智能合约只读句柄0 G/ v* r3 t" I% A
def get_data(key):
/ {% n4 y- E/ ~/ t) c- l) U    sc=GetContext() , P/ x8 j2 x3 i9 L- ?
    data=Get(sc,key) #查询数据
- s  U$ ], G( S8 p9 q    return data# D2 b( @3 M1 Q  ^/ l8 X' ~0 Y
def save_data(key, value):7 _; v9 H" i% ~; e  E7 X( D4 y
    sc=GetContext() . F; r" J4 W; R; r0 H6 N
    Put(sc,key,value) # 新增,修改数据
( |3 y7 G8 G7 \( Jdef delete_data(key):
, k4 x) Y  W" w7 v' j  @+ T0 S    sc=GetContext() & q- d' i6 k8 u! ^) A) T
    Delete(sc,key) # 删除数据```. _' ]- ~3 Z. }1 T: P" t/ j
04 后记
" C! @( d% b9 E, ~' j: ?区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11