首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Algorand中创建带有参数的子应用程序?

如何在Algorand中创建带有参数的子应用程序?
EN

Stack Overflow用户
提问于 2022-11-25 05:40:21
回答 1查看 43关注 0票数 1

我想像描述的这里那样创建一个子应用程序,但是让它在创建时接受参数:

代码语言:javascript
复制
    from pyteal import *
    from beaker import Application, ApplicationStateValue, decorators

    class ChildApp(Application):
      foo = ApplicationStateValue(
        stack_type=TealType.uint64,
      )
    
      @decorators.create
      def create(self, foo: abi.Uint64):
        return Seq(
          self.foo.set(foo.get()),
        )

    class ParentApp(Application):
      child: AppPrecompile = AppPrecompile(ChildApp())
      
      @decorators.external
      def create_child(self, *, output: abi.Uint64):
        return Seq(
          InnerTxnBuilder.Execute({
            **self.child.get_create_config(),
            # ???
          }),
          output.set(InnerTxn.created_application_id()),
        )

问题是-我如何把这些参数传递给一个孩子?

在我看来,唯一合适的是application_args

代码语言:javascript
复制
InnerTxnBuilder.Execute({
  **self.child.get_create_config(),
  TxnField.application_args: [ Itob(42) ],
})

在这种情况下,我必须使用Itob,因为application_args只接受Bytes值。

这已经很奇怪了,但无论如何都不起作用:在尝试调用create_child方法时,我得到了以下内容:

代码语言:javascript
复制
TransactionPool.Remember: transaction RIOKX6SHD2QC4CW3ZDMVKEWDP7DISFXEGOMQEZOVQQDY6OMMAN6Q: 
logic eval error: err opcode executed. Details: pc=60, opcodes===\n' +
        'bnz label4\n' +
        'err\n' +
        'label4:\n'

这一点也没有帮助。我不明白我做错了什么。

那么,我如何正确地将params传递给一个子应用程序呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-25 17:41:50

首先,谢谢您试用Beaker,尽管它还处于早期开发阶段!请不要害怕通过GitHub存储库或阿尔戈兰不和谐服务器上的Beaker频道分享您对它的反馈。

详细说明ABI标准的ARC 4:

方法选择器必须是第一个应用程序调用参数(索引0),可作为txna ApplicationArgs 0从TEAL访问(除了使用零应用程序调用参数的裸应用程序调用)。

因此,您的TxnField.application_args应该如下所示,以便您的子合同知道创建时应该路由到哪个方法:

代码语言:javascript
复制
TxnField.application_args: [
    Bytes(get_method_spec(ChildApp.create).get_selector()),
    Itob(Int(42)),
],

还请注意,数字42必须首先用Int包装,才能将其转换为teal类型。

在创建时,您可能希望从父元素传递一个参数给子元素。如果是这样的话,那么如果您的父级接收到一个名为abi.Uint64my_int_arg参数,那么它看起来更像下面的内容

代码语言:javascript
复制
TxnField.application_args: [
    Bytes(get_method_spec(ChildApp.create).get_selector()),
    my_int_arg.encode(),
],

您可以阅读更多有关ARC 4 这里的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74568710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档