为什么我不能从 py-substrate-interface 发送外部信息?

问题描述

大家好,我正在通过 py-substrate-interface 提交一个外部文件,但由于某种原因,我在执行提到的 here 示例时不断收到错误消息。 我的代码如下:

    def send_funds(self,destination,amount):
        self.log.info("Sending {} DOT to {} ...".format(amount,destination.strip()))
        substrate = self.create_substrate_instance(self.node_ws_port[0])

        keypair = Keypair.create_from_mnemonic('level payment mom grape proof display cause engage erupt rain hair arm')
        print(keypair)

        call = substrate.compose_call(
            call_module='Balances',call_function='transfer',call_params={
                'dest': destination,'value': ceil(amount * DOT)
            }
        )

        try:
            extrinsic = substrate.create_signed_extrinsic(call=call,keypair=keypair)
        except Exception as e:
            print(e)

        try:
            receipt = substrate.submit_extrinsic(extrinsic,wait_for_inclusion=True)
            self.log.info("Extrinsic '{}' sent and included in block '{}'".format(receipt.extrinsic_hash,receipt.block_hash))
            self.log.info("{} DOT sent to address: {}".format(amount,destination))
        except SubstrateRequestException as e:
            self.log.error("Failed to send: {}".format(e))

在这里尝试了一个 try 和 except 块:

        try:
            extrinsic = substrate.create_signed_extrinsic(call=call,keypair=keypair)
        except Exception as e:
            print(e)

并且在运行此代码块时出现以下错误

No more bytes available (offset: 80 / length: 72)

我该如何解决这个问题。

解决方法

大多数情况下,RemainingScaleBytesNotEmptyException 被引发,它与类型注册表相关。在 Substrate 运行时(如 Kusama、Polkadot 等)中定义了特定类型,这些类型(尚未)在元数据中公开,因此库必须包含对这些类型原语的分解。

故障排除的一些提示:

,

在深入挖掘后发现问题与奇偶校验编解码器中的编码有关,您需要根据运行时间调整网络配置。 所以我改自:

    def create_substrate_instance(self,wsport):
        return SubstrateInterface(
                    url=self.rpc_url + wsport,ss58_format=42,type_registry_preset='kusama',)

到:

    def create_substrate_instance(self,type_registry_preset='substrate-node-template',)

它奏效了。