ipld: improve schema

- use generic multicodec IDs
- serialize IPLD wire representations, not user schemas
This commit is contained in:
Richard Patel 2023-03-09 04:15:09 +00:00
parent e962765f76
commit 8f27f10358
10 changed files with 284 additions and 118 deletions

View File

@ -15,6 +15,7 @@ import (
"k8s.io/klog/v2"
// Load in instruction pretty-printing
_ "github.com/gagliardetto/solana-go/programs/system"
_ "github.com/gagliardetto/solana-go/programs/vote"
)

View File

@ -22,7 +22,7 @@ then
go fmt ./pkg/gossip/schema.go
fi
# go install github.com/ipld/go-ipldtool/cmd/ipldtool@latest
# go install github.com/ipld/go-ipldtool/cmd/ipld@latest
# (requires "$(go env GOPATH)"/bin in $PATH)
if command -v ipld &> /dev/null
then

6
go.mod
View File

@ -66,7 +66,7 @@ require (
github.com/dfuse-io/logging v0.0.0-20210109005628-b97a57253f70 // indirect
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 // indirect
github.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/fatih/color v1.14.1 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
github.com/fsnotify/fsnotify v1.5.4 // indirect
github.com/gagliardetto/treeout v0.1.4 // indirect
@ -130,12 +130,12 @@ require (
github.com/prometheus/procfs v0.8.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/streamingfast/logging v0.0.0-20220813175024-b4fbb0e893df // indirect
github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c // indirect
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 // indirect
github.com/twmb/franz-go/pkg/kmsg v1.4.0 // indirect
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect
github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect
go.mongodb.org/mongo-driver v1.11.0 // indirect
go.mongodb.org/mongo-driver v1.11.2 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect

14
go.sum
View File

@ -155,8 +155,8 @@ github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4g
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543 h1:aMJGfgqe1QDhAVwxRg5fjCRF533xHidiKsugk7Vvzug=
github.com/filecoin-project/go-leb128 v0.0.0-20190212224330-8d79a5489543/go.mod h1:mjrHv1cDGJWDlGmC0eDc1E5VJr8DmL9XMUcaFwiuKg8=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
@ -473,13 +473,11 @@ github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK
github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
@ -699,8 +697,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU=
github.com/streamingfast/logging v0.0.0-20220813175024-b4fbb0e893df h1:P4pTLzwgd6bO3nnlIPnfQ/9Swnx3kSWxItgfkyDFoWo=
github.com/streamingfast/logging v0.0.0-20220813175024-b4fbb0e893df/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU=
github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c h1:dV1ye/S2PiW9uIWvLtMrxWoTLcZS+yhjZDSKEV102Ho=
github.com/streamingfast/logging v0.0.0-20221209193439-bff11742bf4c/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
@ -763,8 +761,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNHCw=
go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@ -967,7 +966,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

View File

@ -1,6 +1,7 @@
package cargen
import (
"bytes"
"context"
"errors"
"io"
@ -10,10 +11,14 @@ import (
"strings"
"testing"
bin "github.com/gagliardetto/binary"
"github.com/gagliardetto/solana-go"
"github.com/go-logr/logr/testr"
"github.com/ipfs/go-cid"
"github.com/ipld/go-car"
"github.com/ipld/go-ipld-prime/codec/dagcbor"
"github.com/ipld/go-ipld-prime/node/basicnode"
"github.com/multiformats/go-multicodec"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.firedancer.io/radiance/pkg/blockstore"
@ -190,21 +195,21 @@ func TestGen_Split(t *testing.T) {
cids []string
}{
"ledger-e1-s432000.car": {
size: 605,
size: 534,
cids: []string{
"bagaybaagciqew4qedn3qv2c6vgo7mm3pctryrnaqrgdlpf3vgcvozwlaeynkx6a", // SolanaTx
"bagbyfaagciqfasc3dklwgwcy5t3bfzjnlm2rbfjh4kepi6ryikkgiuvwzhw2vla", // RadianceEntry
"bagcifaagciqdg7fsz6k3mtflh5lkqyjgb5zahh4ybs47dwzuqiizdaivwhhr5sy", // RadianceBlock
"bafkreicloicbw5yk5bpkthpwgnxrjy4iwqiitbvxs52tbkxm3fqcmgvl7a", // KindTx
"bafyreiawzny3vxq6bir23qjai6fcujyiciqz7iftnibrfzbuvtoy7fvqtq", // KindEntry
"bafyreiaihhxk2rfo5lgilus3wp3mqglv2do3zgtfqpp5zfygrpzdbez3am", // KindBlock
},
},
"ledger-e1-s432002.car": {
size: 923,
size: 782,
cids: []string{
"bagaybaagciqomiykzi7uqzqxlhq7vmtwlqyaudpuclqrvcxtppbzplxqemyfwga", // SolanaTx
"bagbyfaagciqivs25rllteacdl5o5e34sa4sdofy34wfh4s3g4ghx26pf4iv4hdy", // RadianceEntry
"bagaybaagciqomiykzi7uqzqxlhq7vmtwlqyaudpuclqrvcxtppbzplxqemyfwga", // SolanaTx
"bagbyfaagciqlfc6ptacofkvbenvtiz7axbavxkeiyp5ow7idtsslu4hceakwtca", // RadianceEntry
"bagcifaagciqcotpbhzzfjddrtnxco7gy3qkw4ufba4ib7zvtbjl7sastj5murby", // RadianceBlock
"bafkreihgemfmup2imylvtyp2wj3fymakbx2bfyi2rlzxxq4xv3ycgmc3da", // KindTx
"bafyreih5wmt3ly25phouneamyxg5fs4uu3ma6kdvgwfregnmjsibkuipeq", // KindEntry
"bafkreihgemfmup2imylvtyp2wj3fymakbx2bfyi2rlzxxq4xv3ycgmc3da", // KindTx
"bafyreih5wmt3ly25phouneamyxg5fs4uu3ma6kdvgwfregnmjsibkuipeq", // KindEntry
"bafyreibqnqnmnhunzwcopnc7srlvq5p5bbgex2xspb6ayzf265rcwtaiie", // KindBlock
},
},
}
@ -232,8 +237,26 @@ func TestGen_Split(t *testing.T) {
break
}
require.NoError(t, err)
t.Logf("CID=%s Multicodec=%#x", block.Cid(), block.Cid().Type())
cids = append(cids, block.Cid())
cid := block.Cid()
cidType := cid.Type()
t.Logf("CID=%s Multicodec=%#x", cid, cidType)
switch multicodec.Code(cidType) {
case multicodec.Raw:
var tx solana.Transaction
require.NoError(t, bin.UnmarshalBin(&tx, block.RawData()))
t.Logf(" Txn: %s", &tx)
case multicodec.DagCbor:
decodeOpt := dagcbor.DecodeOptions{
AllowLinks: true,
}
builder := basicnode.Prototype.Any.NewBuilder()
require.NoError(t, decodeOpt.Decode(builder, bytes.NewReader(block.RawData())))
node := builder.Build()
t.Logf(" Entry: %s", node.Kind())
default:
panic("Unexpected entry")
}
cids = append(cids, cid)
}
// match CIDs

View File

@ -6,32 +6,14 @@ import (
"github.com/gagliardetto/solana-go"
"github.com/ipld/go-ipld-prime/datamodel"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
"github.com/multiformats/go-multicodec"
"go.firedancer.io/radiance/pkg/ipld/car"
"go.firedancer.io/radiance/pkg/ipld/ipldsch"
"go.firedancer.io/radiance/pkg/shred"
)
// Multicodec IDs of Solana-related IPLD blocks.
const (
// SolanaTx is canonical serialization (ledger/wire-format) of a versioned transaction.
// Stable and upgradable format, unlikely to change soon.
SolanaTx = 0xc00001
// RadianceTxList is a list of transactions.
// DAG-CBOR, non-standard.
RadianceTxList = 0xc00102
// RadianceEntry is a representation of a Solana entry, with extra data.
// DAG-CBOR, non-standard.
RadianceEntry = 0xc00103
// RadianceBlock describes a slot and points to entries.
// DAG-CBOR, non-standard.
RadianceBlock = 0xc00104
)
// CIDLen is the serialized size in bytes of a Solana/Radiance CID.
const CIDLen = 39
// CIDLen is the serialized size in bytes of a Raw/DagCbor CIDv1
const CIDLen = 36
// TargetBlockSize is the target size of variable-length IPLD blocks (e.g. link lists).
// Don't set this to the IPFS max block size, as we might overrun by a few kB.
@ -40,6 +22,13 @@ const TargetBlockSize = 1 << 19
// lengthPrefixSize is the max practical size of an array length prefix.
const lengthPrefixSize = 4
// IPLD node identifier
const (
KindTx = iota
KindEntry
KindBlock
)
type BlockAssembler struct {
writer car.OutStream
slot uint64
@ -74,7 +63,7 @@ func (b *BlockAssembler) WriteEntry(entry shred.Entry, pos EntryPos) error {
return err
}
builder := ipldsch.Type.Entry.NewBuilder()
entryMap, err := builder.BeginMap(8)
entryMap, err := builder.BeginMap(9)
if err != nil {
return err
}
@ -88,6 +77,14 @@ func (b *BlockAssembler) WriteEntry(entry shred.Entry, pos EntryPos) error {
var nodeAsm datamodel.NodeAssembler
nodeAsm, err = entryMap.AssembleEntry("kind")
if err != nil {
return err
}
if err = nodeAsm.AssignInt(int64(KindEntry)); err != nil {
return err
}
nodeAsm, err = entryMap.AssembleEntry("numHashes")
if err != nil {
return err
@ -115,8 +112,8 @@ func (b *BlockAssembler) WriteEntry(entry shred.Entry, pos EntryPos) error {
if err = entryMap.Finish(); err != nil {
return err
}
node := builder.Build()
block, err := car.NewBlockFromCBOR(node, RadianceEntry)
node := builder.Build().(ipldsch.Entry).Representation()
block, err := car.NewBlockFromCBOR(node, uint64(multicodec.DagCbor))
if err != nil {
return err
}
@ -127,13 +124,21 @@ func (b *BlockAssembler) WriteEntry(entry shred.Entry, pos EntryPos) error {
// Finish appends block metadata to the CAR and returns the root CID.
func (b *BlockAssembler) Finish() (link cidlink.Link, err error) {
builder := ipldsch.Type.Block.NewBuilder()
entryMap, err := builder.BeginMap(2)
entryMap, err := builder.BeginMap(4)
if err != nil {
return link, err
}
var nodeAsm datamodel.NodeAssembler
nodeAsm, err = entryMap.AssembleEntry("kind")
if err != nil {
return link, err
}
if err = nodeAsm.AssignInt(int64(KindBlock)); err != nil {
return link, err
}
nodeAsm, err = entryMap.AssembleEntry("slot")
if err != nil {
return link, err
@ -197,8 +202,8 @@ func (b *BlockAssembler) Finish() (link cidlink.Link, err error) {
if err = entryMap.Finish(); err != nil {
return link, err
}
node := builder.Build()
block, err := car.NewBlockFromCBOR(node, RadianceBlock)
node := builder.Build().(ipldsch.Block).Representation()
block, err := car.NewBlockFromCBOR(node, uint64(multicodec.DagCbor))
if err != nil {
return link, err
}
@ -235,7 +240,7 @@ func (t *TxListAssembler) writeTx(tx solana.Transaction) error {
if err != nil {
panic("failed to marshal tx: " + err.Error())
}
leaf := car.NewBlockFromRaw(buf, SolanaTx)
leaf := car.NewBlockFromRaw(buf, uint64(multicodec.Raw))
if err := t.writer.WriteBlock(leaf); err != nil {
return err
}
@ -255,7 +260,7 @@ func (t *TxListAssembler) finish() (datamodel.Node, error) {
}
// Create left link.
block, err := car.NewBlockFromCBOR(node, RadianceTxList)
block, err := car.NewBlockFromCBOR(node, uint64(multicodec.DagCbor))
if err != nil {
return nil, err
}
@ -270,7 +275,7 @@ func (t *TxListAssembler) finish() (datamodel.Node, error) {
if err != nil {
return nil, err
}
block, err = car.NewBlockFromCBOR(node, RadianceTxList)
block, err = car.NewBlockFromCBOR(node, uint64(multicodec.DagCbor))
if err != nil {
return nil, err
}

View File

@ -5,6 +5,7 @@ import (
"testing"
"github.com/ipfs/go-cid"
"github.com/multiformats/go-multicodec"
"github.com/multiformats/go-multihash"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -15,10 +16,8 @@ func TestCIDLen(t *testing.T) {
// Check whether codecs actually result in a CID sized CIDLen.
// This is important for our allocation strategies during merklerization.
codecs := []uint64{
SolanaTx,
RadianceTxList,
RadianceEntry,
RadianceBlock,
uint64(multicodec.Raw),
uint64(multicodec.DagCbor),
}
for _, codec := range codecs {
t.Run(fmt.Sprintf("Codec_%#x", codec), func(t *testing.T) {

View File

@ -8,6 +8,9 @@ import (
"github.com/ipld/go-ipld-prime/schema"
)
func (n _Block) FieldKind() Int {
return &n.kind
}
func (n _Block) FieldSlot() Int {
return &n.slot
}
@ -53,6 +56,7 @@ func (m MaybeBlock) Must() Block {
}
var (
fieldName__Block_Kind = _String{"kind"}
fieldName__Block_Slot = _String{"slot"}
fieldName__Block_Entries = _String{"entries"}
fieldName__Block_Shredding = _String{"shredding"}
@ -65,6 +69,8 @@ func (Block) Kind() datamodel.Kind {
}
func (n Block) LookupByString(key string) (datamodel.Node, error) {
switch key {
case "kind":
return &n.kind, nil
case "slot":
return &n.slot, nil
case "entries":
@ -98,17 +104,20 @@ type _Block__MapItr struct {
}
func (itr *_Block__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) {
if itr.idx >= 3 {
if itr.idx >= 4 {
return nil, nil, datamodel.ErrIteratorOverread{}
}
switch itr.idx {
case 0:
k = &fieldName__Block_Kind
v = &itr.n.kind
case 1:
k = &fieldName__Block_Slot
v = &itr.n.slot
case 1:
case 2:
k = &fieldName__Block_Entries
v = &itr.n.entries
case 2:
case 3:
k = &fieldName__Block_Shredding
v = &itr.n.shredding
default:
@ -118,14 +127,14 @@ func (itr *_Block__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error)
return
}
func (itr *_Block__MapItr) Done() bool {
return itr.idx >= 3
return itr.idx >= 4
}
func (Block) ListIterator() datamodel.ListIterator {
return nil
}
func (Block) Length() int64 {
return 3
return 4
}
func (Block) IsAbsent() bool {
return false
@ -187,6 +196,7 @@ type _Block__Assembler struct {
f int
cm schema.Maybe
ca_kind _Int__Assembler
ca_slot _Int__Assembler
ca_entries _List__Link__Assembler
ca_shredding _List__Shredding__Assembler
@ -195,16 +205,18 @@ type _Block__Assembler struct {
func (na *_Block__Assembler) reset() {
na.state = maState_initial
na.s = 0
na.ca_kind.reset()
na.ca_slot.reset()
na.ca_entries.reset()
na.ca_shredding.reset()
}
var (
fieldBit__Block_Slot = 1 << 0
fieldBit__Block_Entries = 1 << 1
fieldBit__Block_Shredding = 1 << 2
fieldBits__Block_sufficient = 0 + 1<<0 + 1<<1 + 1<<2
fieldBit__Block_Kind = 1 << 0
fieldBit__Block_Slot = 1 << 1
fieldBit__Block_Entries = 1 << 2
fieldBit__Block_Shredding = 1 << 3
fieldBits__Block_sufficient = 0 + 1<<0 + 1<<1 + 1<<2 + 1<<3
)
func (na *_Block__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) {
@ -301,7 +313,7 @@ func (ma *_Block__Assembler) valueFinishTidy() bool {
case 0:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_slot.w = nil
ma.ca_kind.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
@ -311,7 +323,7 @@ func (ma *_Block__Assembler) valueFinishTidy() bool {
case 1:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_entries.w = nil
ma.ca_slot.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
@ -319,6 +331,16 @@ func (ma *_Block__Assembler) valueFinishTidy() bool {
return false
}
case 2:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_entries.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
default:
return false
}
case 3:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_shredding.w = nil
@ -348,13 +370,23 @@ func (ma *_Block__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished")
}
switch k {
case "kind":
if ma.s&fieldBit__Block_Kind != 0 {
return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__Block_Kind}
}
ma.s += fieldBit__Block_Kind
ma.state = maState_midValue
ma.f = 0
ma.ca_kind.w = &ma.w.kind
ma.ca_kind.m = &ma.cm
return &ma.ca_kind, nil
case "slot":
if ma.s&fieldBit__Block_Slot != 0 {
return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__Block_Slot}
}
ma.s += fieldBit__Block_Slot
ma.state = maState_midValue
ma.f = 0
ma.f = 1
ma.ca_slot.w = &ma.w.slot
ma.ca_slot.m = &ma.cm
return &ma.ca_slot, nil
@ -364,7 +396,7 @@ func (ma *_Block__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
}
ma.s += fieldBit__Block_Entries
ma.state = maState_midValue
ma.f = 1
ma.f = 2
ma.ca_entries.w = &ma.w.entries
ma.ca_entries.m = &ma.cm
return &ma.ca_entries, nil
@ -374,7 +406,7 @@ func (ma *_Block__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
}
ma.s += fieldBit__Block_Shredding
ma.state = maState_midValue
ma.f = 2
ma.f = 3
ma.ca_shredding.w = &ma.w.shredding
ma.ca_shredding.m = &ma.cm
return &ma.ca_shredding, nil
@ -415,14 +447,18 @@ func (ma *_Block__Assembler) AssembleValue() datamodel.NodeAssembler {
ma.state = maState_midValue
switch ma.f {
case 0:
ma.ca_kind.w = &ma.w.kind
ma.ca_kind.m = &ma.cm
return &ma.ca_kind
case 1:
ma.ca_slot.w = &ma.w.slot
ma.ca_slot.m = &ma.cm
return &ma.ca_slot
case 1:
case 2:
ma.ca_entries.w = &ma.w.entries
ma.ca_entries.m = &ma.cm
return &ma.ca_entries
case 2:
case 3:
ma.ca_shredding.w = &ma.w.shredding
ma.ca_shredding.m = &ma.cm
return &ma.ca_shredding
@ -447,6 +483,9 @@ func (ma *_Block__Assembler) Finish() error {
}
if ma.s&fieldBits__Block_sufficient != fieldBits__Block_sufficient {
err := schema.ErrMissingRequiredField{Missing: make([]string, 0)}
if ma.s&fieldBit__Block_Kind == 0 {
err.Missing = append(err.Missing, "kind")
}
if ma.s&fieldBit__Block_Slot == 0 {
err.Missing = append(err.Missing, "slot")
}
@ -494,13 +533,21 @@ func (ka *_Block__KeyAssembler) AssignString(k string) error {
panic("misuse: KeyAssembler held beyond its valid lifetime")
}
switch k {
case "kind":
if ka.s&fieldBit__Block_Kind != 0 {
return datamodel.ErrRepeatedMapKey{Key: &fieldName__Block_Kind}
}
ka.s += fieldBit__Block_Kind
ka.state = maState_expectValue
ka.f = 0
return nil
case "slot":
if ka.s&fieldBit__Block_Slot != 0 {
return datamodel.ErrRepeatedMapKey{Key: &fieldName__Block_Slot}
}
ka.s += fieldBit__Block_Slot
ka.state = maState_expectValue
ka.f = 0
ka.f = 1
return nil
case "entries":
if ka.s&fieldBit__Block_Entries != 0 {
@ -508,7 +555,7 @@ func (ka *_Block__KeyAssembler) AssignString(k string) error {
}
ka.s += fieldBit__Block_Entries
ka.state = maState_expectValue
ka.f = 1
ka.f = 2
return nil
case "shredding":
if ka.s&fieldBit__Block_Shredding != 0 {
@ -516,7 +563,7 @@ func (ka *_Block__KeyAssembler) AssignString(k string) error {
}
ka.s += fieldBit__Block_Shredding
ka.state = maState_expectValue
ka.f = 2
ka.f = 3
return nil
default:
return schema.ErrInvalidKey{TypeName: "ipldsch.Block", Key: &_String{k}}
@ -565,10 +612,12 @@ func (n *_Block__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error)
func (n *_Block__Repr) LookupByIndex(idx int64) (datamodel.Node, error) {
switch idx {
case 0:
return n.slot.Representation(), nil
return n.kind.Representation(), nil
case 1:
return n.entries.Representation(), nil
return n.slot.Representation(), nil
case 2:
return n.entries.Representation(), nil
case 3:
return n.shredding.Representation(), nil
default:
return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(idx)}
@ -594,17 +643,20 @@ type _Block__ReprListItr struct {
}
func (itr *_Block__ReprListItr) Next() (idx int64, v datamodel.Node, err error) {
if itr.idx >= 3 {
if itr.idx >= 4 {
return -1, nil, datamodel.ErrIteratorOverread{}
}
switch itr.idx {
case 0:
idx = int64(itr.idx)
v = itr.n.slot.Representation()
v = itr.n.kind.Representation()
case 1:
idx = int64(itr.idx)
v = itr.n.entries.Representation()
v = itr.n.slot.Representation()
case 2:
idx = int64(itr.idx)
v = itr.n.entries.Representation()
case 3:
idx = int64(itr.idx)
v = itr.n.shredding.Representation()
default:
@ -614,11 +666,11 @@ func (itr *_Block__ReprListItr) Next() (idx int64, v datamodel.Node, err error)
return
}
func (itr *_Block__ReprListItr) Done() bool {
return itr.idx >= 3
return itr.idx >= 4
}
func (rn *_Block__Repr) Length() int64 {
l := 3
l := 4
return int64(l)
}
func (_Block__Repr) IsAbsent() bool {
@ -680,6 +732,7 @@ type _Block__ReprAssembler struct {
f int
cm schema.Maybe
ca_kind _Int__ReprAssembler
ca_slot _Int__ReprAssembler
ca_entries _List__Link__ReprAssembler
ca_shredding _List__Shredding__ReprAssembler
@ -688,6 +741,7 @@ type _Block__ReprAssembler struct {
func (na *_Block__ReprAssembler) reset() {
na.state = laState_initial
na.f = 0
na.ca_kind.reset()
na.ca_slot.reset()
na.ca_entries.reset()
na.ca_shredding.reset()
@ -810,6 +864,16 @@ func (la *_Block__ReprAssembler) valueFinishTidy() bool {
default:
return false
}
case 3:
switch la.cm {
case schema.Maybe_Value:
la.cm = schema.Maybe_Absent
la.state = laState_initial
la.f++
return true
default:
return false
}
default:
panic("unreachable")
}
@ -825,20 +889,24 @@ func (la *_Block__ReprAssembler) AssembleValue() datamodel.NodeAssembler {
case laState_finished:
panic("invalid state: AssembleValue cannot be called on an assembler that's already finished")
}
if la.f >= 3 {
return _ErrorThunkAssembler{schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(3)}}
if la.f >= 4 {
return _ErrorThunkAssembler{schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(4)}}
}
la.state = laState_midValue
switch la.f {
case 0:
la.ca_kind.w = &la.w.kind
la.ca_kind.m = &la.cm
return &la.ca_kind
case 1:
la.ca_slot.w = &la.w.slot
la.ca_slot.m = &la.cm
return &la.ca_slot
case 1:
case 2:
la.ca_entries.w = &la.w.entries
la.ca_entries.m = &la.cm
return &la.ca_entries
case 2:
case 3:
la.ca_shredding.w = &la.w.shredding
la.ca_shredding.m = &la.cm
return &la.ca_shredding
@ -1275,6 +1343,9 @@ var _ datamodel.Node = &_Bytes__Repr{}
type _Bytes__ReprPrototype = _Bytes__Prototype
type _Bytes__ReprAssembler = _Bytes__Assembler
func (n _Entry) FieldKind() Int {
return &n.kind
}
func (n _Entry) FieldNumHashes() Int {
return &n.numHashes
}
@ -1320,6 +1391,7 @@ func (m MaybeEntry) Must() Entry {
}
var (
fieldName__Entry_Kind = _String{"kind"}
fieldName__Entry_NumHashes = _String{"numHashes"}
fieldName__Entry_Hash = _String{"hash"}
fieldName__Entry_Txs = _String{"txs"}
@ -1332,6 +1404,8 @@ func (Entry) Kind() datamodel.Kind {
}
func (n Entry) LookupByString(key string) (datamodel.Node, error) {
switch key {
case "kind":
return &n.kind, nil
case "numHashes":
return &n.numHashes, nil
case "hash":
@ -1365,17 +1439,20 @@ type _Entry__MapItr struct {
}
func (itr *_Entry__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error) {
if itr.idx >= 3 {
if itr.idx >= 4 {
return nil, nil, datamodel.ErrIteratorOverread{}
}
switch itr.idx {
case 0:
k = &fieldName__Entry_Kind
v = &itr.n.kind
case 1:
k = &fieldName__Entry_NumHashes
v = &itr.n.numHashes
case 1:
case 2:
k = &fieldName__Entry_Hash
v = &itr.n.hash
case 2:
case 3:
k = &fieldName__Entry_Txs
v = &itr.n.txs
default:
@ -1385,14 +1462,14 @@ func (itr *_Entry__MapItr) Next() (k datamodel.Node, v datamodel.Node, _ error)
return
}
func (itr *_Entry__MapItr) Done() bool {
return itr.idx >= 3
return itr.idx >= 4
}
func (Entry) ListIterator() datamodel.ListIterator {
return nil
}
func (Entry) Length() int64 {
return 3
return 4
}
func (Entry) IsAbsent() bool {
return false
@ -1454,6 +1531,7 @@ type _Entry__Assembler struct {
f int
cm schema.Maybe
ca_kind _Int__Assembler
ca_numHashes _Int__Assembler
ca_hash _Hash__Assembler
ca_txs _TransactionList__Assembler
@ -1462,16 +1540,18 @@ type _Entry__Assembler struct {
func (na *_Entry__Assembler) reset() {
na.state = maState_initial
na.s = 0
na.ca_kind.reset()
na.ca_numHashes.reset()
na.ca_hash.reset()
na.ca_txs.reset()
}
var (
fieldBit__Entry_NumHashes = 1 << 0
fieldBit__Entry_Hash = 1 << 1
fieldBit__Entry_Txs = 1 << 2
fieldBits__Entry_sufficient = 0 + 1<<0 + 1<<1 + 1<<2
fieldBit__Entry_Kind = 1 << 0
fieldBit__Entry_NumHashes = 1 << 1
fieldBit__Entry_Hash = 1 << 2
fieldBit__Entry_Txs = 1 << 3
fieldBits__Entry_sufficient = 0 + 1<<0 + 1<<1 + 1<<2 + 1<<3
)
func (na *_Entry__Assembler) BeginMap(int64) (datamodel.MapAssembler, error) {
@ -1568,7 +1648,7 @@ func (ma *_Entry__Assembler) valueFinishTidy() bool {
case 0:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_numHashes.w = nil
ma.ca_kind.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
@ -1578,7 +1658,7 @@ func (ma *_Entry__Assembler) valueFinishTidy() bool {
case 1:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_hash.w = nil
ma.ca_numHashes.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
@ -1586,6 +1666,16 @@ func (ma *_Entry__Assembler) valueFinishTidy() bool {
return false
}
case 2:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_hash.w = nil
ma.cm = schema.Maybe_Absent
ma.state = maState_initial
return true
default:
return false
}
case 3:
switch ma.cm {
case schema.Maybe_Value:
ma.ca_txs.w = nil
@ -1615,13 +1705,23 @@ func (ma *_Entry__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished")
}
switch k {
case "kind":
if ma.s&fieldBit__Entry_Kind != 0 {
return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__Entry_Kind}
}
ma.s += fieldBit__Entry_Kind
ma.state = maState_midValue
ma.f = 0
ma.ca_kind.w = &ma.w.kind
ma.ca_kind.m = &ma.cm
return &ma.ca_kind, nil
case "numHashes":
if ma.s&fieldBit__Entry_NumHashes != 0 {
return nil, datamodel.ErrRepeatedMapKey{Key: &fieldName__Entry_NumHashes}
}
ma.s += fieldBit__Entry_NumHashes
ma.state = maState_midValue
ma.f = 0
ma.f = 1
ma.ca_numHashes.w = &ma.w.numHashes
ma.ca_numHashes.m = &ma.cm
return &ma.ca_numHashes, nil
@ -1631,7 +1731,7 @@ func (ma *_Entry__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
}
ma.s += fieldBit__Entry_Hash
ma.state = maState_midValue
ma.f = 1
ma.f = 2
ma.ca_hash.w = &ma.w.hash
ma.ca_hash.m = &ma.cm
return &ma.ca_hash, nil
@ -1641,7 +1741,7 @@ func (ma *_Entry__Assembler) AssembleEntry(k string) (datamodel.NodeAssembler, e
}
ma.s += fieldBit__Entry_Txs
ma.state = maState_midValue
ma.f = 2
ma.f = 3
ma.ca_txs.w = &ma.w.txs
ma.ca_txs.m = &ma.cm
return &ma.ca_txs, nil
@ -1682,14 +1782,18 @@ func (ma *_Entry__Assembler) AssembleValue() datamodel.NodeAssembler {
ma.state = maState_midValue
switch ma.f {
case 0:
ma.ca_kind.w = &ma.w.kind
ma.ca_kind.m = &ma.cm
return &ma.ca_kind
case 1:
ma.ca_numHashes.w = &ma.w.numHashes
ma.ca_numHashes.m = &ma.cm
return &ma.ca_numHashes
case 1:
case 2:
ma.ca_hash.w = &ma.w.hash
ma.ca_hash.m = &ma.cm
return &ma.ca_hash
case 2:
case 3:
ma.ca_txs.w = &ma.w.txs
ma.ca_txs.m = &ma.cm
return &ma.ca_txs
@ -1714,6 +1818,9 @@ func (ma *_Entry__Assembler) Finish() error {
}
if ma.s&fieldBits__Entry_sufficient != fieldBits__Entry_sufficient {
err := schema.ErrMissingRequiredField{Missing: make([]string, 0)}
if ma.s&fieldBit__Entry_Kind == 0 {
err.Missing = append(err.Missing, "kind")
}
if ma.s&fieldBit__Entry_NumHashes == 0 {
err.Missing = append(err.Missing, "numHashes")
}
@ -1761,13 +1868,21 @@ func (ka *_Entry__KeyAssembler) AssignString(k string) error {
panic("misuse: KeyAssembler held beyond its valid lifetime")
}
switch k {
case "kind":
if ka.s&fieldBit__Entry_Kind != 0 {
return datamodel.ErrRepeatedMapKey{Key: &fieldName__Entry_Kind}
}
ka.s += fieldBit__Entry_Kind
ka.state = maState_expectValue
ka.f = 0
return nil
case "numHashes":
if ka.s&fieldBit__Entry_NumHashes != 0 {
return datamodel.ErrRepeatedMapKey{Key: &fieldName__Entry_NumHashes}
}
ka.s += fieldBit__Entry_NumHashes
ka.state = maState_expectValue
ka.f = 0
ka.f = 1
return nil
case "hash":
if ka.s&fieldBit__Entry_Hash != 0 {
@ -1775,7 +1890,7 @@ func (ka *_Entry__KeyAssembler) AssignString(k string) error {
}
ka.s += fieldBit__Entry_Hash
ka.state = maState_expectValue
ka.f = 1
ka.f = 2
return nil
case "txs":
if ka.s&fieldBit__Entry_Txs != 0 {
@ -1783,7 +1898,7 @@ func (ka *_Entry__KeyAssembler) AssignString(k string) error {
}
ka.s += fieldBit__Entry_Txs
ka.state = maState_expectValue
ka.f = 2
ka.f = 3
return nil
default:
return schema.ErrInvalidKey{TypeName: "ipldsch.Entry", Key: &_String{k}}
@ -1832,10 +1947,12 @@ func (n *_Entry__Repr) LookupByNode(key datamodel.Node) (datamodel.Node, error)
func (n *_Entry__Repr) LookupByIndex(idx int64) (datamodel.Node, error) {
switch idx {
case 0:
return n.numHashes.Representation(), nil
return n.kind.Representation(), nil
case 1:
return n.hash.Representation(), nil
return n.numHashes.Representation(), nil
case 2:
return n.hash.Representation(), nil
case 3:
return n.txs.Representation(), nil
default:
return nil, schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(idx)}
@ -1861,17 +1978,20 @@ type _Entry__ReprListItr struct {
}
func (itr *_Entry__ReprListItr) Next() (idx int64, v datamodel.Node, err error) {
if itr.idx >= 3 {
if itr.idx >= 4 {
return -1, nil, datamodel.ErrIteratorOverread{}
}
switch itr.idx {
case 0:
idx = int64(itr.idx)
v = itr.n.numHashes.Representation()
v = itr.n.kind.Representation()
case 1:
idx = int64(itr.idx)
v = itr.n.hash.Representation()
v = itr.n.numHashes.Representation()
case 2:
idx = int64(itr.idx)
v = itr.n.hash.Representation()
case 3:
idx = int64(itr.idx)
v = itr.n.txs.Representation()
default:
@ -1881,11 +2001,11 @@ func (itr *_Entry__ReprListItr) Next() (idx int64, v datamodel.Node, err error)
return
}
func (itr *_Entry__ReprListItr) Done() bool {
return itr.idx >= 3
return itr.idx >= 4
}
func (rn *_Entry__Repr) Length() int64 {
l := 3
l := 4
return int64(l)
}
func (_Entry__Repr) IsAbsent() bool {
@ -1947,6 +2067,7 @@ type _Entry__ReprAssembler struct {
f int
cm schema.Maybe
ca_kind _Int__ReprAssembler
ca_numHashes _Int__ReprAssembler
ca_hash _Hash__ReprAssembler
ca_txs _TransactionList__ReprAssembler
@ -1955,6 +2076,7 @@ type _Entry__ReprAssembler struct {
func (na *_Entry__ReprAssembler) reset() {
na.state = laState_initial
na.f = 0
na.ca_kind.reset()
na.ca_numHashes.reset()
na.ca_hash.reset()
na.ca_txs.reset()
@ -2077,6 +2199,16 @@ func (la *_Entry__ReprAssembler) valueFinishTidy() bool {
default:
return false
}
case 3:
switch la.cm {
case schema.Maybe_Value:
la.cm = schema.Maybe_Absent
la.state = laState_initial
la.f++
return true
default:
return false
}
default:
panic("unreachable")
}
@ -2092,20 +2224,24 @@ func (la *_Entry__ReprAssembler) AssembleValue() datamodel.NodeAssembler {
case laState_finished:
panic("invalid state: AssembleValue cannot be called on an assembler that's already finished")
}
if la.f >= 3 {
return _ErrorThunkAssembler{schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(3)}}
if la.f >= 4 {
return _ErrorThunkAssembler{schema.ErrNoSuchField{Type: nil /*TODO*/, Field: datamodel.PathSegmentOfInt(4)}}
}
la.state = laState_midValue
switch la.f {
case 0:
la.ca_kind.w = &la.w.kind
la.ca_kind.m = &la.cm
return &la.ca_kind
case 1:
la.ca_numHashes.w = &la.w.numHashes
la.ca_numHashes.m = &la.cm
return &la.ca_numHashes
case 1:
case 2:
la.ca_hash.w = &la.w.hash
la.ca_hash.m = &la.cm
return &la.ca_hash
case 2:
case 3:
la.ca_txs.w = &la.w.txs
la.ca_txs.m = &la.cm
return &la.ca_txs

View File

@ -54,6 +54,7 @@ type typeSlab struct {
// Block matches the IPLD Schema type "Block". It has struct type-kind, and may be interrogated like map kind.
type Block = *_Block
type _Block struct {
kind _Int
slot _Int
entries _List__Link
shredding _List__Shredding
@ -70,6 +71,7 @@ type _Bytes struct{ x []byte }
// Entry matches the IPLD Schema type "Entry". It has struct type-kind, and may be interrogated like map kind.
type Entry = *_Entry
type _Entry struct {
kind _Int
numHashes _Int
hash _Hash
txs _TransactionList

View File

@ -1,4 +1,5 @@
type Block struct {
kind Int
slot Int
entries [ Link ]
shredding [ Shredding ]
@ -10,6 +11,7 @@ type Shredding struct {
} representation tuple
type Entry struct {
kind Int
numHashes Int
hash Hash
txs TransactionList