Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约开发教程

卡哇伊嘉人
205 0 0
01 导语6 w$ u/ `, A- j/ w4 N) D& u
上一期我们正式开始了本体智能合约语法部分,讲述了 Blockchain & Block API 的用法。相信有很多小伙伴已经开始动手尝试用 Python 在本体上编写和运行智能合约。如果小伙伴们在使用 SmartX 过程和动手实践过程中遇到问题,欢迎联系我们。# `; Z# X6 O3 V( g
本期我们讨论如何使用第二个模块:Storage API (存储 API)。Storage API 共有五个相关的 API,实现了对区块链智能合约中持久化存储的增删改查。这五个 API 的简单描述如下:" K4 K& ^! K5 F/ W' D. `
下面我们具体讲述一下这五个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。4 G2 i( N; p  [
02 Storage API 使用方法. P9 h3 u1 J, F
2.1 GetContext & GetReadOnlyContext: n, n! T8 X  Q4 L# @/ ~) {
GetContext & GetReadOnlyContext 获取当前智能合约运行的上下文环境,返回值为当前智能合约 hash 的反序。顾名思义,GetReadOnlyContext 获取的是只读模式的上下文环境。在下面的例子中,返回值是右上角显示的合约哈希的反序。
5 W+ I- r! Q  _" @0 ^0 A2.2 Put* j9 I" ^5 F; Z: U# I* A
Put 函数负责将数据以字典形式存入区块链。如图所示,Put 接受三个参数。其中,GetContext 获取当前智能合约的运行的上下文环境,key 是当前需要存储数据的 key 值,而 value 当前需要存储数据的 value 值。特别需要注意的是:如果 key 值在已经在存储中存在,那么该函数将更新其对应的 value 值。  ^- n( `9 [  d- ]& s( N
2.3 Get) A) Z: r1 a+ c  x$ r7 l* j
Get 函数负责通过 key 值来读取存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,读取区块链中该 key 值对应的数据:7 ]/ q7 ~" f& g  W5 \: [, P
2.4 Delete
# {% E- [7 s. |Delete 函数负责通过 key 值来删除存在区块链中的数据。在下图的示例中,可以在右侧参数面板处填入 key 值运行函数,删除区块链中该 key 值对应的数据:3 P( b1 T; D! a5 a" V
03 Storage API 代码示例, q* p/ J  I+ N; [; R8 j& e$ t
下面的代码给出了 GetContext, Get, Put, Delete 和 GetReadOnlyContext 等五个 API 的详细使用示例,小伙伴们可以在 SmartX 试着运行一下。
/ E8 F0 d$ h+ J2 v7 _from ontology.interop.System.Storage import GetContext, Get, Put, Delete, GetReadOnlyContextfrom ontology.interop.System.Runtime impor
% u: r, H1 S( q* V$ g9 ft Notify
' N, k" ]/ l; J! `! Q- x* I) [9 bdef Main(operation,args):
3 K, S/ W" _1 G6 \& B0 p! z    if operation == 'get_sc':8 G, z4 v  {4 H! B
        return get_sc()
) U0 {) s/ P: g( A0 p3 R8 l    if operation == 'get_read_only_sc':$ @, \5 V+ h2 x% J' C
        return get_read_only_sc()0 ?  I/ ?6 l  i$ K% |
    if operation == 'get_data':: G& I9 S1 l( L' ^$ ?. l" |
        key=args[0]1 Z6 l" t, }7 V2 U- D5 E' j
        return get_data(key)& a) V+ I9 u2 x: n; {
    if operation == 'save_data':* E5 a/ x& P3 H( }# s, ]) S
        key=args[0]) O9 u/ m# o- W# M& z
        value=args[1]5 B' g" K2 f! l! f$ A( j9 ^+ M
        return save_data(key, value)7 m. {6 Z0 L/ p
    if operation == 'delete_data':+ V- J2 s3 \7 z; E
        key=args[0]
7 e( [7 l" J! b; t; {        return delete_data(key)
) X  H" [! C' B: o7 L* a    return False
* T* F6 B2 b# Udef get_sc():1 j7 w3 ]: R6 L+ B
    return GetContext() # 获取智能合约句柄. p3 b  ]  h: h3 v- f& G" ]. ?1 Z
def get_read_only_sc():
: _9 u0 {: ]6 Z* I; J5 V2 c  U; ]  |) P* y    return GetReadOnlyContext() # 获取智能合约只读句柄( Q, J* e8 j! y+ r% K
def get_data(key):
8 D# J/ i' N5 A% J( f7 ~  d2 v$ ~+ o    sc=GetContext() $ z$ G- R# W$ y0 v
    data=Get(sc,key) #查询数据
) {" I1 \. Y, N! u4 r  Y2 `    return data6 H- e7 k4 Y3 G  ^9 o- G# S, ^
def save_data(key, value):
' b) D, _& L! F    sc=GetContext() ) K3 L) M9 |& y
    Put(sc,key,value) # 新增,修改数据# h1 |+ d' N4 O. ~6 \% d% K
def delete_data(key):- [! Y6 y* M& V0 [8 M# e( i, s" C
    sc=GetContext() * T. H" N. j' s2 v7 l: H- t
    Delete(sc,key) # 删除数据```3 m& w8 y) r" Z; g* P
04 后记0 A4 L! E$ s9 h: ]
区块链存储是区块链整个体系的核心,本体 Storage API 的使用方法非常简洁,对开发者非常友好。另一方面,存储是黑客攻击的重点,例如在之前的一期中我们提及的一种安全威胁:存储注入攻击 ,开发者在写存储相关代码时务必注意代码安全。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

卡哇伊嘉人 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    11