Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
170 0 0
02 DynamicAppCall 使用方法
7 e; F$ ~4 G( w, k% {使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:. h% h! e5 `) V5 W
from ontology.interop.System.App import DynamicAppCall% y: R# H& T$ b/ v/ A" ^, \
2.1 DynamicAppCall API
9 ]2 o6 Z- B. q0 T9 {- i  n1 Z( yDynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。; Y4 \# h* y, v
合约 A 的代码如下:3 \* N" m- O4 Q0 i8 O
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。& K! r$ y. \" g6 i  A, s
from ontology.interop.System.App import DynamicAppCall
) h7 z* c' m0 Y$ i) m& T0 Cfrom ontology.interop.System.Runtime import Notify* u' v9 o0 Y# N4 b. ~
def Main(operation, args):
" A8 |. V! n" m6 T    if operation == "DynamicCallContract":% y& I9 S8 [$ I5 x
        if len(args) != 3:
/ |% {) e# W" N$ K& y7 n            return False
" I3 y; ]* Y/ O/ T* t        revesedContractAddress = args[0]% y; I$ H5 J- s  V# k& ]3 p
        opt = args[1]
' d, g3 M& E5 r        params = args[2]
7 ~7 ~/ A0 E, J* q% j1 c9 ^        return DynamicCallContract(revesedContractAddress, opt, params)
# t: ~- O9 z" X    return False& G/ L9 n" i7 T% D) Q
def DynamicCallContract(revesedContractAddress, operation, params):& X# U+ A) B7 @( T
    res = DynamicAppCall(revesedContractAddress, operation, [params])( p% U# s$ z' O- |8 s: A
    Notify(["the result of the DynamicCall is: ", res])- f* w4 K- c  [- w5 R
    return res
6 @! e8 T7 V! P% v5 a- [7 M" j" r% L7 p' D) s2 P
合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
; w; B/ n, Y* C, ^# @特别注意:需要先部署合约 B,获取合约 B 的合约哈希。  n1 o! d/ D* y' l" i5 M# S1 @
from ontology.interop.System.Runtime import Notify
- w% E7 K& C' vdef Main(operation, args):
  y1 U& u4 h! G4 H$ W& O    if operation == 'Hello':* g# f+ P- _( s1 v  B9 l! k3 h
        msg = args[0]+ j8 T, k& q, k. ?
        return Hello(msg)" p" t5 o4 p, X
    return False1 o0 }% E7 J- L; C! g& A2 V
def Hello(msg):  C% V7 L+ a7 w5 @( Y8 ]
    return msg
8 W0 P. ^: V+ u% m- _! K; _) G8 n0 n此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
% h: K; A% t3 ~5 |9 I; o$ N, n/ h这样做的好处有:
3 P. t: q( d, h, c7 @6 w3 H. l. ]& g
不用每次调用方法时,传入 B 合约的哈希反序;
" g- B: C9 F/ n7 f$ @7 S  M) p0 {) G0 F
对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。' A' c- A8 x' O/ ~
0 I6 V: c! U4 M  ^. Z

7 x7 \3 W6 c8 G7 s: \* q" t7 C03 SmartX 示例' m& M% `) B6 e: _, A% P8 e9 i+ G1 I
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:* r2 g% z; ]- v
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。  V& ?& `( n: J9 H8 x
! O4 D  C' o+ P
04 总结+ P, \7 g, ?3 W8 k0 \& \5 X2 y
这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:
5 D* ~; c" D% z7 E  g静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。
3 Y" v& ]$ |; \静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16