调用智能合约创建Hedera代币时遇INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE错误
解决Hedera Token创建时的INVALID_FULL_PREFIX_SIGNATURE_FOR_PRECOMPILE错误
错误原因
调用HederaTokenService预编译合约创建代币时,必须明确指定代币的核心密钥(如管理员密钥),否则预编译合约无法验证调用者的签名权限,触发该错误。你的代码中keys数组为空,未设置任何代币密钥,这是核心问题。
修复后的代码
uint8 public constant NUM_DECIMALS = 6; function myCreateToken() public payable { // 创建管理员密钥,将调用者设为代币管理员 IHederaTokenService.TokenKey[] memory keys = new IHederaTokenService.TokenKey[](1); keys[0] = IHederaTokenService.TokenKey({ keyType: IHederaTokenService.KeyType.ADMIN, key: msg.sender }); IHederaTokenService.Expiry memory expiry = IHederaTokenService.Expiry( 0, msg.sender, 8000000 ); IHederaTokenService.HederaToken memory token = IHederaTokenService .HederaToken( "MyToken", "MTT", msg.sender, "", true, 10000000, false, keys, expiry ); (int responseCode, ) = HederaTokenService.createFungibleToken( token, 10000000, NUM_DECIMALS ); require(responseCode == HederaResponseCodes.SUCCESS, "Token creation failed"); }
关键修改说明
- 添加管理员TokenKey:明确将
msg.sender设置为代币的管理员密钥,让预编译合约能验证调用者的签名权限,直接解决签名错误。 - 完善错误提示:在
require中增加错误信息,便于调试时快速定位问题。 - 确保常量定义:显式定义
NUM_DECIMALS,避免编译错误。
额外注意事项
- 确保调用者账户拥有足够HBAR,用于支付代币创建手续费和自动续费的初始金额(8000000 tinybar = 0.008 HBAR)。
- 测试环境下需确保账户已领取测试HBAR。
- 自动续费账户(此处为
msg.sender)需持续保持足够HBAR,否则代币会因续费失败过期。
内容的提问来源于stack exchange,提问作者Pathorn Teng
相关产品推荐
相关产品推荐

