gxchain / gxb-core

GXChain Blockchain implementation
https://www.gxchain.org
GNU General Public License v3.0
226 stars 78 forks source link

testnet 合约更新有问题 #189

Closed zonxin closed 4 years ago

zonxin commented 5 years ago

合约部署,然后更新之后合约就会调用失败

To Reproduce

  1. 部署一下代码:
    
    #include <graphenelib/asset.h>
    #include <graphenelib/contract.hpp>
    #include <graphenelib/dispatcher.hpp>
    #include <graphenelib/print.hpp>
    #include <graphenelib/types.h>

using namespace graphene;

class helloworld : public contract { public: helloworld(uint64_t id) : contract(id) { }

/// @abi action
void withdraw(int64_t amount)
{
    withdraw_asset(_self, 3200, 1, amount);
}

};

GRAPHENE_ABI(helloworld, (withdraw))


合约调用没有问题。

**Expected behavior**
修改`withdraw_asset`中的`3200` 为另一个值,比如`3105`, 重新部署合约。 此时再调用合约,则出现 `assertion failure with message: read` 错误。 (这个错误一般是修改了合约中的表之后,使用新的表结构读取旧的存储出现的错误)。

**测试环境**
gxc-smart-contract-ide v1.1.0 以及 cli_wallet v1.0.190521 @ Ubuntu 16.04 LTS 64-bit
用 cli_wallet v1.0.190321 可以部署,但是不能更新,更新会出现`insufficient fee: Insufficient Fee Paid` 错误(此时余额充足)

**其他**
其他一些不正常的现象表明(详细的我还要再验证一下), 可能是更新合约时, 节点间同步合约代码出现了问题, 导致了 #187 。
RootkitKiller commented 5 years ago

好的,谢谢您提供的信息,"修改合约更新逻辑"是近期测试网更新的功能,我去跟踪一下这个问题。

有两个问题需要再确定一下,

第一个问题:修改了3200为3105后,重新部署为一个新的合约,再调用新合约这个action触发的这个问题吗。 还是更新?

第二个问题:使用cli_wallet v1.0.190521 这个客户端,更新合约会报金额不足的错误吗,连接的接入点是哪个节点

zonxin commented 5 years ago

第一个问题, 部署为新的不报错,但是更新会报错, 只要是update_contract 即使从3105改成3200也会报错更新成功之后也会报错。 错误的报错和这个action之外的代码似乎也有点儿关系。 为了确定 #185 里面说的那个问题,我还部署了另外一个有点复杂的合约,也是withdraw 只有一句withdraw_asset。 具体现象错误现象不是每次都能复现,我还没总结出规律,这个如果问题一直没有解决的话,后面我再整理一下。

第二个问题,接入点是 cli_wallet -swss://testnet.gxchain.org --chain-id c2af3...

另, gxx 的版本号怎么看以及在那个库里? 使用 cli_wallet 中部署的合约时, 使用的是我自己编译的 gxx 某个 tag, 我给忘记了。不知道 gxx 的版本有没有影响。

RootkitKiller commented 5 years ago

测试网已经更新了版本,并修复了智能合约更新的逻辑。 testnet-1.0.190613