Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
92 0 0
01 导语3 j1 W- t! L/ `- [0 Y
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
$ ?- z. m4 i4 Y( n9 x: i本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:8 C% A2 ]0 n& y; f% g; L( o
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。
, H- I. f  R, F4 G7 k. D0 ~02 Storage API 使用方法
! |! B/ }, O' h5 ~  A0 o2.1 GetContext & GetReadOnlyContext  s* [- i2 e* g! p  T
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。
' P1 j* K' L+ S6 ^. j$ Y2.2 Put
; U: }3 _( M* h" vPut 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。( N, q7 s  N, w% C1 x
2.3 Get) F) N( i! m( o' ~  N5 ]; W
Get 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:8 z0 A/ x4 c* Z8 P, Y- O
2.4 Delete
: Y) r9 V+ C& N1 V+ B6 _3 e3 kDelete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:
7 Q5 n6 Z* B+ t$ q8 B: q0 N03 Storage API 代码示例& [- _. J" c: g( k) g
下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。# _* P! j8 Y4 V$ R) O0 A* }
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor( t! [; N) z+ l% }
t Notify. y( u' d* S- r  T! q
def Main(operation,args):' m) f% V7 o0 M' n% n: M' R4 u
    if operation == 'get_sc':
4 U. I7 W5 b+ S) x        return get_sc()
4 z+ b$ d" H. v  \, `( R' \3 @; j: ?; i  J    if operation == 'get_read_only_sc':' W- H% L! ^8 T% ]
        return get_read_only_sc()
; Z$ u* M+ z( g2 O) q    if operation == 'get_data':
( O& q; k+ Z* a# {! H  s% n6 K        key=args[0]
* y! r9 R6 b, q) S, b; l        return get_data(key)
* d: o* x8 S: n1 m- j) c1 n    if operation == 'save_data':: t( k0 S/ u8 R5 Z2 a; E
        key=args[0]( u, b9 P4 N: v; {5 |
        value=args[1]
" o3 o/ {6 @5 u4 T" [: Z) w- m# y. h0 T        return save_data(key, value)
8 ~: {* z* X5 ]0 `/ l" i    if operation == 'delete_data':' \8 e8 M# z5 _) j4 t8 @
        key=args[0]& c7 H/ |" T+ z! |6 I- c9 G
        return delete_data(key)
$ Y) l  U, V$ n" b    return False
0 M/ h- h. }: B7 ydef get_sc():( o) e/ U& k' L$ B: D5 h, i" V
    return GetContext() # 获取智能合约句柄. g. @4 [1 W1 l, }$ l1 y4 C
def get_read_only_sc():
: Z! X0 {9 Q! i! H    return GetReadOnlyContext() # 获取智能合约只读句柄' P5 a) w, ]4 w3 F* U- \( `
def get_data(key):
) C9 {- [' t6 K3 F" m    sc=GetContext()
3 r8 R+ M8 p1 W; k: `& a' [    data=Get(sc,key) #查询数据: {: c: M: Q5 z  y
    return data2 |( X4 A( V2 [2 c* m8 t+ O% X
def save_data(key, value):+ m# {1 }( {: V; Y1 W" S, j
    sc=GetContext() . }0 i7 z$ `1 g) E$ M
    Put(sc,key,value) # 新增,修改数据
3 g# P8 ?' V6 q( d0 O' {& f; Ddef delete_data(key):
7 ~( T2 Q. q& Z    sc=GetContext() - ]/ J& n6 M5 `) q; ]3 Q3 Z
    Delete(sc,key) # 删除数据```; P. R% J  k) G' P
04 后记
" _5 O5 Z5 ^0 L区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11