Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
92 0 0
01 导语
) ^7 Y  D6 T2 {$ @0 H# ~在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:- |& u! ?/ r7 ~/ p8 K; i

) [1 P7 G# \# |4 T下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。" a* T2 D0 Y; J6 [6 `' d
02 Upgrade API 使用方法
! U  L' [; d8 G使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。/ H; ]/ a. O( @5 c8 K* _
from ontology.interop.Ontology.Contract import Migrate# [- o1 ]9 \; \: Y
from ontology.interop.System.Contract import Destroy  I) A5 A5 e; f! H2 Z
2.1 Destroy API
# Y4 K' ?* L( t  Q( e8 |( B+ \% uDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。
5 o$ B$ C# n" }# H: \7 Kfrom ontology.interop.System.Runtime import Notify
, m7 v% e1 r! U6 y9 l' Ldef Main(operation, args):
  G, _& Q8 j. X9 {  p/ r! \# `    if operation == "destroy_contract":
3 E( J. V6 f0 ^        return destroy_contract()
$ j3 Z# p/ i5 g, s& S6 B; a+ e) _    return False
( Z  Q1 w4 k" `, F' l) {6 odef destroy_contract():
4 |- n# _" L  z' z2 A" g9 s; ^) K    Destroy() # 调用destroy 销毁此合约4 E4 D4 g7 g& k, d8 \/ ^
    Notify(["The contract has been destoryed"])
9 b4 `% @7 f' O: I. L    return True0 _6 ?- z: b. b) q0 f
在 SmartX 上可以看到该示例代码的运行结果:0 B) x, e3 f8 E. ]6 b9 l
将以上代码粘贴至 SmartX 编译并部署;
7 P" P* s/ e$ Q# s' |3 A再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
6 P: c) g. d" `6 k( v  G1 N' g' k/ r3 N5 E6 W' q$ i; h
运行 destroy_contract 函数销毁合约;3 }1 I1 l* y8 @* H

% H  m6 |% E9 d再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。
3 ^7 C2 c3 n9 c# J" u1 K2 a2.2  Migrate API2 Z" \/ d" s" G4 W7 w+ Z
Migrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。- l8 P% D9 X% h5 Q  U+ i# }; \
特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
2 J% u5 q& `8 g/ k/ R" uMigrate 函数的传入参数列表如下:
5 m& S$ N$ X0 J7 n9 Q: ^7 |3 }: x, {$ Q4 k0 t$ ~
同样,我们给出使用 Migrate 函数的合约示例代码:
% ^9 r) s5 W) E0 `! Ifrom ontology.interop.System.Runtime import Notify( }0 ?7 Q: X) c+ \! ?1 E1 b
from ontology.libont import AddressFromVmCode/ L3 ^+ a% d0 U+ X0 R) c. K, l; ~" }
def Main(operation, args):; {: B, M' J. Y5 k- R9 o: T/ s2 b$ O: a
    if operation == "migrate_contract":- @. q& o; g; n
        if len(args) != 7:3 C9 b8 k& k, l! {
            return False
* P( B- S; v! x& `) H5 Y" O: k* A# N        avm_code = args[0]: j( r2 d  K8 H
        need_storage = args[1]
( p/ b( x; c8 [        name = args[2]
! }* V$ [; _4 p6 v3 R2 S+ T  M" O        version = args[3]
2 Y) V2 W, R' B" J; p) M' n        author = args[4]+ E& p6 a7 }* s7 W; A7 _! N
        email = args[5]
9 q2 A) u  I/ f2 K% T: O        description = args[6]' s0 j+ p; N! u* C  K
        return migrate_contract(avm_code, need_storage, name, version, author, email, description)
# J5 b; u' A. ~- {    return False
$ M& @" S6 A5 H7 N; H7 h2 X1 pdef migrate_contract(avm_code, need_storage, name, version, author, email, description):0 J$ g# T0 T8 T
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约
8 p% v6 {& M( n" T# |/ e, p    if res:
! Y1 |) Y7 I2 f" m" _6 i6 R, e! y        Notify(
. E9 P, @9 _- ~& T5 _/ a["Migrate successfully"])
' H3 ?' B6 T& H+ R2 o, W6 y        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址% N& i: [: X8 F) F- T
        Notify(new_contract_hash) # 打印出新合约地址( w( H1 s7 N! C$ g6 B7 P: z
        return True0 G# W1 l/ I' t' ]; @6 p* X
    else:
( r) A1 N9 V) r+ O  j5 m' u- }        return False/ k# r2 }4 x, R* h" Y4 y
在 SmartX 上可以看到该示例代码的运行结果:  s4 i  R3 p  W
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:
0 }' s9 {( |" c% Za. 要确认 avm_code 在链上不存在,不然会报错;* M# b5 y5 Z& ]/ T- m+ O; W
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。
- m4 u3 O% G, v* `0 J9 ~; i. t* D; w, r/ @" N1 q$ R
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
; _% w* B* V  D3 D
& C! D7 ]2 r1 W" |& P1 E03 结论
7 G) c9 A: J! D* f% g' z! k本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16