Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
89 0 0
01 导语
6 s# e# r. E! A% p上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。9 T) G$ o# D# H0 `& W: @6 [
本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:5 Y3 P, b) F( ?! c, c6 j3 Z& y  F+ C
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。
4 Y) ^1 }% g# E) L: T) [# J02 Storage API 使用方法, r. D6 A; f, N  f4 H
2.1 GetContext & GetReadOnlyContext6 T9 P# `' F' [6 H0 k3 U% u
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。8 o4 C9 ^! H# x
2.2 Put
3 {( t# G7 S7 x" f) C* dPut 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
8 P3 ]; e' g+ o2.3 Get
9 O! |, E. i( A# ~# GGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
* N; \$ l! v+ P7 L0 Z/ `' x2.4 Delete8 a" v( b5 Z* A+ G, i: K
Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:& B# x4 |  @8 J) |, P) b" w. c; `! u
03 Storage API 代码示例
4 h1 n  @3 k2 w9 y  v; }下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
6 V( {7 ^- V: Y, m& a/ hfrom ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
) g  t- J& P0 T6 l" G) nt Notify7 v( G. F2 v% a9 l
def Main(operation,args):0 j3 y% h5 S# |' B  |& G5 e
    if operation == 'get_sc':+ h$ l5 A4 Z6 O0 U
        return get_sc()* j+ q8 x- Z% v" `
    if operation == 'get_read_only_sc':
# r/ w& e( l4 v# i% r  q        return get_read_only_sc(); J' R4 o* Z  a! d1 @6 k" |: k
    if operation == 'get_data':
/ ?% A; n& I! A! j% t: r2 ~  a7 T$ Y        key=args[0]/ p- I3 P; F; @# b$ w
        return get_data(key)5 j7 E7 j9 n0 N) o; V
    if operation == 'save_data':6 X5 s6 t) o- ]4 y5 ~0 ?
        key=args[0]  R; }8 l! m% R7 A
        value=args[1]
" o$ T, v4 ]! t1 b        return save_data(key, value)1 w4 y/ L) h6 W% I
    if operation == 'delete_data':' n* ]/ ?0 S4 @  M! p
        key=args[0]# y6 _* j; ^0 W
        return delete_data(key)
. T! y! i0 z, O3 Z+ N+ p9 g. P' X9 Q    return False9 _8 g) W% K  X1 W$ _& d
def get_sc():5 I! ~4 s/ \, {5 }7 W3 M- B9 h
    return GetContext() # 获取智能合约句柄7 s4 n! y' `# Q: j: ~
def get_read_only_sc():
' p' n0 P% t% z& i    return GetReadOnlyContext() # 获取智能合约只读句柄$ Q' N0 D6 M9 b3 u( o6 f; Y
def get_data(key):
' e. l  I, u8 M% ~4 K    sc=GetContext()
2 z1 g4 w/ i4 _8 S, x    data=Get(sc,key) #查询数据
" o2 B& l& h0 v) e; ]    return data
" W1 |" G' m# r/ Z. e; `3 f/ J4 wdef save_data(key, value):+ }+ ~. _# S. H2 K3 H+ F& j4 D- J# y
    sc=GetContext() & \- N3 A; l* V4 Z9 [; ~
    Put(sc,key,value) # 新增,修改数据) q1 E  s9 z; H* M; u4 x9 h
def delete_data(key):/ y' x: q. c, O% o# ^/ p: [
    sc=GetContext() * B  l" ~0 ^  _+ b
    Delete(sc,key) # 删除数据```
1 Y3 `( y  l) `  z04 后记
4 A0 D! f4 [) [# W区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11