Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

听说Python的广告刷爆了你的朋友圈

zmhg799417
98 0 0
02 DynamicAppCall 使用方法  U. r# v9 H( ]# h( u
使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
7 |8 p8 |+ N0 @% N0 Tfrom ontology.interop.System.App import DynamicAppCall
2 @& `- [0 E1 n2.1 DynamicAppCall API
1 E8 R& ^+ }/ ~5 j, wDynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。
6 I5 y4 p9 ]7 l4 V, O- Y4 Q合约 A 的代码如下:$ ?# n# z9 z8 I2 j0 c6 ^5 S
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。/ z5 y( M) E& W" \6 K
from ontology.interop.System.App import DynamicAppCall
$ c7 u+ A2 O- g$ Xfrom ontology.interop.System.Runtime import Notify
* _( _( y: c$ d% k6 M/ \) odef Main(operation, args):' ^7 [8 R  Q; i8 D
    if operation == "DynamicCallContract":
$ w6 z7 U8 j) {" l4 o7 B9 `6 b        if len(args) != 3:
$ Q6 g. O7 W& @# \7 P0 O( ^' n. ~            return False
( O# \5 ?4 D: k) u* g$ c6 Z# K) a8 s        revesedContractAddress = args[0]- [& Y0 W+ k7 q0 Z$ H3 ^8 |' u0 ]
        opt = args[1]
: g2 D0 U- p* A, v4 M        params = args[2]( d2 I- s) n: ~
        return DynamicCallContract(revesedContractAddress, opt, params)$ ]% u3 E" P7 {; g- Z. T; A# L
    return False% u& _1 f- D! P! n- L
def DynamicCallContract(revesedContractAddress, operation, params):+ X, P3 R& q9 E  Y* `8 X6 R
    res = DynamicAppCall(revesedContractAddress, operation, [params])# `0 q8 l7 n& E/ }
    Notify(["the result of the DynamicCall is: ", res])
; w7 p9 Q5 \# m8 T* U' [2 g    return res
0 j! x& n. |; n$ L  ~  q5 T4 u
合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
' H+ O2 g* Z; y: m特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
$ G; p0 y# d! \; J2 I, t0 U" efrom ontology.interop.System.Runtime import Notify
$ H9 z% O6 {4 [/ a- ]def Main(operation, args):
' G7 V  o6 C9 |! c9 d    if operation == 'Hello':
# D# O, B4 f9 G" ^, g2 Z) p        msg = args[0]
! i- j) M( J% }! I! @1 d5 R        return Hello(msg)! J: F+ u/ K7 r
    return False
8 R2 o; O) ?2 }def Hello(msg):
9 y8 l8 ^9 o0 }1 {8 i* T    return msg9 r* x4 G" J1 T( N" D# g0 M
此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
3 x, c5 G: p3 M. G* D  ?  \& S) u这样做的好处有:. G4 |( i% [% H" E! U6 ]% Q$ y0 t5 X

! o. V! U' w8 b9 h$ g不用每次调用方法时,传入 B 合约的哈希反序;- T# ?; @" |# |6 n1 A# `
; P5 p+ `4 k1 v8 D: _/ S" o& z
对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。; T. A5 {5 u1 s& w- ?7 ]
; W* s5 P0 `3 Z% s8 H
, a) G+ x; m* E: _
03 SmartX 示例2 `; |8 `* s) S3 i: ]1 b
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:
* K4 l" m% n, V点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。
# c9 G+ y2 s, m8 |+ S8 w
+ i4 @3 i. A+ C8 h$ M, S04 总结
+ U2 J$ g) s$ e- d2 U这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:
3 t' }% @6 J( J静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。- ]& C! w# D# i$ q4 Q1 F0 e: H
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16