大家好,我正在通过py衬底接口提交一个外部的,但由于某种原因,我在遵循这里提到的示例时不断出错。我的代码如下:
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:
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等(中,定义了特定的类型,这些类型尚未在元数据中公开,因此库必须包括对这些类型的基元的分解。
故障排除的一些提示:
-
使用了错误的类型注册表。大多数情况下,py衬底接口可以自动发现它与哪个链对话,因此只需指定
url
(https://github.com/polkascan/py-substrate-interface#autodiscover-模式(。但对于自定义运行时或开发属性,如type_registry_preset
和ss58_format
,需要手动设置 -
由于最近的运行时升级,本地类型注册表已过期,需要更新。这可以通过更新
py-scale-codec
包、运行substrate.reload_type_registry()
函数或始终使用带有use_remote_preset
的远程类型注册表来实现(请参阅https://github.com/polkascan/py-substrate-interface#keeping-键入最新注册表预设( -
在开发自定义运行时,可以将引入的类型添加到自定义JSON文件中,格式如下https://github.com/polkascan/py-scale-codec/blob/master/scalecodec/type_registry/rococo.json并在初始化期间提供(请参阅https://github.com/polkascan/py-substrate-interface#substrate-节点模板(
OK在进一步挖掘后发现问题与奇偶校验级编解码器中的编码有关,您需要根据运行时调整网络配置。所以我从:
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, wsport):
return SubstrateInterface(
url=self.rpc_url + wsport,
ss58_format=42,
type_registry_preset='substrate-node-template',
)
它奏效了。