Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
70 0 0
01 导语$ u2 E2 |+ h- a6 d
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:, V' q* H7 s8 ^8 }2 g) q( C7 \: o

" U, [' R3 ^2 q6 ?4 ~6 f* x下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。% }; @$ t% W. {2 ?; A$ N
02 Upgrade API 使用方法9 {6 N- D- f' `( y4 k& V
使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。
$ `4 d% K8 K2 m0 x7 Dfrom ontology.interop.Ontology.Contract import Migrate2 w$ n7 q) @- q2 U. e
from ontology.interop.System.Contract import Destroy# [2 W3 Q6 ~# f. N1 K
2.1 Destroy API5 [' u) e6 J' B" Y  |0 M* B
Destroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
9 ~1 ?8 k4 a$ T% w. {7 v! ]from ontology.interop.System.Runtime import Notify- j3 {; l/ ?3 {# y. T( V
def Main(operation, args):. B) M7 E# e2 G
    if operation == "destroy_contract":) L4 e; y$ C2 h
        return destroy_contract()
: M! m6 {/ K" P# H( ^* B& I: M    return False7 R) q( [4 T/ P( P6 W
def destroy_contract():
0 N! v  g  C; g8 x% D2 @" ]; X    Destroy() # 调用destroy 销毁此合约
4 t  p4 ]$ M, z+ `    Notify(["The contract has been destoryed"])
- [, d! Z6 M, O+ s7 {    return True* B, m/ [9 r  i
在 SmartX 上可以看到该示例代码的运行结果:  ~- O, p* Z5 P* V
将以上代码粘贴至 SmartX 编译并部署;/ d) D  R+ j2 J
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;) X. @- I/ g1 M% |; n/ q1 d
( H1 f1 i* X1 ~' n
运行 destroy_contract 函数销毁合约;
; X* X( i7 ]5 e5 k7 U3 }! P. e5 y0 A1 n9 m
再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。/ F/ ^7 q& B) y9 R' `& o# j( F8 `% J
2.2  Migrate API2 P# x! h( T" ]8 W
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。
6 e  M/ v( K# e7 x特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
% I1 Z6 S- F5 V/ w% wMigrate 函数的传入参数列表如下:9 q- W4 k/ b  D

$ `- `/ `) e7 Q5 f3 _同样,我们给出使用 Migrate 函数的合约示例代码:
/ g9 l, ]5 ~& J2 W3 r- K, mfrom ontology.interop.System.Runtime import Notify' t8 L8 s! H/ B1 q6 q5 j3 F
from ontology.libont import AddressFromVmCode
0 E6 }$ I/ P: p$ Q8 v3 D# ldef Main(operation, args):
4 S+ W$ p! _7 M. D    if operation == "migrate_contract":9 G  i" i  r3 P( @& K5 H
        if len(args) != 7:4 `6 k& v5 o/ _8 l+ Q
            return False
5 P, K1 j/ l& d# U5 A2 f5 F        avm_code = args[0]
$ h4 s0 U) Z- L; y# }        need_storage = args[1]
) V- y8 b2 A: C& j        name = args[2]: Y5 N" b* {0 q) ~: p2 A
        version = args[3]
8 x/ G, b: N  S, y; N        author = args[4]
( ^. l0 @* t6 S  e7 h* ^        email = args[5]
* Q8 l) |5 K% f0 n' h- {  c        description = args[6]3 d6 M; U1 t  u# o
        return migrate_contract(avm_code, need_storage, name, version, author, email, description)# n) n" ]9 b6 ~) v2 k) Y* j
    return False
1 X5 |& ]7 D9 G. wdef migrate_contract(avm_code, need_storage, name, version, author, email, description):: T; I0 G* K) i, Z$ D
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
# l, B- v8 l& h  p& o    if res:
7 h! d  p0 F/ {8 A  z! Q; P4 Q        Notify(
% Q8 }7 O+ i* C4 c, R9 B5 G["Migrate successfully"])
  {4 q' u- U6 X        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址% \9 J8 {; z3 h: h8 J
        Notify(new_contract_hash) # 打印出新合约地址
9 k- n( K  X7 b1 [% @. ?7 w        return True; @4 j* y) _* o- c' R0 c
    else:  i! b( E& F0 E2 m) c* `; b2 \
        return False
3 ^: f8 R/ X% C8 }5 p9 }' F+ q在 SmartX 上可以看到该示例代码的运行结果:
& M* e! {: g7 {+ o# ?% }1 W7 a- k- r" \将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:% F5 F6 m5 Z7 X5 `1 I
a. 要确认 avm_code 在链上不存在,不然会报错;
0 b4 ?6 w+ k1 ?9 qb. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。( G3 f6 p- }# A8 M$ g2 h4 U

, Q" J0 l: N1 b6 d3 N部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
: G7 ]# v# R6 H4 j/ z% s) T  w+ c+ X% C) r# F. W8 e& e7 i
03 结论
- k; [- z4 s9 |# ~  _  Z本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16