Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
95 0 0
02 DynamicAppCall 使用方法
3 s8 Q8 \6 M/ d: l( B% g使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
) ^* v# k" W% \8 N% mfrom ontology.interop.System.App import DynamicAppCall- m# M* X6 [& x# P  ]& P
2.1 DynamicAppCall API
0 P; R9 Y: m# T; l' @2 ~DynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。7 c! B* r, g. k3 L
合约 A 的代码如下:
# }$ U( J& B" h3 c7 D& S特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。% A5 S) I' g. E% g9 i8 Y
from ontology.interop.System.App import DynamicAppCall) U' V( g7 i( ?' P) c) F4 i1 d
from ontology.interop.System.Runtime import Notify8 Q' T  E( {0 j' @6 }4 \; T  \
def Main(operation, args):
3 K# h! K3 T- ]( ]/ q0 j' o" k    if operation == "DynamicCallContract":4 u0 b9 g# K8 V- s# I* y( c
        if len(args) != 3:
6 [' b: Y8 I; V6 R' M. ^1 W1 Z            return False. Y% z' O9 r2 V! l( I! J& |7 h( d
        revesedContractAddress = args[0]! |7 \8 D) h9 I& h( a# |3 r
        opt = args[1]8 j$ V  N- y$ l) S* B8 \; V; O  o
        params = args[2]; |& l/ R6 c  L
        return DynamicCallContract(revesedContractAddress, opt, params)1 f) U& G! k0 l! d
    return False
4 ?. \3 E* H& \% wdef DynamicCallContract(revesedContractAddress, operation, params):
- V+ e3 j1 p4 Q0 w/ X. Q& [; F/ B    res = DynamicAppCall(revesedContractAddress, operation, [params])/ D+ v. w* y( p; L# `8 I* {
    Notify(["the result of the DynamicCall is: ", res])0 R, u4 |( B: N! e
    return res
. V' t0 t" r, ^3 `9 C- A
/ }/ L% a5 a7 k+ |7 r: Z. ^合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
% W5 ?: u0 Y4 Q% J% f/ ]8 l# w特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
& @) r8 H9 _6 efrom ontology.interop.System.Runtime import Notify/ k4 ^- P1 x( p/ X' z. R
def Main(operation, args):5 g) N: V5 |- r( B8 Z; F
    if operation == 'Hello':2 O0 Y9 K2 D9 P  w0 E! u
        msg = args[0]' Q8 V  s% K) o# f
        return Hello(msg)$ ^! y& x! @, O, z  e! |7 ^! }' \
    return False  ~& l3 ~3 ]% q, B( B5 ~
def Hello(msg):
) R; }4 M+ h& {  J) p    return msg
" n# n* n/ ^: B" P2 D$ G% H此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。
% m2 V3 ^- v9 ?! u# T这样做的好处有:6 u. i+ r  a% h7 t  e" E# q$ b
$ t! g, F4 R, R# B5 `
不用每次调用方法时,传入 B 合约的哈希反序;& ]$ K/ t. y- K

$ D8 W/ m: t% T( H, k8 Y/ z对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。
2 r- I8 V6 q4 K) |4 D! U6 z) R/ x8 m$ c& S. g* c
# V1 x. R8 w) }; _- k' @( [) _
03 SmartX 示例
8 L. Z' |; [7 H8 A部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:+ o% R( ^7 C7 w7 j  C+ g
点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。: m! }- x) _* E
" Z) v: S) a: o$ M. o1 E- F$ V
04 总结
) x, \. k# X' L3 q5 Q这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:1 r5 P! r2 W& ]0 d. ~# q6 n
静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。8 L9 ?( M) p: \, w& D1 f
静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16