Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

zmhg799417
94 0 0
02 DynamicAppCall 使用方法
* f" {/ O( l$ x! v) w使用 DynamicAppCall 函数前需要将其引入。这可以通过下面的语句实现:
4 x( }0 v/ J/ Z. V$ W+ |from ontology.interop.System.App import DynamicAppCall
4 `4 c" v; d) V% r2.1 DynamicAppCall API# \/ f- ?- E( z* A/ A2 o
DynamicAppCall API 有三个参数,分别对应被调用合约的哈希反序,被调用合约方法和被调用方法所需要的参数。我们准备两个智能合约,合约 A 与合约 B。接下来我们通过合约 A 来动态调用合约 B 的功能函数。+ Y2 F9 [% _, \. F0 `1 [6 R
合约 A 的代码如下:5 w: p% j: h! I0 K0 \# f( b
特别注意:获取合约 B 的合约哈希后,需要将其反序后再作为调用合约 A 时的参数传入。
; z7 \! h* l8 V* L, l' _from ontology.interop.System.App import DynamicAppCall4 ^& N" {5 o0 h. j; }3 \: v
from ontology.interop.System.Runtime import Notify
! W2 @0 c, J4 f; s( ^def Main(operation, args):
1 w, j9 ^, |! `  j. J( L    if operation == "DynamicCallContract":
+ q' ?! W; P- i        if len(args) != 3:/ \' N* W6 t0 k0 g% x; g4 p- G7 A$ @- N# k
            return False
8 l$ X; Q! I2 C/ r  H' n2 n        revesedContractAddress = args[0]
* I# F+ H, `. s7 y5 Z0 V9 F" m( |        opt = args[1]3 j% t# t5 E8 \" D2 S* @  x
        params = args[2]' E; N3 H8 x& Q% ~$ a) B
        return DynamicCallContract(revesedContractAddress, opt, params)3 v' i3 F# v4 ]. l9 g9 P3 b' u+ T
    return False+ G8 q* U# b) E4 Y1 ^, o: O
def DynamicCallContract(revesedContractAddress, operation, params):  }8 H- E- E/ T# |. F1 [
    res = DynamicAppCall(revesedContractAddress, operation, [params])# }3 G( |' V6 m! H" A4 x
    Notify(["the result of the DynamicCall is: ", res])
3 N- g/ x6 p1 W; ~8 k; @5 ?- C8 ~; @/ Z    return res% H0 U" n. {. Y" Y& R* O+ H# @
3 I0 C. K; x/ M9 Q# n+ L
合约 B。也是最简单的 Hello World 合约。合约 A 将调用合约 B 中的 Hello 函数。
/ W1 X  c7 E# ^0 K( f特别注意:需要先部署合约 B,获取合约 B 的合约哈希。
. |' J/ a+ @- P* a9 afrom ontology.interop.System.Runtime import Notify
- {! }; M% d$ b, v- P6 idef Main(operation, args):3 ?* g! y0 i$ J* }4 A4 b* _8 p! @" y
    if operation == 'Hello':! s, g' k: b# _
        msg = args[0]
  S$ m5 Y3 S% c; [        return Hello(msg)0 V$ l& R- o/ A4 A8 [6 C8 J
    return False9 E: r/ D5 _$ j- A: X) _) E
def Hello(msg):- @( k" E' {( k' L
    return msg
: p7 x' M) [& `4 ]此外,我们推荐在合约 A 中预留接口,对 B 合约哈希的反序进行存储 (注意存储时,value 的类型应为 bytearray)。当我们通过合约 A 调用合约 B 时,可将被存储的 B 合约哈希取出填充到 DynamicAppCall() 中的第一个参数位置。+ W; y- ~, r0 g. C, i1 @
这样做的好处有:
2 H3 E+ i. @/ j: }
) V- _( Z: Y! M& }! @/ g) j3 w* T不用每次调用方法时,传入 B 合约的哈希反序;" Z) m. _1 t1 X9 ^; D- ^
& e  a0 i% o1 l
对于函数调用者而言,合约 B 的哈希是隐形的,可以预先在合约 A 中方便地进行设置,进而保留了动态调用的灵活性,同时也包含了 RegisterAppCall 接口传参的简洁性。2 M; v1 X% e. ?9 N" p

/ i* J2 \0 Z' x9 {' u7 q# Q, w7 Y1 r9 Z! _( P, u+ `9 L+ v. w
03 SmartX 示例% q9 x( [' L4 i% i
部署合约 B,得到其合约哈希为028de32923bcc21e8a5485e4b0e81eff2d9ba08e;点击工具栏使用Hex String (Big-endian/Little-endian),将合约哈希反序得到8ea09b2dff1ee8b0e485548a1ec2bc2329e38d02;部署合约 A;在 SmartX 上选中合约 A 中的 DynamicCallContract 方法,并设置参数:
# q$ L4 L1 Z' K- f点击「运行预执行」,返回68656c6c6f20776f726c64 (Hello World 十六进制字符串), 调用成功。1 ~- Q8 j" i# V- J% m
1 k* p$ @. }! ]& ?1 Q1 c
04 总结. B" J8 \: U2 v% }2 }
这两期我们分别介绍了静态合约调用与动态合约调用。可以总结,二者的主要区别在于:! ~- c5 |! b. r' Y: l5 N
静态合约调用需要写死合约地址(作为参数写入 RegisterAppCall),也就是说静态调用只能调用某个特定合约。而动态合约调用可以将合约地址作为参数传入,意味着可以没有限制地调用任意非 Native 合约。
8 f- Q. @' d! c8 i8 V/ {静态合约调用合约地址无需反序,而动态调用合约地址需要反序。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16