Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
202 0 0
01 导语, r2 k& v9 O; [5 P$ T) V* i
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:& M4 _! ]; s$ Y

2 W7 h. d9 D& l1 Y; H* V1 r下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。8 V5 |0 q' Y0 f
02 Upgrade API 使用方法4 G# n# m6 J& G9 i: j
使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。% r6 r( d, `6 k+ p5 V
from ontology.interop.Ontology.Contract import Migrate
" S# @2 J: r, N7 }* ^from ontology.interop.System.Contract import Destroy
2 F; x8 `" B& D- J# ]2.1 Destroy API& R; }5 B' O( w8 C: w& N5 I
Destroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
8 C1 T# B+ s* L% bfrom ontology.interop.System.Runtime import Notify
) V3 R' z! p" J- Vdef Main(operation, args):* G- T+ S' W  ^- z; ]
    if operation == "destroy_contract":/ Z1 k+ I* W- X2 v/ _2 g
        return destroy_contract()
1 ~. s" i! c! k    return False
9 P2 s" T. P9 w* t. S* [1 g/ y# ddef destroy_contract():
. N3 R" q; ?! T" i    Destroy() # 调用destroy 销毁此合约7 U3 g% P/ K2 [6 T  \
    Notify(["The contract has been destoryed"])
4 G/ d$ B0 x0 ^8 w, [    return True. Z* _( e: t3 H; Y* E+ Q7 w
在 SmartX 上可以看到该示例代码的运行结果:0 }8 o* O# ?/ d
将以上代码粘贴至 SmartX 编译并部署;
. Q$ }4 Y0 T; l再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
- L2 \7 e' y$ Y5 K" b/ t/ A& R
/ Y+ @) f2 J% P* e运行 destroy_contract 函数销毁合约;/ P2 B7 Z$ a: \9 p* _3 V

% ]* ^: b' j0 J  p" s/ L. D再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。; G4 G& c8 {& n) M, V
2.2  Migrate API
6 @7 t. W& o- ~Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。
- P3 y4 O# H% N5 [特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。$ A- I0 Y3 p( l1 f9 r6 P& P+ P
Migrate 函数的传入参数列表如下:+ J' G* R4 t) Y! r& l2 t) Y

- v$ t: U, t3 D同样,我们给出使用 Migrate 函数的合约示例代码:$ u; m1 {1 F: ?7 l* u
from ontology.interop.System.Runtime import Notify  X4 Z. U3 o' r- A9 ~
from ontology.libont import AddressFromVmCode- m( q5 T3 M  U' c9 o
def Main(operation, args):7 B7 B* H( F1 G
    if operation == "migrate_contract":3 v( U4 K7 i8 w" U/ j7 u  o
        if len(args) != 7:( V0 k) e* R1 V1 [
            return False3 j" P, Y6 M: n7 `) M
        avm_code = args[0]7 _# f) b* P- O2 l+ R; T  J; p
        need_storage = args[1]
. P) s9 p1 i0 n2 E! n2 S        name = args[2]; J. s0 C  E4 O- u
        version = args[3]  v6 d! _2 N3 A) ?! d+ c& Q2 Y
        author = args[4]
- Z  T' z/ Y$ p1 o        email = args[5]
9 V. s. H7 o! l' p& p8 b        description = args[6]1 z* S3 D' w2 F( s, l% N4 r
        return migrate_contract(avm_code, need_storage, name, version, author, email, description)
" w  o  J7 D* m0 p8 }1 _    return False
5 \6 {! h: k4 c( T+ Hdef migrate_contract(avm_code, need_storage, name, version, author, email, description):/ v8 Z" k+ i* E! _+ @7 ]
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
4 r7 z' Z( x5 w    if res:% z, \- Z9 E' D: z7 N* d. [* T
        Notify(4 [4 i; f7 S* m$ x( s+ c/ x
["Migrate successfully"])0 W+ y% D0 Q; s9 b5 I: I/ h
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址0 {- s2 j% J1 [* Q+ t8 x
        Notify(new_contract_hash) # 打印出新合约地址* F" h" m# D) \
        return True
" \) o' ~* g% X6 o, E    else:) z  Y, d9 C/ g$ V9 ^# D) X
        return False
' c$ B. Q6 Y; s; a* z0 K在 SmartX 上可以看到该示例代码的运行结果:
: P+ I9 s- }/ p( U. w! X: f) {% q将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:
8 N2 A# r) C# N0 I. Y( ^$ ?a. 要确认 avm_code 在链上不存在,不然会报错;
0 K7 H' ]# x. y9 @6 s5 D0 Nb. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。
" E6 `' Q* z: f8 f& L2 {( L6 u* E2 \8 a+ b+ e& B5 k
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
3 N, S8 q0 y" t) k3 g3 z6 d1 `( \' d- ~( D
03 结论
2 x6 J1 {3 U: K本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16