func (m *MessageRetriever) fetchPointers() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() mh, _ := multihash.FromB58String(m.node.Identity.Pretty()) peerOut := ipfs.FindPointersAsync(m.node.Routing.(*routing.IpfsDHT), ctx, mh, m.prefixLen) for p := range peerOut { if len(p.Addrs) > 0 && !m.db.OfflineMessages().Has(p.Addrs[0].String()) { // ipfs if len(p.Addrs[0].Protocols()) == 1 && p.Addrs[0].Protocols()[0].Code == 421 { go m.fetchIPFS(m.ctx, p.ID, p.Addrs[0]) } // https if len(p.Addrs[0].Protocols()) == 2 && p.Addrs[0].Protocols()[0].Code == 421 && p.Addrs[0].Protocols()[1].Code == 443 { enc, err := p.Addrs[0].ValueForProtocol(421) if err != nil { continue } mh, err := multihash.FromB58String(enc) if err != nil { continue } d, err := multihash.Decode(mh) if err != nil { continue } go m.fetchHTTPS(p.ID, string(d.Digest)) } m.db.OfflineMessages().Put(p.Addrs[0].String()) } } }
func createKey(mh multihash.Multihash, prefixLen int) multihash.Multihash { // Grab the first 8 bytes from the multihash digest m, _ := multihash.Decode(mh) prefix64 := binary.BigEndian.Uint64(m.Digest[:8]) // Convert to binary string bin := strconv.FormatUint(prefix64, 2) // Pad with leading zeros leadingZeros := 64 - len(bin) for i := 0; i < leadingZeros; i++ { bin = "0" + bin } // Grab the bits corresponding to the prefix length and convert to int intPrefix, _ := strconv.ParseUint(bin[:prefixLen], 2, 64) // Convert to 8 byte array bs := make([]byte, 8) binary.BigEndian.PutUint64(bs, intPrefix) // Hash the array hash := sha256.New() hash.Write(bs) md := hash.Sum(nil) // Encode as multihash keyHash, _ := multihash.Encode(md, multihash.SHA2_256) return keyHash }