Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
116 0 0
02 DynamicAppCall 使用方法
' f9 G# l  Z& G$ Z6 `使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
; z. k1 ]; P" C$ u" D! F$ r% I7 tfrom ontology.interop.System.App import DynamicAppCall
- w- G$ G9 |7 C5 q( r* x" e0 Z2.1 DynamicAppCall API: w+ B5 b" Z% d% u# e6 N6 w
DynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。3 ?2 P# X- w9 k8 q
合约 A 的代码如下:
9 p8 \0 H! X. d: M& W特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。
4 g0 q6 J5 p4 i3 vfrom ontology.interop.System.App import DynamicAppCall
  X3 _. Z  l' ~from ontology.interop.System.Runtime import Notify
, S( E$ }6 V* s7 J# t3 g: q2 p; Pdef Main(operation, args):
0 ?) V9 V0 P! v5 B3 A8 g/ h0 G+ Y    if operation == "DynamicCallContract":) `' E0 N. n  {% B' }0 Z
        if len(args) != 3:
! B+ h- |" E9 \3 w" k; }" |0 |$ ^            return False) Q: ^  k- v+ @3 o+ a
        revesedContractAddress = args[0]
. O' B: L9 G! E* |$ u5 ]        opt = args[1]% f# C4 z, d$ L7 }+ L1 U
        params = args[2]
2 M1 H- h! w8 O. a9 ~4 T& h        return DynamicCallContract(revesedContractAddress, opt, params)
; \3 V' x( _1 ]( l8 I  v    return False# B9 D9 n  T8 g% `" Q
def DynamicCallContract(revesedContractAddress, operation, params):+ {1 ?& v* ^) M7 y1 b1 G
    res = DynamicAppCall(revesedContractAddress, operation, [params])
7 L* ~3 U# r0 \    Notify(["the result of the DynamicCall is: ", res])
% [/ p) k% L: e; H  w    return res+ y  d9 t7 c: y1 [

7 l! ]+ X9 a6 T1 r. W. E. ?合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
% `$ z, w4 I. ^4 x5 K+ ^特别注意:需要先部署合约 B,获取合约 B 的合约哈希。9 q( V( T; c3 ]7 A# L% p+ C( L
from ontology.interop.System.Runtime import Notify$ F4 D: R, O* s) w1 q
def Main(operation, args):
$ Z. N. i: C$ p: l9 c0 }    if operation == 'Hello':% Q" }5 z1 o, O2 M( B9 k
        msg = args[0]
  o/ k7 N. E- c0 S4 O8 R        return Hello(msg). b2 r8 p' F3 m1 ?7 m) P
    return False
* H. f, u# l. u. ~def Hello(msg):7 P3 Q; f7 R5 s; b3 J; b' i9 o) L
    return msg
. ~0 R3 \7 ]9 c# ~% ]! D. Q此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。6 x; r/ g1 \) @/ G  _
这样做的好处有:& W( H/ V$ U' g# W& M
2 g! j9 l, a( v2 s4 t
不用每次调用方法时,传入 B 合约的哈希反序;1 b" v) p* U; \  T* S) n

! I5 l+ P: [' k; s  d3 O( ^! N对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。
- \  A" _6 C* w$ Q* v9 i% n4 _& h5 b! C

- y1 d! ^6 B' o" e5 f03 SmartX 示例
4 S" [) i9 W3 M0 {$ U& N  P4 Y部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:8 |+ H9 z! y  _$ Q5 z( n7 l
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。% ^9 h$ T0 ~$ e

+ A8 W" o+ w" F) w" X. K+ [6 ]04 总结
! ~' N  a: M" E( ^/ q这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:
% e" F9 C! S2 q% C静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。% v2 \; g8 U3 m" |# r
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16