Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
92 0 0
02 DynamicAppCall 使用方法' ]0 s% P, E4 t  g+ Q4 J* `; q
使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
. O; c8 ?6 A6 N1 V1 S6 E# U6 x1 @% bfrom ontology.interop.System.App import DynamicAppCall' ?+ D6 q1 g6 _2 r: K! L6 D
2.1 DynamicAppCall API
- B5 t* v+ S. TDynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。; V% d; W5 w' X7 u
合约 A 的代码如下:5 l+ H! J+ i1 P3 N2 D8 c& D" L
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。1 d" `+ B/ [4 O  [
from ontology.interop.System.App import DynamicAppCall
% g8 X& y8 {6 H+ `from ontology.interop.System.Runtime import Notify
+ v! d  w1 e  V& ~8 w% ndef Main(operation, args):
# x8 X  }9 x: c    if operation == "DynamicCallContract":
( i2 y2 Y% Q( l; @3 E' P) _        if len(args) != 3:
; t9 h. ^- C9 i% {            return False
0 E/ F( O0 ]" p- t        revesedContractAddress = args[0]
; a4 q/ f) H" i; Z/ G        opt = args[1]
& j) m  B+ e/ I. [% |; k; J        params = args[2]6 R! f) @2 e0 @) C% `, I) Z5 m6 c
        return DynamicCallContract(revesedContractAddress, opt, params)
$ Y: C: }; c( i0 U1 d6 N    return False
3 t# B1 g9 Z5 Wdef DynamicCallContract(revesedContractAddress, operation, params):
. M) A* f: u% @* y+ V: r    res = DynamicAppCall(revesedContractAddress, operation, [params])
) j8 h' ]5 O8 M; V  x% A    Notify(["the result of the DynamicCall is: ", res]): D, `* z9 u+ K2 r! f3 @2 Y
    return res# A0 \( o+ S8 }: s7 ~4 C. }# v
" s' i4 C: ]7 h
合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
' A# b; k# A3 W4 p特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
9 b; s' g8 y! o7 Z* w, ~from ontology.interop.System.Runtime import Notify
4 x% q" @. e9 S( a4 H" f& Fdef Main(operation, args):
1 o. ^* W  d  I* ~    if operation == 'Hello':, e% V: \5 n# K! |/ e$ I8 U8 f+ N
        msg = args[0]
2 o. ^' y8 y" ^2 A        return Hello(msg)
9 m* ^; R9 l" F: s( b) n    return False
; n  n/ v6 e3 c. s, I$ B6 Tdef Hello(msg):. u+ N  s1 h- A9 l
    return msg
5 }1 u/ U  }. N- y1 e1 I+ ^& x此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
  ^. t9 N! W  c# \这样做的好处有:8 Y" ]5 X0 ?6 W- N6 X' c, `

' h4 s0 K: w& c5 _不用每次调用方法时,传入 B 合约的哈希反序;
7 Q8 p$ E3 Q/ S' @& J! b" o1 o: m0 o, c$ U7 B+ H$ ^: ?
对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。. P8 N- F9 l9 {7 L  K6 L
6 J  j5 T8 W  v& u0 ?# @/ c5 s

1 Z, o; O+ y5 r8 Y  `03 SmartX 示例
, ]4 h) v1 {+ b; E+ `8 d, d. G部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:: ^* e7 p, H0 v! i/ Z7 ]) r
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。
+ S" ?7 f& I# ^) p9 j; v: A0 q9 h4 p9 K0 u
04 总结
* [0 u4 O+ {, y0 Q( S3 t6 D这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:
+ c3 S7 ~+ S" C% ~' ~静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。$ G# E8 o# |/ J* D& O$ Z
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16