WeBASE icon indicating copy to clipboard operation
WeBASE copied to clipboard

webase部署合约,发送交易时候报错“调用合约 constant 方法失败”

Open niqifan007 opened this issue 2 years ago • 2 comments

你好,看起来这段 Solidity 代码可能无法在 FISCO BCOS 3.1.0 和 WeBASE 3.0.1 环境中执行。

Issue 描述

  • 在调用一个智能合约方法时,使用 Solidity 0.8.11 编译的合约在 FISCO BCOS 3.1.0 和 WeBASE 3.0.1 环境中发送交易失败。
  • 在Remix同样版本的Solidity 0.8.11编译下部署并运行成功,符合结果。
  • 调用的合约方法为 getPriceD(string),用于获取荷兰式拍卖订单价格。报错信息为 "调用合约 constant 方法失败"。

复现步骤

  1. 使用 Webase IDE 在Solidity 0.8.11 的编译器编译上述合约代码。
  2. 在 FISCO BCOS 3.1.0 和 WeBASE 3.0.1 中部署该合约。
  3. 调用 getPriceD(string) 方法获取荷兰式拍卖订单价格,并传入正确的 _orderNumber 参数。

预期结果

合约方法能够正常返回订单价格。

实际结果

合约执行失败,报错信息为 "调用合约 constant 方法失败"。

复现环境

  • 操作系统及版本:Ubuntu20.04
  • 安装的区块链客户端/工具:FISCO BCOS 3.1.0 或 WeBASE 3.0.1
  • 使用的编译器版本:Solidity 0.8.11

额外信息

  • 合约的完整代码如下:
function getPriceD(string memory _orderNumber)
        public
        view
        returns (uint256)
    {
        uint256 timeElapsed = block.timestamp - orders[_orderNumber].timestamp;
        uint256 discount = (1 * timeElapsed * 1e17) / 1e18; // 0.1
        return orders[_orderNumber].price - discount;
    }
  • 报错截图或日志记录: a

niqifan007 avatar Apr 03 '23 10:04 niqifan007

此报错可能是合约函数的代码返回报错导致,可以把方法改为非constant方式并加上event打日志调试检查一下。

CodingCattwo avatar Jun 12 '23 14:06 CodingCattwo

需要以WeBASE 合约IDE为准,与Remix的最新编译特性会稍有差异

CodingCattwo avatar Jun 12 '23 14:06 CodingCattwo