Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
110 0 0
01 导语
# o+ F" e; w5 Z7 V* J在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:
" N$ J6 |0 S, H" t4 R/ i8 e7 \. B- Q$ T9 Y/ I, Z6 _) g6 P
下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。
# ]. D* ]! J! A6 w! [02 Upgrade API 使用方法: f* ?2 f. u, B" j: C5 d" p1 E6 ?, I
使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。/ B8 N' R% ]( j9 Z, o' j4 c6 j5 L  _
from ontology.interop.Ontology.Contract import Migrate" C5 G; `$ c% i. U+ X* R7 c
from ontology.interop.System.Contract import Destroy
  g8 R, @4 P/ u( I; T2.1 Destroy API
  M$ K% U4 m  }' g% V% |% cDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。/ X2 A& Z  L) ~0 ^
from ontology.interop.System.Runtime import Notify
3 a6 D/ U8 U" h: X' j" c6 kdef Main(operation, args):
3 Y4 y( k/ W! ]/ ^, Y    if operation == "destroy_contract":6 C5 A4 \- P, D
        return destroy_contract()# v. V2 h: G, z2 P# k. x& ?
    return False
2 w5 t( ]# a. |; Z0 Odef destroy_contract():' R. s/ E# B5 u; S4 x
    Destroy() # 调用destroy 销毁此合约- I2 ]8 K! b$ U. Z, F- y" V
    Notify(["The contract has been destoryed"]); A; k2 J# E3 D9 v* f( P
    return True6 h2 C" m) @; `
在 SmartX 上可以看到该示例代码的运行结果:! u8 S4 z* g' {/ j* j% O8 V5 ?9 [
将以上代码粘贴至 SmartX 编译并部署;' E% |# C1 N! X: r" N/ w8 T
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
8 }$ I# U0 I1 y1 @9 ]. B) k4 l3 q% \2 e4 c+ D+ n
运行 destroy_contract 函数销毁合约;
# B/ d6 f7 W+ X* d
2 d- m' K" k. y: N! C5 z$ H9 k( B再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。, t+ f: V1 K5 i$ r( B( t+ t
2.2  Migrate API
, I2 U- D5 M. N, rMigrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。8 @, ?; r  `4 c& |7 Q
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
  m/ S' k  P' P1 ?! _7 sMigrate 函数的传入参数列表如下:
3 y: R4 M! w, j+ w
1 k$ i! k" S# w/ A同样,我们给出使用 Migrate 函数的合约示例代码:9 Y9 O9 R6 y0 q4 j) t. w
from ontology.interop.System.Runtime import Notify
- ]7 L  {, @3 Q  D1 Kfrom ontology.libont import AddressFromVmCode, m) _  `, P7 l$ p" f4 y) T4 g
def Main(operation, args):
2 a' \: O2 H* }( z    if operation == "migrate_contract":5 C# Z& T% O5 M# ?3 D
        if len(args) != 7:
/ `- P) O7 d) m: ^$ ]  Z            return False! D3 u) r+ T- ?+ x' A
        avm_code = args[0]
$ Q; u$ w. h3 H; H. X        need_storage = args[1]- r6 L/ g% o6 _; [5 ^8 q, U7 p* g2 }: r
        name = args[2]
1 `' D2 R: n# j2 k        version = args[3]
, t) L6 R. w- H( y- x' V2 z        author = args[4]
3 q1 b  D9 d! i: J3 m        email = args[5]
5 X7 n; ~) t- R' f+ n% q: m9 x        description = args[6]0 }1 \" s7 v- C% U2 o3 H7 H
        return migrate_contract(avm_code, need_storage, name, version, author, email, description)  U4 h1 V4 f$ g3 U4 u' I! o  W
    return False* E# S# O6 D. {3 U/ R7 H7 b
def migrate_contract(avm_code, need_storage, name, version, author, email, description):
7 Y: I( I' F) `! u; i    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约5 {" u) b" X! N# n, t% o
    if res:5 i9 n( ]; B  _0 Q$ x0 o! H5 Q
        Notify(1 [- [7 f4 u. C6 ?6 H
["Migrate successfully"])
! x6 l4 p; p/ Y        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址
7 z; n% z! {! x2 j, [4 D0 v        Notify(new_contract_hash) # 打印出新合约地址8 o3 @5 l4 q1 ?# d5 C
        return True
* L* o0 a$ M/ h0 s    else:
/ k" w0 v5 U, Y" X6 e        return False# r8 D' k8 E: N
在 SmartX 上可以看到该示例代码的运行结果:
5 n( {+ \, h! \( e6 ]3 U0 f0 r/ t将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:# T4 T8 _+ ~! V4 y
a. 要确认 avm_code 在链上不存在,不然会报错;4 s; U7 S) p" S
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。
* |& W) D* g8 s  M7 b6 r3 w/ A1 v6 a" N. e9 W9 ~
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
+ H" T) M: u' O* S9 G4 v* y4 h* `& ]$ x# r8 u  l& |$ }8 J8 l
03 结论
( N6 a+ u- v" q! \3 o7 ?# N本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16