Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python智能合约教程之合约升级

zmhg799417
82 0 0
01 导语' X/ a, ?" n! p
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:+ j- y: M9 p0 J8 g- S8 L; d

/ V7 g$ ?) `6 Y下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。
# ?$ }, p0 J# p9 ~! u+ _02 Upgrade API 使用方法
* x. L5 {) c$ H( O: u  y3 m$ i) t# I4 d使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。# u4 ?5 D# ]2 u9 C7 H  y9 y; g7 t
from ontology.interop.Ontology.Contract import Migrate
0 M% |/ y+ L8 r6 l+ }5 b% pfrom ontology.interop.System.Contract import Destroy6 F* J- z1 v2 f& F9 X# m4 o
2.1 Destroy API
1 `# Z! R2 C5 K) [& y* YDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
, n" A9 Q" P) c0 h( dfrom ontology.interop.System.Runtime import Notify
5 J' U! ~1 M. U+ U1 Udef Main(operation, args):
% G4 O5 `6 g8 K( Q    if operation == "destroy_contract":9 `5 Z+ V, Z4 N, q% L! Y
        return destroy_contract()
; G3 X; v5 H4 n    return False
+ ^% A6 t+ M6 f% V' B. J3 w0 g2 T# hdef destroy_contract():
5 @- p) ?( {' q) Z6 g% M, C- s+ H9 S/ [    Destroy() # 调用destroy 销毁此合约& e. Q' }6 q' M7 X) Q! C
    Notify(["The contract has been destoryed"])4 F  {' d3 c8 x+ Y+ u7 G$ a
    return True  v5 V" ]: q) E) j* w0 r
在 SmartX 上可以看到该示例代码的运行结果:
" _8 Y4 p+ X, Y4 d0 d; p将以上代码粘贴至 SmartX 编译并部署;, m% N. |( P# O2 {. E
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
% p$ O/ _5 U" f2 J" i
  P/ K' n: D. I9 S运行 destroy_contract 函数销毁合约;
# f& K: `, u& }+ M. u* c5 ]1 }! _1 B+ R6 W1 y- \, h
再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。2 x# z- Z0 f* G/ T3 p
2.2  Migrate API  C7 F& s( S4 G
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。$ u# y5 Q6 x- M* O1 {
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。" E0 W# a! n! [- E( `
Migrate 函数的传入参数列表如下:
$ c4 E# \0 s6 \7 v6 e; k5 J
7 O- g+ F  P0 b6 C: n7 }, M. A* R同样,我们给出使用 Migrate 函数的合约示例代码:$ M* O' ]2 D/ M  C/ f$ [
from ontology.interop.System.Runtime import Notify6 x2 i8 T5 B3 y
from ontology.libont import AddressFromVmCode
3 t" Y: B  @9 I2 r# Edef Main(operation, args):4 b, \2 N. D  H$ Y; M
    if operation == "migrate_contract":
! ?- u5 m5 h# i( e- [9 L" j: ~/ f        if len(args) != 7:; E. x2 C' R3 U+ l" f4 @
            return False
1 w' Q& v7 ~2 ]' v8 t) ^/ f2 L        avm_code = args[0]
5 A: K. ]: {% V" p        need_storage = args[1]8 r1 X/ v# `, r5 \
        name = args[2]
5 Z: ]! A, t2 t        version = args[3]2 ]6 M) n: K6 P- M2 W' p
        author = args[4]
( i% r) V& t- A8 G. T0 T( z* o1 B( m        email = args[5]9 h/ C2 ]1 j3 P- r6 Y
        description = args[6]) f+ \4 l0 L3 S) @6 ]
        return migrate_contract(avm_code, need_storage, name, version, author, email, description). \8 N, {; R7 R" {0 L( _
    return False
8 `1 O: Y: c5 W' Pdef migrate_contract(avm_code, need_storage, name, version, author, email, description):% ^4 L: Z% Y6 d% x) Q* n' N' ]
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
! A% @& Q3 _' O/ f" O& A: P# X    if res:3 j- @5 i' V* x8 U0 d) _
        Notify(
8 \$ u) J( o* r% K# E["Migrate successfully"])4 n' k+ {+ E& @0 w6 ]" C1 A
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址" |8 T- g" E9 H' d
        Notify(new_contract_hash) # 打印出新合约地址
5 R% k- U, l. s4 A- `7 B6 O        return True6 @0 T3 E& ]( _/ l# s
    else:
- b- v5 p  f- x& s! l, l        return False
& ]) j% Z* {1 w7 w! k% e在 SmartX 上可以看到该示例代码的运行结果:
0 ?) R! f# @1 s& q将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:9 E2 U4 y) e4 P) m+ f  ~
a. 要确认 avm_code 在链上不存在,不然会报错;
% V/ A9 m  d& f7 Lb. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。
9 ?4 r/ z6 l) M: d
6 Z- X0 N0 G1 }部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
0 X1 g( `, z4 y! i& o, ^4 O+ S& n
! L4 o' n9 p. m03 结论
: A3 S. }5 `# ?6 J( e# A本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16