开发者社区 问答 正文

联盟链上智能合约 验证地址是否 合约地址 报 10304 , debug 模式却就正常

联盟链上智能合约 验证地址是否 合约地址 报 10304 , debug 模式却就正常,代码 :

pragma solidity ^0.4.19;

contract Asset {

   function isContract(identity account) internal view returns (bool) {

        uint256 size;

        assembly { size := extcodesize(account) }
        if( size > 0 ){
            return true;
        }else{
            return false;
        }
    }
    function test(identity aaa) view public returns  (bool){
        return isContract(aaa);
    }

}

展开
收起
1498318261021372 2021-09-28 13:31:17 977 分享
分享
版权
来自: 蚂蚁链|开放联盟链 举报
阿里云 AI 助理回答

遇到 Solidity 智能合约中调用 extcodesize 报错 10304 的情况,这通常意味着在访问合约地址的代码大小时出现了问题。错误码 10304 在不同的区块链环境中可能有不同的含义,但根据描述,它可能与权限、气体限制或执行环境有关。

你的智能合约代码试图通过低级汇编(assembly)来检查一个给定地址是否为合约地址,即通过查询该地址上是否有代码部署(extcodesize 返回非零值表示有合约)。在某些联盟链或特定配置的以太坊环境中,直接使用这种方式可能会受到限制,尤其是在涉及到跨合约调用或者读取其他账户状态的时候。

针对你提到的问题,这里有几个可能的解决方案和调试建议:

  1. 气体限制:确保在调用 test 函数时提供了足够的气体。虽然这是一个 view 函数,理论上不消耗气体,但在某些情况下,底层操作可能需要一定的气体。

  2. 环境差异:确认智能合约运行的区块链环境(如Quorum、FISCO BCOS等联盟链)是否对这种底层操作有限制或特殊要求。有些联盟链为了安全或性能考虑,可能对某些 EVM 操作码进行了修改或限制。

  3. 权限管理:检查调用合约的账户是否有足够的权限去查询其他合约或地址的状态。在一些联盟链设置中,可能存在账户或合约级别的访问控制。

  4. 升级Solidity版本:虽然你指定了 ^0.4.19,但考虑到 Solidity 的发展,尝试升级到更高版本(如果环境支持),并查看是否有更安全或推荐的方式来实现相同功能。新版本可能已经优化了这类操作的处理方式。

  5. 使用标准方法:如果目标区块链环境支持,可以考虑使用更高级别的 Solidity 函数来替代底层 assembly 操作。例如,虽然 Solidity 直接没有提供判断是否为合约地址的标准函数,但可以通过尝试调用某个通用的无害函数(如 ERC165 的 supportsInterface)并捕获异常来间接判断,尽管这种方法不是最优且有其局限性。

  6. 详细日志:在 debug 模式下工作正常,说明问题可能与环境配置或外部条件有关。尝试增加详细的日志记录,特别是关于交易上下文的信息,以便更好地理解在非 debug 模式下失败的具体原因。

  7. 咨询区块链平台文档:查阅你所使用的联盟链平台的官方文档,了解是否有已知的限制或推荐的做法来处理此类验证。

如果以上建议不能解决问题,建议联系具体的联盟链技术支持或开发者社区,获取更针对性的帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等