Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
80 0 0
01 导语
) k; X  y) m; U& ^4 M5 p: U在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:2 _% b) b% @: [

% w* f, k0 r9 O下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。
" Z. C+ L  j  e) P4 A4 l02 Upgrade API 使用方法
7 d3 n$ f2 u) s2 ^6 g$ R) D! D使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。+ e0 r8 L  `) B$ M
from ontology.interop.Ontology.Contract import Migrate
! U9 A% K& b# _0 i+ c, y0 ?from ontology.interop.System.Contract import Destroy  ~; ^& ^" N  ~& C# e: I! C, ]
2.1 Destroy API1 O9 `. H+ `* G, D8 B
Destroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。. K  v; F7 c5 L8 Z5 {5 ~
from ontology.interop.System.Runtime import Notify
+ j% a. ?% K0 K6 ]3 Z+ F! Udef Main(operation, args):8 t3 M( p" C! A0 _
    if operation == "destroy_contract":
* ~% H9 {) t+ f3 A+ B* w3 o7 o        return destroy_contract()* G: V" \& }$ }
    return False/ w6 x8 e* t. v1 [7 K( j
def destroy_contract():
0 R  ?; Z6 _" M& ]  q( c8 y5 b, K' {    Destroy() # 调用destroy 销毁此合约" y  _& Z: K# g9 K) @
    Notify(["The contract has been destoryed"])+ H+ m8 Z& X" ?0 Z. Z, E
    return True/ ^, _6 B* L$ ^4 w) S
在 SmartX 上可以看到该示例代码的运行结果:1 w! p" l" a/ }* }4 J
将以上代码粘贴至 SmartX 编译并部署;/ Y# t8 U& L" e5 p; P" g
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;" p0 Z) L, p* K& F  Y
7 h2 \) Y  i: i! {! f
运行 destroy_contract 函数销毁合约;
0 O6 Z& g' u8 u# {1 F- [
1 C* }, ~. S" C% t再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。
7 g" r6 B0 j/ U% v0 D9 g2.2  Migrate API* }# w( E! x8 G8 D( B
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。
5 u) L& B8 b: P7 g3 W3 U& y' U特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。) q- D* ~0 F1 ]4 |* D% E
Migrate 函数的传入参数列表如下:
9 X* c# u3 C: g, s0 M3 }6 A5 l) }3 e0 Z( {6 F: A5 r& u
同样,我们给出使用 Migrate 函数的合约示例代码:' Z! v$ E% D4 }0 A  Z/ F- x1 M: K& `9 i
from ontology.interop.System.Runtime import Notify
% Y8 D" `$ W  `$ zfrom ontology.libont import AddressFromVmCode
! Q' v- T5 L! ndef Main(operation, args):! E) ?! B( N0 \! p. g( J; w
    if operation == "migrate_contract":' _, f. ~1 |0 J7 T7 l0 D* c% U
        if len(args) != 7:
& i3 t, i& Y0 U+ z. b& b2 I$ x7 Y            return False
. k8 i  R; i" B  E) z3 r: I% n        avm_code = args[0]
7 H9 i$ ^5 w2 C5 j1 l        need_storage = args[1]) J1 {9 S& H2 C" E. @, p
        name = args[2]' `, L0 P' k+ s, l" J% e
        version = args[3]
: t% z4 j; Y/ a3 Q# H5 y        author = args[4]
7 U& S3 D) b; W! _' e        email = args[5]
8 W: X+ i; s; r        description = args[6]
" q3 {0 i7 ^, {8 q* Z8 S: `2 x' w        return migrate_contract(avm_code, need_storage, name, version, author, email, description)! q* Z1 d$ y( v* D5 R
    return False, L+ [  s& r0 E8 w4 F% R
def migrate_contract(avm_code, need_storage, name, version, author, email, description):
, `! X' ~, O, x6 r, A$ k    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约. A- g: p  A: V6 O5 U
    if res:
8 h+ _6 C! R( U; ~- g        Notify(
, b1 v+ V' |8 U) i$ w( ]["Migrate successfully"])- R: M3 ~0 y: X
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址
! q0 ?% ]; \9 A9 ~& d+ _' Y        Notify(new_contract_hash) # 打印出新合约地址
3 x$ d; n8 U2 o( \* R+ W& |/ h+ E        return True- q0 W- N7 Q2 a. ]/ |
    else:
  i! {: T, N7 p: g' b        return False
( t4 r' W3 c1 O8 @2 A在 SmartX 上可以看到该示例代码的运行结果:2 U  P4 V6 j: |0 H/ x
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:6 h# X" }7 E: N, y% J  e
a. 要确认 avm_code 在链上不存在,不然会报错;' b" R. {' w- F4 i
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。) U2 Y( I" k0 S7 J' m$ ^/ i
: p3 j; J" `$ N- w
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
2 C* ?) a4 i0 M, d
$ a6 X2 G% r/ C9 i03 结论
) c, c  V$ A2 Q7 ^* A本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16