Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
152 0 0
01 导语$ j! C- ]: c4 u4 _" w: B* D
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
* X: J# B5 o) G. X# f本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:
# K  ]* b: j3 x6 _4 [下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。# J; I0 `8 K) z4 T0 n1 j* P
02 Storage API 使用方法, [( l( w0 E# z, O# |
2.1 GetContext & GetReadOnlyContext& C' a0 {0 a8 b/ U) U3 F9 B" q- o- T
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。% x% y( E; n6 e; I( `
2.2 Put. k7 p' A; x  o2 Y0 T
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
) D! ^' Q( S- T! w- w, s: O3 |$ I& q2.3 Get( m, h- z4 m; @" r2 X& K) t
Get 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
  R: j7 ]+ p! [3 c- I# l- v2.4 Delete4 b6 m& t5 y% V
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:
3 p9 f9 @- T8 Y* @03 Storage API 代码示例
1 {3 N1 U9 n* c: n7 N下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
* X0 z( W4 \* S: o) k5 K% ufrom ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
. u, H& @# q& I& a) V% i6 }t Notify) U3 b! f0 Z8 V1 j
def Main(operation,args):
/ q9 T* M4 `5 ^1 O, o; u0 E0 i    if operation == 'get_sc':2 K; z" N( n1 Q% F" z- K
        return get_sc(). H& }1 I, g) D" l/ h
    if operation == 'get_read_only_sc':% Z% q* l7 P& H1 Z" S; U' l" I6 }
        return get_read_only_sc()
: Z+ _' d5 b5 G    if operation == 'get_data':7 d; u4 [, u- V1 T+ m
        key=args[0]
; M7 |$ Z+ e7 j" @        return get_data(key)
6 I- _2 M" x1 s$ i& U    if operation == 'save_data':
( ?5 H' d$ X+ R( A# P        key=args[0]
% @% U6 S: E, S5 q( R        value=args[1]6 E' J: z9 }3 ^0 |2 G) v
        return save_data(key, value)* t# Q: o' r- s8 [
    if operation == 'delete_data':2 R' ?  t2 _$ `! D
        key=args[0]& @/ p) S6 s% |4 G
        return delete_data(key)! l0 U5 d( b5 y: X+ E2 y# N$ X+ d
    return False5 A, q& Y9 c" o# w1 S5 i
def get_sc():
% O# u8 J9 M9 N2 b4 G) z    return GetContext() # 获取智能合约句柄3 M5 S% X% q; N# n- H, q
def get_read_only_sc():
1 s7 c$ h3 d7 z+ V; R& {: H    return GetReadOnlyContext() # 获取智能合约只读句柄
4 P4 F% V$ g' ^4 cdef get_data(key):
" c( o# z- e! e  [1 X! h    sc=GetContext()   Y' e# d1 v) v5 A. R" y( P
    data=Get(sc,key) #查询数据
& C) v7 B& B" z# o    return data9 M% M3 }7 r6 T( D
def save_data(key, value):
, A) p  i3 B: E4 W9 P5 f    sc=GetContext()
+ C$ L5 x+ Z$ c% Z/ w: ^: z, @    Put(sc,key,value) # 新增,修改数据2 B4 g- E3 b- T* N2 s& @' ^: ]) X  u
def delete_data(key):" d6 `; {6 ~# P0 F3 K. Q- p
    sc=GetContext() 5 W& N. i- j( S
    Delete(sc,key) # 删除数据```" K$ W3 }- k* r9 W
04 后记# r, O0 h" v) H( N
区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11