为什么我不能从 py-substrate-interface 发送外部函数?
Why can't I send an extrinsic from py-substrate-interface?
大家好,我正在努力通过 py-substrate-interface, but for some reason I keep getting an error while following the sample mentioned 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)
我该如何解决这个问题。
OK 进一步挖掘后发现问题与 parity-scale codec 中的编码有关,您需要根据您的运行时调整网络配置。
所以我改变了:
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',
)
成功了。
大多数时候 RemainingScaleBytesNotEmptyException
被引发,它与类型注册表相关。在 Substrate 运行 时代(如 Kusama、Polkadot 等)定义了特定类型,这些类型(尚未)在元数据中公开,因此库必须包含对这些类型原语的分解。
一些故障排除提示:
使用了错误类型的注册表。大多数时候 py-substrate-interface 可以自动发现它与哪个链对话,所以只需要指定 url
(https://github.com/polkascan/py-substrate-interface#autodiscover-mode)。但自定义 运行 次或 type_registry_preset
和 ss58_format
等开发属性需要手动设置
由于最近 运行 一次升级,本地类型注册表已过时,需要更新。这可以通过更新 py-scale-codec
包、运行 substrate.reload_type_registry()
函数或始终使用带有 use_remote_preset
kwarg 的远程类型注册表来实现(参见 https://github.com/polkascan/py-substrate-interface#keeping-type-registry-presets-up-to-date)
开发自定义运行时,可以在自定义JSON文件中添加引入的类型,格式如https://github.com/polkascan/py-scale-codec/blob/master/scalecodec/type_registry/rococo.json and provided during init (See https://github.com/polkascan/py-substrate-interface#substrate-node-template)
大家好,我正在努力通过 py-substrate-interface, but for some reason I keep getting an error while following the sample mentioned 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)
我该如何解决这个问题。
OK 进一步挖掘后发现问题与 parity-scale codec 中的编码有关,您需要根据您的运行时调整网络配置。 所以我改变了:
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',
)
成功了。
大多数时候 RemainingScaleBytesNotEmptyException
被引发,它与类型注册表相关。在 Substrate 运行 时代(如 Kusama、Polkadot 等)定义了特定类型,这些类型(尚未)在元数据中公开,因此库必须包含对这些类型原语的分解。
一些故障排除提示:
使用了错误类型的注册表。大多数时候 py-substrate-interface 可以自动发现它与哪个链对话,所以只需要指定
url
(https://github.com/polkascan/py-substrate-interface#autodiscover-mode)。但自定义 运行 次或type_registry_preset
和ss58_format
等开发属性需要手动设置由于最近 运行 一次升级,本地类型注册表已过时,需要更新。这可以通过更新
py-scale-codec
包、运行substrate.reload_type_registry()
函数或始终使用带有use_remote_preset
kwarg 的远程类型注册表来实现(参见 https://github.com/polkascan/py-substrate-interface#keeping-type-registry-presets-up-to-date)开发自定义运行时,可以在自定义JSON文件中添加引入的类型,格式如https://github.com/polkascan/py-scale-codec/blob/master/scalecodec/type_registry/rococo.json and provided during init (See https://github.com/polkascan/py-substrate-interface#substrate-node-template)