Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
85 0 0
01 导语
3 Q9 G; V9 N) c3 Z+ j在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:1 I3 x; p1 o' o2 m: A7 g3 \* c# O
3 j+ K& V  D( c* ?' K9 x, O
下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。/ a' k, ^* ?  M! g
02 Upgrade API 使用方法: A. @4 D/ d! s- {$ n& G  x
使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。
( l' n9 N" y5 gfrom ontology.interop.Ontology.Contract import Migrate( c8 @( T' ~; `- a/ {
from ontology.interop.System.Contract import Destroy
% `8 ?: J! l0 P4 B6 a  i2.1 Destroy API
) n( n# i7 @' \+ R' p4 B2 _4 pDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
; ^$ T3 O6 i3 a3 O- tfrom ontology.interop.System.Runtime import Notify7 [0 Y5 L9 Q; f& Q' r3 F: k1 E1 s
def Main(operation, args):
! B% q6 V/ M- z; ?3 R7 A3 t/ E    if operation == "destroy_contract":
* b1 y% `! \( a& i" C! K        return destroy_contract()
" L% V3 [5 o) e6 ]) A    return False
) @1 n( o- F: e* ]! edef destroy_contract():, }+ L; e+ I2 C: u; f
    Destroy() # 调用destroy 销毁此合约
  l6 K& i! x: b8 S+ F+ }& P2 }    Notify(["The contract has been destoryed"])
4 f& S( V" @' O) z" ]    return True
/ u. s. `. J. W; Y+ q5 ?在 SmartX 上可以看到该示例代码的运行结果:
& y! D8 R( m- W3 T5 ~$ `. n- ~将以上代码粘贴至 SmartX 编译并部署;4 I% j+ @' Z$ u, Z8 ]  q# y
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;2 D# R& o) G4 w. J7 L9 t2 ?

% R1 C9 T6 w- F& A/ j( _7 D; r' S' S运行 destroy_contract 函数销毁合约;
% ?- x2 y5 ^- ~' L4 W$ ^  @* ~3 w7 t; Z( h0 S
再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。
7 `/ O4 X" N) @' l2.2  Migrate API, H; M# C  ~2 x8 O" q3 F
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。9 [2 Z) Q5 H, E
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。7 a% @* N$ @3 X4 Y6 P# ?
Migrate 函数的传入参数列表如下:# T8 s& c2 ]& [# o: }# z8 @

; |& h3 p2 m5 d6 a" T& b同样,我们给出使用 Migrate 函数的合约示例代码:# |+ X  P' O, Q2 T3 ~" `
from ontology.interop.System.Runtime import Notify4 u0 {. z2 F% C  H1 Y
from ontology.libont import AddressFromVmCode3 X" W0 x3 ?$ ]& y
def Main(operation, args):! Y: _# [! I# _
    if operation == "migrate_contract":
! ~% b: c7 W  Z/ w$ A# g% j        if len(args) != 7:) _& w+ ^( f5 F; z0 q8 d
            return False( A# h' o# R" C( \
        avm_code = args[0]( w- U$ @! j; D  ?
        need_storage = args[1]
2 x* O' Y3 N$ T  p  Y        name = args[2]
1 g# A. F0 N2 X& f6 ]& Z' ?        version = args[3]
: a: \5 f0 H( T        author = args[4]
, M3 R: z! v- W. }        email = args[5]
7 @! ]' w5 W- {/ r) G7 ^        description = args[6]& O' k9 c8 Z3 |* t6 i3 u
        return migrate_contract(avm_code, need_storage, name, version, author, email, description)
8 H& }$ [& ~% y    return False& L% R  U. g- Y+ ]
def migrate_contract(avm_code, need_storage, name, version, author, email, description):
( }# l5 ^" m9 }    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
3 n; P. h' d0 j    if res:
4 P# T% R, E' w: P        Notify(! Y7 R1 r# H: \0 |
["Migrate successfully"])) q/ o7 `/ W2 o2 J. Z* k- s
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址
$ e* M. h! S7 d+ G        Notify(new_contract_hash) # 打印出新合约地址
- X1 C- ?2 d# V6 Q        return True* }2 _4 r9 c: K, p; _) m" j
    else:
, i, n7 j8 E: d1 M1 k6 K. q" ~        return False
% j2 F9 o, {4 G  L' B  `3 O在 SmartX 上可以看到该示例代码的运行结果:( M& h4 Z# M! K; z" P
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:
; i  d6 m' n& [1 xa. 要确认 avm_code 在链上不存在,不然会报错;
% i& H7 f" N( C+ Yb. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。* t2 F7 |! D  o0 P# v9 d" J
4 x) o' r0 O$ q0 L) _) m8 B) u
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
% d" }* x+ n+ C3 X" h/ [, i: E, [+ M& U# C8 w. Z
03 结论) S0 u; {3 H" I6 F4 i0 S! M
本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16