Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
93 0 0
01 导语+ ]" {/ \" y% y# G
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。
1 M9 `8 V+ _% v0 S7 a8 M本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:
8 h1 `7 [4 }# B" Y4 v$ |2 x下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。
! e5 d, E( l3 F: S02 Storage API 使用方法4 w; X0 v. {( ]* W5 A" r: ~8 M: L
2.1 GetContext & GetReadOnlyContext
& x' L2 a7 ?) @0 ]9 T& qGetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。& |; a5 X! c- I0 B  z& a! Z
2.2 Put
/ v# o4 X* F( V5 {7 {/ R- H: KPut 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。
. H5 p& w, ~$ U2.3 Get
" ]0 l. J7 V' [, W& WGet 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:
2 \4 ^* N6 c/ J" v( V2.4 Delete
  u. P! V8 @+ X. r0 M$ R* `Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:
. ?4 k2 P& o7 {8 }2 i03 Storage API 代码示例
) @/ o; C* b( d+ h6 J$ P2 X下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。+ ?: ^5 e& g  e! z8 D+ `
from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
3 [$ m7 |1 }' Lt Notify
) f, f; w3 n! o. vdef Main(operation,args):3 X$ W3 u. I  s. ^: T
    if operation == 'get_sc':3 E% k( \  p# B- \( b
        return get_sc()
/ @6 }1 E, j7 o% p    if operation == 'get_read_only_sc':5 X+ M% \) @( P
        return get_read_only_sc()
: e4 A( b* l! e( c7 ^    if operation == 'get_data':1 P1 V1 p% P; f0 N: C* _* [$ r9 j
        key=args[0]$ J2 A. T8 l3 W
        return get_data(key)
: d2 Y, d9 C! I, R" s    if operation == 'save_data':, @) T; g& y$ c
        key=args[0]4 v8 R* d, c1 ]; E
        value=args[1]% i0 ~' R7 I) p
        return save_data(key, value)
' s: |2 S# F. ^3 p    if operation == 'delete_data':
  J5 P' n' R- v3 c/ {        key=args[0]
# `5 e; E) T2 o2 C2 D% ~        return delete_data(key)
" q  p, @$ Y0 t6 J    return False
4 ^6 o  }/ m3 hdef get_sc():7 c6 F  F- t6 t  @- T( P9 E
    return GetContext() # 获取智能合约句柄
& G0 [3 R) M" Odef get_read_only_sc():
& v: ]  ]) x) f$ F. }2 W: j! a    return GetReadOnlyContext() # 获取智能合约只读句柄. ^# M2 ~+ g' @' G
def get_data(key):9 P3 I2 d' T( q: ~
    sc=GetContext() 6 g! V6 }& a! F+ F! T/ c: }6 U  Q
    data=Get(sc,key) #查询数据! S  I% ~3 H. K- \1 h1 ~
    return data9 e+ c8 R6 |2 j: I' \3 r
def save_data(key, value):+ C6 q: N2 {- \
    sc=GetContext() . d5 Y$ C: |. o8 U. ]! y. S
    Put(sc,key,value) # 新增,修改数据& A4 R1 h# d/ w# K/ j/ l, y
def delete_data(key):
0 M; ^$ ^; y; Z3 ?1 t  M    sc=GetContext() . U+ n( Y2 w6 [) P4 @1 |
    Delete(sc,key) # 删除数据```
6 q% p0 ?" X! f0 m04 后记9 \! m4 ^& t, C
区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11