Skip to content

Instantly share code, notes, and snippets.

@eduardonunesp
Last active September 22, 2021 14:15
Show Gist options
  • Save eduardonunesp/d6c717fe64212832720905b6d4332d8b to your computer and use it in GitHub Desktop.
Save eduardonunesp/d6c717fe64212832720905b6d4332d8b to your computer and use it in GitHub Desktop.
Basic HAMT (Hash array mapped trie) using golang module github.com/ipld/go-ipld-adl-hamt
package main
import (
"bytes"
"fmt"
"io"
"github.com/davecgh/go-spew/spew"
"github.com/ipfs/go-cid"
hamt "github.com/ipld/go-ipld-adl-hamt"
ipld "github.com/ipld/go-ipld-prime"
_ "github.com/ipld/go-ipld-prime/codec/dagcbor"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
"github.com/multiformats/go-multicodec"
)
func errCheck(err error) {
if err != nil {
panic(err)
}
}
func createMapNode() (ipld.Node, error) {
linkSystem := cidlink.DefaultLinkSystem()
linkProto := cidlink.LinkPrototype{Prefix: cid.Prefix{
Version: 1, // Usually '1'.
Codec: uint64(multicodec.DagCbor),
MhType: uint64(multicodec.Sha2_512),
MhLength: 64, // sha2-512 hash has a 64-byte sum.
}}
storage := make(map[ipld.Link][]byte)
linkSystem.StorageWriteOpener = func(lctx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) {
buf := bytes.Buffer{}
return &buf, func(lnk ipld.Link) error {
storage[lnk] = buf.Bytes()
return nil
}, nil
}
linkSystem.StorageReadOpener = func(_ ipld.LinkContext, lnk ipld.Link) (io.Reader, error) {
return bytes.NewReader(storage[lnk]), nil
}
builder := hamt.NewBuilder(hamt.Prototype{BitWidth: 3, BucketSize: 64}).
WithLinking(linkSystem, linkProto)
assembler, err := builder.BeginMap(0)
if err != nil {
return nil, err
}
const number = int64(20)
for i := int64(0); i < number; i++ {
s := fmt.Sprintf("%02d", i)
err := assembler.AssembleKey().AssignString(s)
if err != nil {
return nil, err
}
err = assembler.AssembleValue().AssignString(s)
if err != nil {
return nil, err
}
}
err = assembler.Finish()
if err != nil {
return nil, err
}
return hamt.Build(builder), nil
}
func main() {
node, err := createMapNode()
errCheck(err)
fmt.Println(spew.Sdump(node))
}
(*hamt.Node)(0xc0001aeb18)({
modeFilecoin: (bool) false,
_HashMapRoot: (hamt._HashMapRoot) {
hashAlg: (hamt._Int) {
x: (int64) 34
},
bucketSize: (hamt._Int) {
x: (int64) 64
},
hamt: (hamt._HashMapNode) {
_map: (hamt._Bytes) {
x: ([]uint8) (len=1 cap=1) {
00000000 ff |.|
}
},
data: (hamt._List__Element) {
x: ([]hamt._Element) (len=8 cap=8) {
(hamt._Element) {
x: (*hamt._Bucket)(0xc0001283c0)({
x: ([]hamt._BucketEntry) (len=1 cap=1) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 33 |03|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc0001199b0)(03)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc000128378)({
x: ([]hamt._BucketEntry) (len=5 cap=8) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 30 |00|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119910)(00)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 35 |05|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119a10)(05)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 38 |08|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119aa0)(08)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 34 |14|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119bc0)(14)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 38 |18|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119c80)(18)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc0001283a8)({
x: ([]hamt._BucketEntry) (len=2 cap=2) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 32 |02|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119980)(02)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 32 |12|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119b60)(12)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc000128390)({
x: ([]hamt._BucketEntry) (len=2 cap=2) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 31 |01|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119950)(01)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 31 |11|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119b30)(11)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc000128420)({
x: ([]hamt._BucketEntry) (len=1 cap=1) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 36 |16|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119c20)(16)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc0001283d8)({
x: ([]hamt._BucketEntry) (len=4 cap=4) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 34 |04|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc0001199e0)(04)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 36 |06|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119a40)(06)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 37 |07|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119a70)(07)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 39 |19|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119cb0)(19)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc000128408)({
x: ([]hamt._BucketEntry) (len=1 cap=1) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 33 |13|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119b90)(13)
}
}
}
})
},
(hamt._Element) {
x: (*hamt._Bucket)(0xc0001283f0)({
x: ([]hamt._BucketEntry) (len=4 cap=4) {
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 30 39 |09|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119ad0)(09)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 30 |10|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119b00)(10)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 35 |15|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119bf0)(15)
}
},
(hamt._BucketEntry) {
key: (hamt._Bytes) {
x: ([]uint8) (len=2 cap=8) {
00000000 31 37 |17|
}
},
value: (hamt._Any) {
x: (*hamt._String)(0xc000119c50)(17)
}
}
}
})
}
}
}
}
},
linkSystem: (ipld.LinkSystem) {
EncoderChooser: (func(ipld.LinkPrototype) (ipld.Encoder, error)) 0x12213c0,
DecoderChooser: (func(ipld.Link) (ipld.Decoder, error)) 0x1221520,
HasherChooser: (func(ipld.LinkPrototype) (hash.Hash, error)) 0x12216a0,
StorageWriteOpener: (ipld.BlockWriteOpener) 0x139a3c0,
StorageReadOpener: (ipld.BlockReadOpener) 0x139a4a0,
TrustedStorage: (bool) false,
NodeReifier: (ipld.NodeReifier) <nil>
},
linkPrototype: (cidlink.LinkPrototype) {
Prefix: (cid.Prefix) {
Version: (uint64) 1,
Codec: (uint64) 113,
MhType: (uint64) 19,
MhLength: (int) 64
}
}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment