我想像描述的这里那样创建一个子应用程序,但是让它在创建时接受参数:
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
InnerTxnBuilder.Execute({
**self.child.get_create_config(),
TxnField.application_args: [ Itob(42) ],
})在这种情况下,我必须使用Itob,因为application_args只接受Bytes值。
这已经很奇怪了,但无论如何都不起作用:在尝试调用create_child方法时,我得到了以下内容:
TransactionPool.Remember: transaction RIOKX6SHD2QC4CW3ZDMVKEWDP7DISFXEGOMQEZOVQQDY6OMMAN6Q:
logic eval error: err opcode executed. Details: pc=60, opcodes===\n' +
'bnz label4\n' +
'err\n' +
'label4:\n'这一点也没有帮助。我不明白我做错了什么。
那么,我如何正确地将params传递给一个子应用程序呢?
发布于 2022-11-25 17:41:50
首先,谢谢您试用Beaker,尽管它还处于早期开发阶段!请不要害怕通过GitHub存储库或阿尔戈兰不和谐服务器上的Beaker频道分享您对它的反馈。
详细说明ABI标准的ARC 4:
方法选择器必须是第一个应用程序调用参数(索引0),可作为txna ApplicationArgs 0从TEAL访问(除了使用零应用程序调用参数的裸应用程序调用)。
因此,您的TxnField.application_args应该如下所示,以便您的子合同知道创建时应该路由到哪个方法:
TxnField.application_args: [
Bytes(get_method_spec(ChildApp.create).get_selector()),
Itob(Int(42)),
],还请注意,数字42必须首先用Int包装,才能将其转换为teal类型。
在创建时,您可能希望从父元素传递一个参数给子元素。如果是这样的话,那么如果您的父级接收到一个名为abi.Uint64的my_int_arg参数,那么它看起来更像下面的内容
TxnField.application_args: [
Bytes(get_method_spec(ChildApp.create).get_selector()),
my_int_arg.encode(),
],您可以阅读更多有关ARC 4 这里的内容。
https://stackoverflow.com/questions/74568710
复制相似问题