Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
180 0 0
01 导语
. u- a" ?! \. h0 g  S上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
6 \- M& z, w( J/ A0 e; i0 v本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:) b9 @8 H9 l2 l$ K5 g9 B
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。* n0 q5 ?3 S4 y9 K1 ^
02 Storage API 使用方法1 B9 ?! j% ]# x1 c  ?
2.1 GetContext & GetReadOnlyContext* ]6 S- L) G5 e
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。
. l& V4 l: k2 V2.2 Put) F, @* J! R, Y* @( B7 [6 f
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
( P+ X* g) d" u2 k  n$ e2.3 Get
( Z9 q' G- F* D; S! h% _, jGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
+ @6 F$ C' P, D, [. K0 Z2.4 Delete7 N5 v3 U4 ]; i3 T9 Z
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:5 d0 g8 k. ?1 k" o8 a
03 Storage API 代码示例$ E" C1 F. y% ]; V3 B
下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
' S2 p# q5 y0 u& p- Yfrom ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor. F6 G$ D, _/ P8 ]6 Y! R
t Notify
  p# g9 W4 Z! Hdef Main(operation,args):
( F; P* [  |( Z; b" g6 J    if operation == 'get_sc':4 R* ^! D7 _* }" ~) e
        return get_sc()$ a8 R0 D2 G% e
    if operation == 'get_read_only_sc':7 j' U% l: P/ Z( @! _$ j* Z
        return get_read_only_sc()
: Z/ D' ^( `, g& S$ f: d    if operation == 'get_data':
2 l0 @  W  _; R& a        key=args[0]
9 r# F+ q% l! g% Z6 h        return get_data(key)
# T. z8 C0 U$ R  e% }! L    if operation == 'save_data':
  {/ C, s# d4 e" L9 O        key=args[0]) k0 _+ R) S1 }( R* Y
        value=args[1]
8 g; i3 Q' |/ Z0 _& m2 m        return save_data(key, value). ?, c  J$ _% |3 I  p( [2 u
    if operation == 'delete_data':
: ?- D% j& `! F  ^) k) }9 _5 s8 u        key=args[0]
& [% c% A# ^! H5 ]        return delete_data(key)
, i+ y3 i- @% T  f4 w3 W    return False$ Z$ Y& g" H7 o
def get_sc():. A/ R3 t% t. ^
    return GetContext() # 获取智能合约句柄8 i+ q3 F7 i) t, w* W6 V  q1 U
def get_read_only_sc():
, x% L1 x/ a/ y- A+ D2 n    return GetReadOnlyContext() # 获取智能合约只读句柄
( J$ y3 ]" x" k$ @def get_data(key):9 b2 T$ Q. n- q" h
    sc=GetContext() 7 j& \  k- O# D. u1 b" r6 k
    data=Get(sc,key) #查询数据  s* I4 V8 C. g1 b3 }
    return data
' L: H3 r5 T! a# [def save_data(key, value):% m4 N9 x$ }* j- m, o: \
    sc=GetContext()
$ B+ Z. Y2 m3 [" M) W0 j) p0 h) V    Put(sc,key,value) # 新增,修改数据4 w' I' |8 u3 P
def delete_data(key):
: k5 N" P6 \  @0 J    sc=GetContext() ) G4 l; r0 l9 o0 N% a6 I; o
    Delete(sc,key) # 删除数据```- H8 [" R" F7 K% a) Z% K1 ]
04 后记7 g2 x, e* H) R( A, c1 j6 C" s0 k
区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11