Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
193 0 0
01 导语5 d& x& _% r, E2 o/ H' ~% G$ c* R' N
在上一期的技术视点中,我们介绍了合约原生 API,讲述了如何利用智能合约进行ONT / ONG 转账。本期我们将讨论如何通过 Upgrade API 来进行合约升级。合约升级共有2个 API,分别为 Destroy 和 Migrate。其用法如下:  t/ p8 i  h3 U' E

. W5 n& a& \7 Y  L下面我们具体讲述一下这两个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。跟以前的 API 讲解一样,在文章最后我们将给出这次讲解的视频示例。# g6 r6 d' Z$ W. c% O+ v
02 Upgrade API 使用方法
  x$ ~6 h& z( ]4 H使用这两个函数前需要引入。下面两条语句分别引入了 Migrate 和 Destroy 这两个函数。
5 e: P: r5 Q2 ?8 G; U4 Q+ ~2 dfrom ontology.interop.Ontology.Contract import Migrate
: N9 ]; ?8 Q4 K2 k! t/ F7 nfrom ontology.interop.System.Contract import Destroy
* ]+ o' Z# J# c/ |+ K& N% k1 {- d2.1 Destroy API
4 P. J7 p1 z0 x, mDestroy API 用于销毁合约,旧合约将会在链上被删除。下面是使用该 API 的示例代码。2 E2 }) z% v+ [" |) i
from ontology.interop.System.Runtime import Notify2 L/ V! X: i8 \
def Main(operation, args):9 r; {: B7 L! A) b; E
    if operation == "destroy_contract":
" g% j9 D' s% N6 T+ G        return destroy_contract()
( U9 z. z2 E2 T- k! _' W/ Q    return False2 H- I0 f4 K+ X6 `/ r3 V* X  r
def destroy_contract():" k3 L, i! w* H) M
    Destroy() # 调用destroy 销毁此合约, O0 v; g+ C4 s- s4 F6 j; s
    Notify(["The contract has been destoryed"])  H8 _7 o2 u! Y$ A# ^5 U
    return True- s/ H% c( \. E  P- V
在 SmartX 上可以看到该示例代码的运行结果:
) D% D, P7 l8 N9 h& t. J$ d将以上代码粘贴至 SmartX 编译并部署;" X+ W: V/ d) i$ R' O
再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;; }' N5 x8 n" C9 T

+ W- m' r3 N0 z, _; o运行 destroy_contract 函数销毁合约;4 v  R- W( ?3 \" b

2 m3 @$ u# y7 _4 N+ B再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。) `3 G+ D& }5 i8 ]
2.2  Migrate API
. T- N; E+ L& D2 ~9 e/ ~& LMigrate API 用于迁移合约, 旧合约将会被新合约取代,旧合约中的数据也将自动迁移到新合约。迁移数据量越大,迁移费用越高。迁移成功后,旧合约会被删除。
! q+ C: w& B& c1 D特别注意:合约中的资产不会被自动迁移,需要提前转走。否则该合约中的资产将无法取回,相当于被转入黑洞地址。
9 e. y2 @' l) b  s5 d, @$ V5 jMigrate 函数的传入参数列表如下:# j) d! x% Q+ ?! D( _" @) y' Q

! W* W' V. a9 Q4 l7 i  y同样,我们给出使用 Migrate 函数的合约示例代码:
' }; z( ^- ?# s- `from ontology.interop.System.Runtime import Notify, I* ?6 q1 |8 J& V% C  D
from ontology.libont import AddressFromVmCode
! E1 i, u) R7 F4 odef Main(operation, args):% I7 e0 f- A6 M2 [# ?6 ~
    if operation == "migrate_contract":- {9 F' E  d8 k3 t" E7 t, q
        if len(args) != 7:
' }  U* G" V7 l, e8 d            return False& q9 k! S$ N+ U% K  \: \
        avm_code = args[0]
' A0 K6 E+ v! `3 s' b; M        need_storage = args[1]
9 L, {! z+ _% u, ~9 }        name = args[2]
  U1 g; A8 p' S. `1 U& V        version = args[3]
1 g- s+ o$ V3 B9 T- N        author = args[4]  C9 ?" R6 O; n$ @& l# ~2 x
        email = args[5]
  g8 |3 n0 P: y* S' x) y9 a        description = args[6]: C7 l8 \9 S  }2 N2 t. r
        return migrate_contract(avm_code, need_storage, name, version, author, email, description): j& o  G2 \8 Z
    return False0 @4 K* h% G9 _& g0 V
def migrate_contract(avm_code, need_storage, name, version, author, email, description):0 J6 t0 U4 e% b0 ^2 b
    res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约' |! k* U; C+ Y  K
    if res:  U- E8 H0 u- ?
        Notify(4 R) F  u6 j& `* W' M4 U( f$ p
["Migrate successfully"])" x# c$ N! H, m1 W9 l3 b4 z
        new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址, D( i& c: O3 j  U, P
        Notify(new_contract_hash) # 打印出新合约地址& m2 u$ _2 W3 `3 X! g
        return True
+ g1 g8 `+ ?2 n7 _' _+ r    else:1 ^' W2 u3 H. m6 B8 t
        return False
4 ?3 r) @, n$ I. X# ^  E5 \- O在 SmartX 上可以看到该示例代码的运行结果:2 N3 i( w: q4 Y* E; \+ V6 n% U) j
将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:0 T& H) M* g. V7 p
a. 要确认 avm_code 在链上不存在,不然会报错;7 d- I' F) \# Y/ E6 |
b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。
  Q" Q- ]' ^, M3 Y' R- x) U1 S8 c. X; G
部署成功后,可以从控制台拿到新的合约哈希。该示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即为新的合约哈希。
& x$ `# d8 G4 r* y9 {0 Y
5 N0 q4 ~" b# A0 \. u" O03 结论5 E2 I) M, G: o6 }$ R& `1 [) u
本次技术视点中我们介绍了本体区块链的 Upgrade API,开发者可以用来进行合约升级。合约升级共有2个 API,其中 Destroy API 用于销毁合约,Migrate API 用于迁移合约。希望教程会对大家有帮助。下一期我们将介绍本体 Python 智能合约语法的 Static & Dynamic Call API,讲述如何在 Python 智能合约中进行静态调用和动态调用。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16