Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
192 0 0
01 导语
5 K1 g8 y1 y. }6 o' t4 \) x在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:3 e* o" A- X6 k/ h5 d
& E& \- h, n3 Q% C
下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。
) @- `9 ^$ ~: ?- T  L6 |02 Upgrade API 使用方法, W, U  S# t$ }- y, ~; O5 D1 o  n
使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。) D; v( |1 W4 {+ o! i8 ~
from ontology.interop.Ontology.Contract import Migrate& Y" N9 [' }* F" c
from ontology.interop.System.Contract import Destroy' S7 d0 n: \" C' l$ h) C( d7 t
2.1 Destroy API
, x! Y# \0 w  L$ y& }! q6 BDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
0 Y( r3 H& C, G4 y4 o7 mfrom ontology.interop.System.Runtime import Notify: V1 ?/ M& G3 p
def Main(operation, args):
4 n) s0 L) ?' G  t: N/ @    if operation == "destroy_contract":' D# B9 ^4 n) p& I+ }
        return destroy_contract()+ C* g7 ]; T; M: r
    return False1 e3 K0 x/ B2 G1 l% @) B
def destroy_contract():" [, k0 e7 z: w( Y  m
    Destroy() # 调用destroy 销毁此合约
0 a' }0 ?% s- o# B  F! L  i    Notify(["The contract has been destoryed"])+ y5 b9 |. k& ^. s! c7 _
    return True& F& H: K8 \7 G! C
在 SmartX 上可以看到该示例代码的运行结果:, x7 S( R. D4 }- l% Z
将以上代码粘贴至 SmartX 编译并部署;
9 _6 n! G3 I2 O- T$ ^再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
, p0 c; @$ T" R% @/ w8 o3 e$ H& O: O
' [+ m6 i1 s9 K3 B5 {1 f$ I8 h运行 destroy_contract 函数销毁合约;# ^1 ~( i" N0 E# r5 m9 L9 b

; E; s/ j1 i0 P/ E! B, u7 K再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。* b7 j$ Q; }$ S7 i/ \) W
2.2  Migrate API2 R+ t7 l& D$ I$ p' a0 p
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。
) @/ k# g2 P4 k& R9 o& v2 G+ g特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。# Y0 s* F* I6 ]! b& v# n
Migrate 函数的传入参数列表如下:: U8 @6 }4 \/ n0 [. V

! p2 U2 g+ s2 B6 b& T9 O同样,我们给出使用 Migrate 函数的合约示例代码:
# p9 }0 L% O) B8 V6 G% }! Yfrom ontology.interop.System.Runtime import Notify
4 f: O' w8 M- p! G) F2 Qfrom ontology.libont import AddressFromVmCode5 W' ]" F! \5 `# o( |
def Main(operation, args):
/ x" n: N2 [* y$ t: @# K    if operation == "migrate_contract":
; D, Q5 h' v; K        if len(args) != 7:9 R9 n. I6 `) W$ K
            return False$ m3 z: q; v! g! D
        avm_code = args[0]: y8 G( M9 c0 O' t/ {4 O  p
        need_storage = args[1]9 p; ]' m0 k3 O# \) A
        name = args[2]0 r1 [% Y, `, G1 \. J" j- Q
        version = args[3]' h! H; x, L$ o" T8 K  Z( V
        author = args[4]) G; H: {% n& ?
        email = args[5]& I3 u- q9 i8 E2 B8 y: R: g
        description = args[6]
4 {5 s+ O! w  O: n        return migrate_contract(avm_code, need_storage, name, version, author, email, description)
- q% A. C# x1 O6 F# |. K  J) _    return False7 |. |6 E* }3 e$ j# \( }2 A7 S
def migrate_contract(avm_code, need_storage, name, version, author, email, description):* B7 w- V& i' Z6 D2 O- g/ y) q; M  A
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
5 C6 N; K. H7 ^3 Y# S. H/ l2 U# N6 R    if res:) b0 @! t- @! [. B( x' e: W
        Notify(
' |9 N9 ]6 C# N4 \, I' l6 V+ u["Migrate successfully"])
: v, b  p8 v; Q! @5 ?  N3 k8 N        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址# y# n' _, [6 C3 v
        Notify(new_contract_hash) # 打印出新合约地址( l! {8 ~" M4 u) R: y
        return True" O  Q: f2 Q0 j9 A2 S  v! D7 I
    else:
  j1 C/ o  R1 m9 m! V# i& b, ~: {        return False
+ Z6 `0 x0 v+ l/ U在 SmartX 上可以看到该示例代码的运行结果:1 i+ D+ X+ u: P( p
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:
- g: }1 |. O1 i$ E, a; t- @a. 要确认 avm_code 在链上不存在,不然会报错;/ k: g: e# |7 y, i, s
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。7 T" i+ k& R- P2 _

. F: B9 T# N% M部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
& M8 Y7 m; V4 R$ c+ ^
( |& d6 P4 A( @; l; Y" {; z03 结论
; C# F" v9 S% g" V( p0 o本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16