Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
175 0 0
02 DynamicAppCall 使用方法
* t. ~% h+ Z* @9 K/ u使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
% ?  Z7 k- _" b5 |/ I! h* }from ontology.interop.System.App import DynamicAppCall
2 s) t9 y6 G& ?; u0 |2.1 DynamicAppCall API8 L1 Q0 k" B/ T' C& |1 p" u
DynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。
) o# v; s/ W& f: U# e4 ~) @合约 A 的代码如下:
1 {2 q3 k2 H% L& [1 G' b3 ]特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。
5 E, |% A* O, A! i$ c. y3 S$ Cfrom ontology.interop.System.App import DynamicAppCall
, _1 f8 d5 S. r+ C5 p: d+ \from ontology.interop.System.Runtime import Notify
/ }6 Q" I1 {# n$ {) d% Edef Main(operation, args):% M, C( v6 s" `! ~, b) h5 P: d
    if operation == "DynamicCallContract":
! q" h0 R8 d3 ~; b1 v        if len(args) != 3:
* J" E! ~1 e5 @4 `! _3 e3 z            return False
# R( e: V) a9 Z: f        revesedContractAddress = args[0]# Z( o- s( X, G3 n* g* f
        opt = args[1]; q( U: G, s2 \, O4 W: H9 P
        params = args[2]* A7 l& @" x/ V
        return DynamicCallContract(revesedContractAddress, opt, params)" C6 t3 D8 V9 b7 i3 y; p
    return False
' i# J$ B$ Q. a0 tdef DynamicCallContract(revesedContractAddress, operation, params):. B/ [6 b8 C- A1 j
    res = DynamicAppCall(revesedContractAddress, operation, [params])
) |" Q4 V3 s# F    Notify(["the result of the DynamicCall is: ", res])% z, ~/ ]: ~4 Q- I3 ]
    return res
( L/ ?: ]( N1 f# |, F: A7 J' q
% [  b4 G& L0 N+ d2 \合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
1 r- c6 S; @! b0 j: w特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
( W7 u* T* b, v! Z# W6 l0 |- _1 Vfrom ontology.interop.System.Runtime import Notify
  \( S. }. v+ s: Ydef Main(operation, args):
4 j# k3 i% w2 f( [& F    if operation == 'Hello':
2 F, e; e' U8 L/ G1 E# K1 i& D# E        msg = args[0]
, n8 m2 \0 E' ^! v# m1 U3 G        return Hello(msg)" S1 q: t( m( R5 m: Z
    return False
- w- {  q; {: t1 ?9 p1 edef Hello(msg):4 g9 w) }6 T' D. b* |
    return msg) d! r9 C0 l, Q7 |  i
此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
5 r& B0 e# O) _这样做的好处有:0 u) p) e, o1 Y9 K0 [; V9 C

: _/ o8 s$ c! i不用每次调用方法时,传入 B 合约的哈希反序;
0 _+ n" d; z4 T( `! I; S7 {% D2 }& y3 t0 [7 Z3 n4 ?5 _. P
对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。
0 O" T5 _$ T- O1 a  w. d6 \" p8 Y$ F  ^' F3 L3 L* p) T

/ r1 f: e" B% K. S03 SmartX 示例* x( ~& ?( g* g2 h% H4 @2 f
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:9 P) @1 u$ [. L; l6 o" f4 e
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。5 @* e: U) F& H& d
8 G$ E2 U/ U/ w+ m0 h
04 总结
8 s$ p& _4 H& I1 v这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:* R4 `+ n; |) u
静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。) R2 c# A$ r& a. k- d$ W* G; Q
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16