Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
185 0 0
01 导语% ?1 O- k  i7 S' t
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
, n& J! O- ^& x+ u# _8 g本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:
0 B; T) v6 }9 ^: T/ w4 K下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。9 H* t/ N6 q9 l7 v8 D7 G
02 Storage API 使用方法
( B) |" @! \% q( X2.1 GetContext & GetReadOnlyContext& M( d5 N$ z/ b* J( L& s! Z
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。/ O/ \( W4 |" y2 y
2.2 Put9 i* F" R' h1 e: ~
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。: [  ~6 b! R, ?9 s9 o
2.3 Get
' f+ H. ]8 H* x5 QGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
/ a6 [- `* ~- C7 \9 [4 A% {& e/ Z! H2.4 Delete
$ @/ H; H9 m1 x! G0 i, T, CDelete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:% c7 V* m; s1 ~" x" n) G  T
03 Storage API 代码示例
" Q1 d& Q5 D" q. ~; Y下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。9 m0 G# v* l3 w4 ^3 |  X
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor) u" ^# H' b4 a! ^1 C6 P/ m5 G9 ~1 S
t Notify. g" y6 ~$ y$ B$ H6 z
def Main(operation,args):
; z: Y" f, w9 H7 @4 N/ ~    if operation == 'get_sc':
8 g1 L9 ^& G% S7 _( k( O! E        return get_sc()
3 Q0 ]0 y# b9 N9 m3 p: @- Z3 V    if operation == 'get_read_only_sc':1 q' ~( b. X1 v2 ]' l
        return get_read_only_sc()% D5 l1 d( t5 T/ J) Y2 b" y# @
    if operation == 'get_data':4 n/ h% a7 h* ]% q$ W3 A7 l5 [
        key=args[0]' w. D, Z3 s2 V: ^
        return get_data(key)
, N* c3 z" `7 o2 E/ t* c: B    if operation == 'save_data':
! T3 f0 s4 O! j2 w        key=args[0]
$ c: ?$ Q5 \& J6 b; I, S        value=args[1]8 }$ n0 s/ q# N- @, v" \
        return save_data(key, value)* p1 }+ E; K: K3 i, ?
    if operation == 'delete_data':
7 M+ P+ o5 u' n) K: }: f& q9 u        key=args[0]
  f  ^5 o3 G# v& a. W5 l        return delete_data(key)$ q4 u) {2 g. C" x! B. v. q
    return False$ @) a) i- O! t
def get_sc():% d5 s" i; E' }# \- t( w2 |9 t
    return GetContext() # 获取智能合约句柄1 g  d* K$ z- E, x$ B
def get_read_only_sc():
% K6 K% h! t1 c* Y+ W; J1 H    return GetReadOnlyContext() # 获取智能合约只读句柄
# q9 b, ~; ]8 v, Ddef get_data(key):
. H* r. Y) a/ e- x9 C    sc=GetContext() - e' V- Z% c# A/ ]& v6 O; Y
    data=Get(sc,key) #查询数据$ k3 r1 Z. |8 T" E* w: V
    return data5 y3 j, c# H5 Z. M" T* }) e
def save_data(key, value):; J  R. W+ g- @% V0 O
    sc=GetContext()
" h4 n7 i  ]" G    Put(sc,key,value) # 新增,修改数据/ M, g' ~! t, B/ L
def delete_data(key):" r' [$ V* d1 S1 ]
    sc=GetContext() 3 ]9 D: h, B: q2 b# h
    Delete(sc,key) # 删除数据```* [5 ]4 S) [) v; f
04 后记
* ^6 Y3 ^  m, D区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11