Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
84 0 0
01 导语4 R8 E; a; D% x; ~0 F4 t% c
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:
+ @6 o: e9 R3 s: E
) j1 c* t% L$ x  u6 c9 x( W" `下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。: l. }$ u7 G4 J1 c  A. D
02 Upgrade API 使用方法
6 R4 R5 S' M# Y8 ]2 C3 f. U2 Z使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。9 j6 ~- q$ ]6 L! W
from ontology.interop.Ontology.Contract import Migrate
: z, v$ S' y. b/ s9 Wfrom ontology.interop.System.Contract import Destroy
: X2 H/ [& I$ f/ `2.1 Destroy API8 U0 U2 V. d8 O' N; b! a5 d, h
Destroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。0 z7 U0 c1 y/ T2 m+ A) d. L9 H0 g
from ontology.interop.System.Runtime import Notify
+ [& \* Q7 V2 L* e2 Idef Main(operation, args):
/ O' u- L( G$ [" Q& g# M    if operation == "destroy_contract":
& H; @7 H/ k; w        return destroy_contract(): V* z$ l" D/ R0 y9 P3 ?
    return False
( s  L: I( o: |4 i# d; Wdef destroy_contract():. Q. u6 P& Z. c' O# F
    Destroy() # 调用destroy 销毁此合约
# V; |1 k9 h1 g8 G3 S3 I4 j    Notify(["The contract has been destoryed"])
" n$ t) u! t8 L8 ~* X2 i, D/ L    return True
- t/ V0 T: ?5 L3 L8 i, `在 SmartX 上可以看到该示例代码的运行结果:
; ~  p* K) ]8 L' [5 H' Q将以上代码粘贴至 SmartX 编译并部署;
, C; D' T1 i, F再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;& J* k6 ~% m! @, @* U; X

6 L" F4 @' o1 ?" `运行 destroy_contract 函数销毁合约;: [1 ?- d( W1 [3 S$ ]
& j$ b) k" }: W7 Q4 N2 u
再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。
& g; d/ r6 L* Y; D0 q2.2  Migrate API# G8 G& v/ A3 J) L+ D
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。8 K% g' Q# p& Q0 ]: h5 l
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
7 i" Q8 [% N' p6 I4 p4 h  LMigrate 函数的传入参数列表如下:
2 ?8 m8 K9 y2 e: @" b) S
4 b) m  ^/ K/ A/ ^( M同样,我们给出使用 Migrate 函数的合约示例代码:, M* |; s7 P0 M+ J
from ontology.interop.System.Runtime import Notify5 w& N( D7 ]% {0 }& k7 J' X9 |6 }
from ontology.libont import AddressFromVmCode9 _" V; w# g. `! N0 w6 p
def Main(operation, args):
3 ]! B1 u/ u( r$ \! `, K    if operation == "migrate_contract":0 }2 i2 O6 O$ k: V- G8 T, B2 x/ ]
        if len(args) != 7:- e$ u# G% i/ m8 G) v
            return False
: O3 A* A0 \& o. m- ^/ k        avm_code = args[0]
& s( k, J7 l9 _* T        need_storage = args[1]! {7 [4 e/ r. Y; L
        name = args[2]; `6 j  Z; C: [6 Z. a
        version = args[3]
& N$ ~) G3 r! i: \2 M. m4 Q        author = args[4]+ p* \/ N9 x, N- n! W0 W
        email = args[5]
1 O  o- d3 G$ x5 }4 W  v        description = args[6]
% n! g" _) I6 h# s5 L6 G2 v        return migrate_contract(avm_code, need_storage, name, version, author, email, description)
* {/ d. d2 w( p  v    return False" y& J( K- b% z4 H' |
def migrate_contract(avm_code, need_storage, name, version, author, email, description):
8 @6 P% R( N% r2 ^. w* Z- D    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约. W0 A% G5 W% r8 X- d
    if res:
3 \9 F( B! T9 s        Notify(, x2 g4 g! l1 W
["Migrate successfully"])2 D& A& D2 P) F0 b! f
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址% Z: g5 |7 |6 U3 V' D3 i; @" G
        Notify(new_contract_hash) # 打印出新合约地址
+ b# u: a9 S0 d7 K/ @! |        return True- A5 \( Q5 f7 G- v' t$ D4 g
    else:3 A) |5 r: B. Q5 D. I
        return False8 J5 x" n" m2 j1 u. H9 E" {8 \
在 SmartX 上可以看到该示例代码的运行结果:
& T; M( W6 }" [8 d$ _& K# j# ?8 ^将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:4 K# ~% L. Y- G
a. 要确认 avm_code 在链上不存在,不然会报错;3 B4 m( a* O( k" ~) L3 e$ ^7 u
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。: A; b  {. y6 E) y$ ~+ M8 `

9 ~% A" J  K" m% s' Y- N! T部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
- |, j$ H1 C0 O9 h1 J( B# x+ n+ K' d+ X& B* S' k. P; p  G: @
03 结论' k8 d) I; V8 d7 u* C* [
本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16