# 开发常见错误

在开发过程中,可能会遇到多种多样的错误,所以此篇教程将会长期收录遇到的各种问题(包括合约开发常见的以及C++开发相关的问题)。

# 1. VsCode 头文件错误

错误原因:多是由于源码编译没有成功,导致合约依赖的头文件没有添加到环境变量。

解决办法:可以在vscode软件中手动设置,.vscode目录 --> c_cpp_properties.json文件编辑

"includePath": [
    "${workspaceFolder}/**",
    "/Users/zhaoxiangfei/code/gxb-core/contracts",  //替换为自己的合约头文件路径
    "/Users/zhaoxiangfei/code/gxb-core/externals/magic_get/include" //替换为自己的路径
],

# 2. 生成的abi文件缺少项

错误原因:可能是由于没有在给外部调用的action或者table上,没有添加注释,导致gxx工具扫描生成abi文件缺失。(abi文件解析点击这里

解决办法:在action和table上添加注释,示例如下:

// 调用不带附加资产的action
// @abi action
void hi(std::string user){
	...
}

// 调用带附加资产的action
// @abi action
// @abi payable
void issue(std::string pubkey, uint64_t number){
	...
}

// 多索引table
//@abi table packet i64
struct packet {
    ...
};

# 3. 操作多索引表时失败(增、改)

错误原因:可能传递的lambda表达式的参数不是对象的引用,导致修改的只是一份对象的拷贝。

解决办法:将lambda表达式的参数修改为对象的引用。

offers.emplace(0, [&](auto &o) {
    o.id = offers.available_primary_key();;
    ...
});

# 4. 调用合约中的某个action出错

错误原因:除了检查action本身逻辑原因之外,仍然需要检查abi文件中的错误以及GRAPHENE_ABI的错误

解决办法:查看abi中是否存在该action和GRAPHENE_ABI宏是否包含该action

// 如果不包含某个action,合约依然可以部署成功,只是在调用时,合约会无法处理调用的action
GRAPHENE_ABI(hello,(hi))

# 5. 使用gxx工具编译,“未发现头文件”

错误原因:同问题1,由于源码编译没有成功或者执行sudo make install没有成功,导致头文件没有拷贝到系统相关目录。

解决办法:正确编译代码,源码编译教程点击这里 (opens new window),如果编译源码出现问题,请在源码github页面提交issues。

# 6. 更新合约造成table序列化错误

错误原因:更新合约删除或修改table中的字段,导致序列化错误

解决办法:更新合约不要修改原有table,添加新的table需要保证字段顺序与序列化顺序一致。

struct packet {
    uint64_t                issuer;
    std::string             pub_key;
    contract_asset          total_amount;
    uint32_t                number;
    vector<int64_t>         subpackets;

    uint64_t primary_key() const { return issuer; }
    
     //序列化顺序需要与字段定义顺序保持一致
    GRAPHENE_SERIALIZE(packet, (issuer)(pub_key)(total_amount)(number)(subpackets))
};