Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
201 0 0
01 导语; A1 w. |7 ~# r$ _7 X0 h
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:
! N# e# F& U' @0 v0 i* s( Y8 @0 k# \! I5 r& H
下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。; a7 K5 g5 [0 q6 t& A% f( |
02 Upgrade API 使用方法
& o5 T( [* N% B; N' J使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。( d8 K- {  \6 x2 s0 D
from ontology.interop.Ontology.Contract import Migrate
# c* e; l. q9 ^  w; d$ wfrom ontology.interop.System.Contract import Destroy
5 s3 [2 \* J; T' ^+ Y& _; h2.1 Destroy API
9 A) ]; y+ k7 c% w" _+ B) o$ v+ sDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。: P" J4 b  c3 g
from ontology.interop.System.Runtime import Notify, p. R: w5 w! X% k3 t) ~. n7 G
def Main(operation, args):/ {$ R$ b$ X/ X, u# X
    if operation == "destroy_contract":2 b* G; w/ c2 s0 C) b
        return destroy_contract(): J/ t& E! t- X) L2 m: ?5 K
    return False# o/ T6 ^" U# O- C  `* _8 v) J+ e; O
def destroy_contract():
7 S/ B5 R1 f! [' R    Destroy() # 调用destroy 销毁此合约
4 Y  G. R" h! i7 n- ^) |    Notify(["The contract has been destoryed"])
, a- I/ |; w2 H1 P" s    return True
3 N3 M* D/ Y# P  `" @在 SmartX 上可以看到该示例代码的运行结果:: `6 ^$ s1 ?7 t1 `# ~
将以上代码粘贴至 SmartX 编译并部署;( n7 F4 d  ]- t: r
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
  _" ?1 ?" i" Q3 k) d0 }
  Q) C/ h5 E9 Z! H1 f运行 destroy_contract 函数销毁合约;$ n0 ^+ V% g$ {' i/ ^8 W, y
1 k; g4 O5 U! m
再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。$ R: Y( b! s- @8 O% q: p* F
2.2  Migrate API0 t& o( _+ _5 o; X+ C0 f% t
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。& O+ F+ C; ]9 ]" T4 Y
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
! l# M8 ^8 j+ @Migrate 函数的传入参数列表如下:6 ~. w  D  V- D* B$ z& C* @

1 _3 j. |, \" f. ]3 R7 @+ F同样,我们给出使用 Migrate 函数的合约示例代码:
- q0 b- `8 [4 z- |4 O5 x3 rfrom ontology.interop.System.Runtime import Notify
5 u2 [( E# H2 Z7 ?; sfrom ontology.libont import AddressFromVmCode: C, U: J) q2 z5 R$ l
def Main(operation, args):
) }8 U8 P2 S! \- d. l9 C) q    if operation == "migrate_contract":
* i  z. B6 F) C+ P! s* [        if len(args) != 7:
! b# d; i! E4 O& Q, a5 X$ r            return False
. \; X# b3 c" x: h  r4 z5 G, E        avm_code = args[0]
. U- }" A; r* U' I; F        need_storage = args[1]
: v* C# }& @: l; t        name = args[2]3 Y4 C. b8 v0 L8 g. T+ T
        version = args[3]  t! I/ }  M/ }2 N0 x, u
        author = args[4]& G6 i; {/ F2 E8 c8 }) ^* j" O4 w
        email = args[5]
1 {" B4 _8 w% L! @        description = args[6]
& W$ a5 F# {% l        return migrate_contract(avm_code, need_storage, name, version, author, email, description)$ d( C0 G6 R; X1 ~% u9 O  H! {
    return False
" r0 E& c" J( c' Q# w& bdef migrate_contract(avm_code, need_storage, name, version, author, email, description):7 A( A5 M  l  }- @
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约2 r! e, U) P8 Z! R6 Q
    if res:$ u0 c; ?* i: p4 z
        Notify(, s# H2 R9 {! @% H, i# v# L+ {
["Migrate successfully"])
1 D0 }# J2 S" ?; U0 i1 B        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址
* i& k8 j9 R) A6 ?        Notify(new_contract_hash) # 打印出新合约地址+ P  ~1 S8 i4 @- H. k$ U; Q
        return True- ?( n$ [" X- s3 O
    else:& G& i$ S; q* p* p
        return False9 W0 b  o- P; W) i7 c2 X
在 SmartX 上可以看到该示例代码的运行结果:6 L3 b4 ]; u* e# {9 X
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:
* x, Y6 h9 X" g9 Z, oa. 要确认 avm_code 在链上不存在,不然会报错;% s  Q$ y# ]/ [9 S7 g
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。! M' X% Y' |$ g! c/ A: v8 M
" x/ k8 P% |6 \* J$ w
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。" V  f0 _8 R) `& _+ {
; b1 e& F( j6 P, L: M
03 结论* j( f: V, E& Q! p
本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16