Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
148 0 0
02 DynamicAppCall 使用方法! h$ p( s( i& j
使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:% [$ k4 O; U+ D) [) m8 H  h
from ontology.interop.System.App import DynamicAppCall  P3 Q! s6 I) t) G* Z5 y8 C, K
2.1 DynamicAppCall API" R9 P4 z. J8 F5 E
DynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。4 T6 M# N; l2 H0 {1 M
合约 A 的代码如下:4 F  a' I1 O& {. j
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。
$ u) R) J& w$ X# V" d, @from ontology.interop.System.App import DynamicAppCall
7 E7 O% F0 T* g' yfrom ontology.interop.System.Runtime import Notify
  C, [% W+ U1 r- i: t# hdef Main(operation, args):3 f) r# @* w4 D0 U( o
    if operation == "DynamicCallContract":
( i& c9 \- V5 ]% u! |        if len(args) != 3:
* A4 g3 E; s* a  M* ^            return False
7 t# {4 i1 o/ a% D: L# k        revesedContractAddress = args[0]
) u# n) ^( S6 c! Z        opt = args[1], G1 M: `3 g4 I( o! u
        params = args[2]
" K; l; F- c: A, S- r$ m; F        return DynamicCallContract(revesedContractAddress, opt, params): a% {: q' c; r/ N0 Q4 X
    return False
3 K6 u+ V( r% s4 Z, z2 r$ N) M, U5 \def DynamicCallContract(revesedContractAddress, operation, params):
( S2 m. K0 {2 F1 Z, R    res = DynamicAppCall(revesedContractAddress, operation, [params])5 Q* e. j, {9 l8 u4 n2 k
    Notify(["the result of the DynamicCall is: ", res])# ?1 \+ J, g  ]# ?
    return res- j8 V6 e- [0 O& D6 O6 h: f9 s

2 f, E9 x9 |8 k" {' l合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。5 c4 ~2 |; d, o  s6 U1 s9 `
特别注意:需要先部署合约 B,获取合约 B 的合约哈希。+ g' y! M! @# Q3 \7 _
from ontology.interop.System.Runtime import Notify
) I& p" J- X$ M8 _def Main(operation, args):. u" W6 j& c2 j' R
    if operation == 'Hello':
3 w- I9 q6 ~9 `* p9 Z0 U        msg = args[0]( g+ `4 j0 X4 f% A' [0 E
        return Hello(msg)
* ~) D. J* _- o/ o# V/ E& P" S1 Q& A  n    return False
# `6 t- o* u; Y7 Bdef Hello(msg):% a8 C9 o4 O: G4 H: v8 e- t8 u
    return msg
+ q; O- G/ s4 r/ ^6 P5 Z5 r5 v此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。( W7 N" d/ G2 F0 `* a7 i
这样做的好处有:
" d0 K7 ?: `% E6 ~
4 R! _% P6 Y: ~0 @. H% I不用每次调用方法时,传入 B 合约的哈希反序;, ^" \3 ^# O% x+ O6 r

$ I+ W! K# z( n. M) y9 w! e% V$ x4 F对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。3 d  p3 ~5 c' n

8 R, L0 Q. f1 E, _4 U! M
$ W+ Q, |) O5 L0 m4 @3 |5 q03 SmartX 示例# k, L2 b2 V3 F  z6 P
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:
, ]  X4 A- h  S$ e/ \点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。
; G5 q4 G/ E1 L" S! ~" i1 I- N' t$ m9 {# s
04 总结- R9 h7 V1 e: Y3 v. z3 t' Z
这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:
- P; S( K0 [/ s: A1 J$ q静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。
+ ?2 P8 S0 ]# j( i4 ~% U静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16