Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
93 0 0
02 DynamicAppCall 使用方法7 Y/ t/ N, h/ n. ?! j) J1 K
使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:/ g: C( D, S$ Z* L' \- Z3 ^/ S& a
from ontology.interop.System.App import DynamicAppCall
# k8 c7 y$ B. c- D8 F( O2 T2.1 DynamicAppCall API
3 z2 C$ T5 L! c9 s, G9 \  LDynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。
% i$ K. s% j% q3 i/ ]合约 A 的代码如下:7 X* F/ b0 T, A0 z
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。( m+ O4 y: O/ M/ X8 h) k
from ontology.interop.System.App import DynamicAppCall! w- t# c$ ?  M+ Q" U
from ontology.interop.System.Runtime import Notify
3 |6 ~% }- w- {" A0 ^' L3 _def Main(operation, args):, ^3 K$ K  s+ k: Y4 H* [
    if operation == "DynamicCallContract":5 p# `& l4 H9 a
        if len(args) != 3:# u  v0 {$ ?/ Q+ v) ]9 T
            return False$ y% `( N! M9 X, U
        revesedContractAddress = args[0]
8 r/ ^& }. Q0 \5 t" n        opt = args[1]
1 }  \) e' G6 e* V6 g. \        params = args[2]6 f" L# J6 M/ B; c1 w
        return DynamicCallContract(revesedContractAddress, opt, params), L: _6 y& H1 e  z3 v/ U" t3 @
    return False- x6 g6 C5 }( E# I: c7 K2 Z
def DynamicCallContract(revesedContractAddress, operation, params):
. d' K' I0 I! Z    res = DynamicAppCall(revesedContractAddress, operation, [params])' q" Z% C. |# F7 P  e
    Notify(["the result of the DynamicCall is: ", res])5 o$ O2 N% Q, l
    return res9 Y4 _! X/ |5 p6 R4 F9 d' f; p

: F( f) _0 d, L! E/ ?+ X- j合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
5 F5 `0 W$ w# c* T3 e. g' F3 F  ^特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
# n7 p  K  ]! j0 W$ ^from ontology.interop.System.Runtime import Notify
/ m. k* P* J* W$ a9 a6 A/ x1 b5 edef Main(operation, args):
& d( H4 d4 b# r( ]    if operation == 'Hello':% u/ g% _+ Q. m: e, ]2 H& \( \0 i
        msg = args[0]
2 @! z( ~* H$ l( Z' c        return Hello(msg)
  x* O% W- }& q$ z8 M; f    return False
, r( r, }3 ?7 k# o% }% Ldef Hello(msg):5 p4 h9 Y% q+ ^3 H" c
    return msg
, X( F  [3 {9 Q9 G) m: N: O7 c此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
! H, V, X( |2 W  `这样做的好处有:
) B8 [: o0 ]. D2 D2 I/ `! Y/ x- y# T
不用每次调用方法时,传入 B 合约的哈希反序;
4 w( @& a& [1 w2 z* Y
4 f1 L( [2 f. N) K对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。
9 ~5 T; F; ^. P5 y) }% j5 w! S; t. c) ?6 N, y5 J; v

& ~( R2 ?& E# O03 SmartX 示例
2 T" m; B0 v+ m" B部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:7 R) t3 m6 v& m& U
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。
- g7 c# U4 U% v5 f: s
( ^- G6 ~3 B( t# x, ?8 d04 总结
2 ?5 c+ ]3 _4 D2 F8 w4 R) ~这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:* z  {& }9 W6 \" X
静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。; G/ _# [2 w2 ~2 F
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16