Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
204 0 0
01 导语4 K9 @( W! l3 N$ ?% ], T
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
5 x3 }# e  C$ S  e2 F( ?本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:3 Q2 h$ t# d: o3 E3 X) ?3 n8 S9 P
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。: L, F2 H. G6 K! ~' S& Y' w
02 Storage API 使用方法
6 K% A% F( A9 a& ^2.1 GetContext & GetReadOnlyContext
( m' h9 F1 k8 K. L( W/ ]/ o0 hGetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。
6 Z! @: V7 G3 ~( `( z0 H5 N, _4 p2 ]2.2 Put8 @- q+ `, K1 I" P. j6 A
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
& Q' g# {* Z- ?! {+ Y2.3 Get
6 A+ ^: t. x$ f7 m- Y3 s; iGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
5 N" x" b" y# y; l5 @" z  y8 }& Q2.4 Delete1 `! d9 y8 p9 R( G: Z- x
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:0 z4 r4 P( f. Y8 c$ }/ z
03 Storage API 代码示例
  |; l: ^* |7 ^: M: A: g* C下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。2 e7 L# g; {- ~/ g9 O9 ?8 ~4 p
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor+ k8 c0 [+ T5 \  Q% N+ Q
t Notify; h8 L( ~! I' V0 s4 X! W
def Main(operation,args):
! |+ i% W; ]9 F& |9 Z9 \    if operation == 'get_sc':/ O7 E8 h2 u+ {( G- F# _; h
        return get_sc()
, M2 G% M: M5 K    if operation == 'get_read_only_sc':% i' M  x/ D# h# v
        return get_read_only_sc()" n! M( S! ?0 {3 _3 l: u
    if operation == 'get_data':" u  t1 ?, D0 R2 i
        key=args[0]
8 c# H6 D9 c2 L: X( w        return get_data(key)
8 I; ?* L& F3 H$ b1 i3 F    if operation == 'save_data':
; H4 |+ _% F+ k4 O9 k' E        key=args[0]
) Q# z; f# ?- N& ^3 T: Y        value=args[1]
, r8 d% K; l$ F        return save_data(key, value)  O* A: N$ U! x' A( T. o
    if operation == 'delete_data':+ ^  T; m) E3 S2 k, ^0 b$ [
        key=args[0]/ a# Z- o9 T! j3 ~: [: s( j
        return delete_data(key)4 W. u( |! i  y. ]8 c- C3 r
    return False
* B& C0 F8 y/ e5 ?5 _8 _def get_sc():
* i9 t% ?& {" b    return GetContext() # 获取智能合约句柄. A, B3 w! o" g2 V, U
def get_read_only_sc():' p8 d, P% D. s$ ~1 S# C
    return GetReadOnlyContext() # 获取智能合约只读句柄8 V* g/ P9 e. W; Q: ]
def get_data(key):
. K; i: `$ c0 Z5 ^$ @    sc=GetContext()
+ b! m, k9 Q. n& ]# H/ V    data=Get(sc,key) #查询数据; {1 K+ z( F7 @! n* P5 s
    return data
% f- S4 N% A, T1 S% s) p- V& D9 C8 \6 ?def save_data(key, value):' l$ F% C9 D. B9 `. I! h& M; _% ?
    sc=GetContext()
1 a* |- `: b0 q1 W" q7 F    Put(sc,key,value) # 新增,修改数据
$ ^  K3 t+ |6 e+ B' }9 `5 q% Cdef delete_data(key):; `( F! B8 J0 L4 w$ ~$ v1 l
    sc=GetContext()
4 p# D* g6 h9 ?7 [& A- A5 M    Delete(sc,key) # 删除数据```6 V; v; s0 Q& @2 B( c* _8 B
04 后记
" T* x6 B. v: r+ T区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11