..

随大流、踩大坑

背景描述

有一个新接口,api/tx/signers ,其中有个 Array 类型的数据结构。 该结构的定义如下

new_field = make_field('array', {type, attribute=false});

接口完成后,发布测试版本。 在和lib层进行调试的时候,遇到问题。


问题

  • lib层通过本地签名后, 通过该api把交易发送到底层服务,底层服务提示验签失败。

排查

刚开始怀疑是lib层签名的问题,lib层表示,本地签名验签没有问题。
如果去掉这个新加的array类型,双方都没有问题。
于是两边开始查对于 new_field 数据的签名是不是有问题。

跟踪代码流程后发现问题在底层服务。


解决

在上述新建 new_field 的时候, 为了方便直接 copy 其他的 Array 结构,并且还没有修改完。比如

old_field = make_field('array', {type, attribute=false});
new_field = make_field('array', {type, attribute=false});

其中 attributes=false 是关键,没有修改。 其实该字段表示 是否加入到签名列表中,导致在序列化签名数据的时候,把它忽略掉了,因此没有进入到签名序列。

bool should_include (bool signing_field) const
{
    return signing_field && some_operations;
}

for (auto const& e : es)
{
    if (should_include(signing_field))
    {
        signing_fields.insert (data);
    }
}

教训

直接 copy 后,没有修改完全,导致了不该出现的错误。


涉及到工作中的代码, 都以伪代码展示。