ipfs-ipns公私鑰簽名算法

  1. 生成公鑰私鑰對

  2. 公鑰生成ID 私鑰簽名。

    解析函數(shù)分析 :resolver.Resolve
    namesys->resolve ==> base->resolve ==> namesys->resolveOnce
    routing->GetValue ==> dht->GetValue (尋找附件節(jié)點查詢數(shù)據(jù)) ==》 dht ->PutValue(回寫最優(yōu)結(jié)果到其它節(jié)點)

    IPNS 私鑰簽名算法:
    IpnsEntry 結(jié)構(gòu)體中 Signature簽名字段構(gòu)成
    私鑰+消息內(nèi)容構(gòu)成簽名
    例如 out := ed25519.Sign(k.sk, msg)
    驗證消息用公鑰驗證和解密消息內(nèi)容

搜索附件節(jié)點后,選擇最新的記錄

func (v Validator) Select(k string, vals [][]byte) (int, error) {
    var recs []*pb.IpnsEntry
    for _, v := range vals {
        e := new(pb.IpnsEntry)
        if err := proto.Unmarshal(v, e); err != nil {
            return -1, err
        }
        recs = append(recs, e)
    }

    return selectRecord(recs, vals)
}

func selectRecord(recs []*pb.IpnsEntry, vals [][]byte) (int, error) {
    switch len(recs) {
    case 0:
        return -1, errors.New("no usable records in given set")
    case 1:
        return 0, nil
    }

    var i int
    for j := 1; j < len(recs); j++ {
        cmp, err := Compare(recs[i], recs[j])
        if err != nil {
            return -1, err
        }
        if cmp == 0 {
            cmp = bytes.Compare(vals[i], vals[j])
        }
        if cmp < 0 {
            i = j
        }
    }

    return i, nil
}

// Compare compares two IPNS entries. It returns:
//
// * -1 if a is older than b
// * 0 if a and b cannot be ordered (this doesn't mean that they are equal)
// * +1 if a is newer than b
//
// It returns an error when either a or b are malformed.
//
// NOTE: It *does not* validate the records, the caller is responsible for calling
// `Validate` first.
//
// NOTE: If a and b cannot be ordered by this function, you can determine their
// order by comparing their serialized byte representations (using
// `bytes.Compare`). You must do this if you are implementing a libp2p record
// validator (or you can just use the one provided for you by this package).
func Compare(a, b *pb.IpnsEntry) (int, error) {
    as := a.GetSequence()
    bs := b.GetSequence()

    if as > bs {
        return 1, nil
    } else if as < bs {
        return -1, nil
    }

    at, err := u.ParseRFC3339(string(a.GetValidity()))
    if err != nil {
        return 0, err
    }

    bt, err := u.ParseRFC3339(string(b.GetValidity()))
    if err != nil {
        return 0, err
    }

    if at.After(bt) {
        return 1, nil
    } else if bt.After(at) {
        return -1, nil
    }

    return 0, nil
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容