diff --git a/Makefile b/Makefile index 77a9658874..50613c6daa 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,7 @@ GOLDFLAGS := $(GOLDFLAGS_BASE) \ UNIT_TEST_SOURCES := $(sort $(shell GOPATH=$(GOPATH) && GO111MODULE=off && go list ./... | grep -v /go-algorand/test/ )) ALGOD_API_PACKAGES := $(sort $(shell GOPATH=$(GOPATH) && GO111MODULE=off && cd daemon/algod/api; go list ./... )) -MSGP_GENERATE := ./protocol ./protocol/test ./crypto ./crypto/compactcert ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./agreement ./rpcs ./node ./ledger ./ledger/ledgercore ./compactcert ./txnsync ./data/pooldata +MSGP_GENERATE := ./protocol ./protocol/test ./crypto ./crypto/compactcert ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./agreement ./rpcs ./node ./ledger ./ledger/ledgercore ./compactcert default: build diff --git a/catchup/fetcher_test.go b/catchup/fetcher_test.go index 4d62fdde06..65ace13458 100644 --- a/catchup/fetcher_test.go +++ b/catchup/fetcher_test.go @@ -23,7 +23,6 @@ import ( "net/url" "strings" "testing" - "time" "github.com/gorilla/mux" "github.com/stretchr/testify/require" @@ -288,16 +287,7 @@ func (p *testUnicastPeer) Version() string { return p.version } -func (p *testUnicastPeer) IsOutgoing() bool { - return false -} - -// GetConnectionLatency returns the connection latency between the local node and this peer. -func (p *testUnicastPeer) GetConnectionLatency() time.Duration { - return time.Duration(0) -} - -func (p *testUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag, callback network.UnicastWebsocketMessageStateCallback) error { +func (p *testUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) error { ps := p.gn.(*httpTestPeerSource) var dispather network.MessageHandler for _, v := range ps.dispatchHandlers { diff --git a/catchup/peerSelector_test.go b/catchup/peerSelector_test.go index 02d759b208..a11e7db1ea 100644 --- a/catchup/peerSelector_test.go +++ b/catchup/peerSelector_test.go @@ -50,7 +50,7 @@ type mockUnicastPeer struct { func (d *mockUnicastPeer) GetAddress() string { return d.address } -func (d *mockUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag, callback network.UnicastWebsocketMessageStateCallback) error { +func (d *mockUnicastPeer) Unicast(ctx context.Context, data []byte, tag protocol.Tag) error { return nil } func (d *mockUnicastPeer) Version() string { @@ -62,9 +62,6 @@ func (d *mockUnicastPeer) Request(ctx context.Context, tag network.Tag, topics n func (d *mockUnicastPeer) Respond(ctx context.Context, reqMsg network.IncomingMessage, topics network.Topics) (e error) { return nil } -func (d *mockUnicastPeer) IsOutgoing() bool { - return false -} // GetConnectionLatency returns the connection latency between the local node and this peer. func (d *mockUnicastPeer) GetConnectionLatency() time.Duration { diff --git a/config/localTemplate.go b/config/localTemplate.go index fbe29cfac9..20a141e8cd 100644 --- a/config/localTemplate.go +++ b/config/localTemplate.go @@ -62,7 +62,7 @@ type Local struct { MaxConnectionsPerIP int `version[3]:"30"` // 0 == disable - PeerPingPeriodSeconds int `version[0]:"0" version[18]:"10"` + PeerPingPeriodSeconds int `version[0]:"0"` // for https serving TLSCertFile string `version[0]:""` diff --git a/config/local_defaults.go b/config/local_defaults.go index 0b5c1dede7..ae1aa7043f 100644 --- a/config/local_defaults.go +++ b/config/local_defaults.go @@ -92,7 +92,7 @@ var defaultLocal = Local{ OutgoingMessageFilterBucketSize: 128, ParticipationKeysRefreshInterval: 60000000000, PeerConnectionsUpdateInterval: 3600, - PeerPingPeriodSeconds: 10, + PeerPingPeriodSeconds: 0, PriorityPeers: map[string]bool{}, ProposalAssemblyTime: 250000000, PublicAddress: "", diff --git a/crypto/compactcert/common.go b/crypto/compactcert/common.go index 53b469bfd4..d2370d779c 100644 --- a/crypto/compactcert/common.go +++ b/crypto/compactcert/common.go @@ -113,5 +113,5 @@ func numReveals(signedWeight uint64, provenWeight uint64, secKQ uint64, bound ui } func (p Params) numReveals(signedWeight uint64) (uint64, error) { - return numReveals(signedWeight, p.ProvenWeight, p.SecKQ, MaxReveals) + return numReveals(signedWeight, p.ProvenWeight, p.SecKQ, maxReveals) } diff --git a/crypto/compactcert/msgp_gen.go b/crypto/compactcert/msgp_gen.go index de366c1395..2f23016535 100644 --- a/crypto/compactcert/msgp_gen.go +++ b/crypto/compactcert/msgp_gen.go @@ -181,8 +181,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "SigProofs") return } - if zb0007 > MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0007), uint64(MaxProofDigests)) + if zb0007 > maxProofDigests { + err = msgp.ErrOverflow(uint64(zb0007), uint64(maxProofDigests)) err = msgp.WrapError(err, "struct-from-array", "SigProofs") return } @@ -210,8 +210,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "PartProofs") return } - if zb0009 > MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0009), uint64(MaxProofDigests)) + if zb0009 > maxProofDigests { + err = msgp.ErrOverflow(uint64(zb0009), uint64(maxProofDigests)) err = msgp.WrapError(err, "struct-from-array", "PartProofs") return } @@ -239,8 +239,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "Reveals") return } - if zb0011 > MaxReveals { - err = msgp.ErrOverflow(uint64(zb0011), uint64(MaxReveals)) + if zb0011 > maxReveals { + err = msgp.ErrOverflow(uint64(zb0011), uint64(maxReveals)) err = msgp.WrapError(err, "struct-from-array", "Reveals") return } @@ -309,8 +309,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "SigProofs") return } - if zb0013 > MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0013), uint64(MaxProofDigests)) + if zb0013 > maxProofDigests { + err = msgp.ErrOverflow(uint64(zb0013), uint64(maxProofDigests)) err = msgp.WrapError(err, "SigProofs") return } @@ -336,8 +336,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "PartProofs") return } - if zb0015 > MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0015), uint64(MaxProofDigests)) + if zb0015 > maxProofDigests { + err = msgp.ErrOverflow(uint64(zb0015), uint64(maxProofDigests)) err = msgp.WrapError(err, "PartProofs") return } @@ -363,8 +363,8 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Reveals") return } - if zb0017 > MaxReveals { - err = msgp.ErrOverflow(uint64(zb0017), uint64(MaxReveals)) + if zb0017 > maxReveals { + err = msgp.ErrOverflow(uint64(zb0017), uint64(maxReveals)) err = msgp.WrapError(err, "Reveals") return } diff --git a/crypto/compactcert/structs.go b/crypto/compactcert/structs.go index aa74dea3eb..1e02e4eafc 100644 --- a/crypto/compactcert/structs.go +++ b/crypto/compactcert/structs.go @@ -63,11 +63,9 @@ type Reveal struct { Part basics.Participant `codec:"p"` } -// MaxReveals is a bound on allocation and on numReveals to limit log computation -const MaxReveals = 1024 - -// MaxProofDigests is a bound on allocation on number of proofs -const MaxProofDigests = 20 * MaxReveals +// maxReveals is a bound on allocation and on numReveals to limit log computation +const maxReveals = 1024 +const maxProofDigests = 20 * maxReveals // Cert represents a compact certificate. type Cert struct { @@ -75,13 +73,13 @@ type Cert struct { SigCommit crypto.Digest `codec:"c"` SignedWeight uint64 `codec:"w"` - SigProofs []crypto.Digest `codec:"S,allocbound=MaxProofDigests"` - PartProofs []crypto.Digest `codec:"P,allocbound=MaxProofDigests"` + SigProofs []crypto.Digest `codec:"S,allocbound=maxProofDigests"` + PartProofs []crypto.Digest `codec:"P,allocbound=maxProofDigests"` // Reveals is a sparse map from the position being revealed // to the corresponding elements from the sigs and participants // arrays. - Reveals map[uint64]Reveal `codec:"r,allocbound=MaxReveals"` + Reveals map[uint64]Reveal `codec:"r,allocbound=maxReveals"` } // SortUint64 implements sorting by uint64 keys for diff --git a/crypto/curve25519.go b/crypto/curve25519.go index eede5d337d..e0bf278def 100644 --- a/crypto/curve25519.go +++ b/crypto/curve25519.go @@ -69,19 +69,10 @@ func init() { // A Seed holds the entropy needed to generate cryptographic keys. type Seed ed25519Seed -// PublicKeyByteLength is the length, in bytes, of a public key -const PublicKeyByteLength = 32 - -// PrivateKeyByteLength is the length, in bytes, of a private key -const PrivateKeyByteLength = 64 - -// SignatureByteLength is the length, in bytes, of a signature -const SignatureByteLength = 64 - /* Classical signatures */ -type ed25519Signature [SignatureByteLength]byte -type ed25519PublicKey [PublicKeyByteLength]byte -type ed25519PrivateKey [PrivateKeyByteLength]byte +type ed25519Signature [64]byte +type ed25519PublicKey [32]byte +type ed25519PrivateKey [64]byte type ed25519Seed [32]byte // MasterDerivationKey is used to derive ed25519 keys for use in wallets diff --git a/crypto/msgp_gen.go b/crypto/msgp_gen.go index 4690dbfc4e..84fe8622e6 100644 --- a/crypto/msgp_gen.go +++ b/crypto/msgp_gen.go @@ -379,8 +379,8 @@ func (z *MultisigSig) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "Subsigs") return } - if zb0004 > MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0004), uint64(MaxMultisig)) + if zb0004 > maxMultisig { + err = msgp.ErrOverflow(uint64(zb0004), uint64(maxMultisig)) err = msgp.WrapError(err, "struct-from-array", "Subsigs") return } @@ -442,8 +442,8 @@ func (z *MultisigSig) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Subsigs") return } - if zb0006 > MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0006), uint64(MaxMultisig)) + if zb0006 > maxMultisig { + err = msgp.ErrOverflow(uint64(zb0006), uint64(maxMultisig)) err = msgp.WrapError(err, "Subsigs") return } @@ -613,7 +613,7 @@ func (_ *MultisigSubsig) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *MultisigSubsig) Msgsize() (s int) { - s = 1 + 3 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 2 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -792,7 +792,7 @@ func (_ *OneTimeSignature) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignature) Msgsize() (s int) { - s = 1 + 2 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + 2 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 4 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + 4 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s = 1 + 2 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + 2 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 4 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + 4 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -1114,7 +1114,7 @@ func (_ *OneTimeSignatureSecrets) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignatureSecrets) Msgsize() (s int) { - s = 1 + 25 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.ArrayHeaderSize + s = 1 + 25 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.ArrayHeaderSize for zb0002 := range (*z).OneTimeSignatureSecretsPersistent.Batches { s += (*z).OneTimeSignatureSecretsPersistent.Batches[zb0002].Msgsize() } @@ -1122,7 +1122,7 @@ func (z *OneTimeSignatureSecrets) Msgsize() (s int) { for zb0003 := range (*z).OneTimeSignatureSecretsPersistent.Offsets { s += (*z).OneTimeSignatureSecretsPersistent.Offsets[zb0003].Msgsize() } - s += 7 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 10 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s += 7 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 10 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -1444,7 +1444,7 @@ func (_ *OneTimeSignatureSecretsPersistent) CanUnmarshalMsg(z interface{}) bool // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignatureSecretsPersistent) Msgsize() (s int) { - s = 1 + 25 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.ArrayHeaderSize + s = 1 + 25 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.ArrayHeaderSize for zb0002 := range (*z).Batches { s += (*z).Batches[zb0002].Msgsize() } @@ -1452,7 +1452,7 @@ func (z *OneTimeSignatureSecretsPersistent) Msgsize() (s int) { for zb0003 := range (*z).Offsets { s += (*z).Offsets[zb0003].Msgsize() } - s += 7 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 10 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s += 7 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 10 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -1563,7 +1563,7 @@ func (_ *OneTimeSignatureSubkeyBatchID) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignatureSubkeyBatchID) Msgsize() (s int) { - s = 1 + 3 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 6 + msgp.Uint64Size + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + msgp.Uint64Size return } @@ -1691,7 +1691,7 @@ func (_ *OneTimeSignatureSubkeyOffsetID) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignatureSubkeyOffsetID) Msgsize() (s int) { - s = 1 + 3 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.Uint64Size + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + msgp.Uint64Size + 4 + msgp.Uint64Size return } @@ -1730,7 +1730,7 @@ func (_ *OneTimeSignatureVerifier) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *OneTimeSignatureVerifier) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) return } @@ -1769,7 +1769,7 @@ func (_ *PrivateKey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *PrivateKey) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (PrivateKeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -1808,7 +1808,7 @@ func (_ *PublicKey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *PublicKey) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) return } @@ -1886,7 +1886,7 @@ func (_ *Signature) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Signature) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -1997,7 +1997,7 @@ func (_ *SignatureSecrets) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *SignatureSecrets) Msgsize() (s int) { - s = 1 + 18 + (*z).SignatureVerifier.Msgsize() + 3 + msgp.ArrayHeaderSize + (PrivateKeyByteLength * (msgp.ByteSize)) + s = 1 + 18 + (*z).SignatureVerifier.Msgsize() + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -2108,7 +2108,7 @@ func (_ *VRFSecrets) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *VRFSecrets) Msgsize() (s int) { - s = 1 + 3 + msgp.ArrayHeaderSize + (VrfPubkeyByteLength * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -2264,7 +2264,7 @@ func (_ *VrfPubkey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *VrfPubkey) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (VrfPubkeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) return } @@ -2303,7 +2303,7 @@ func (_ *ed25519PrivateKey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *ed25519PrivateKey) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (PrivateKeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -2342,7 +2342,7 @@ func (_ *ed25519PublicKey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *ed25519PublicKey) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) return } @@ -2420,7 +2420,7 @@ func (_ *ed25519Signature) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *ed25519Signature) Msgsize() (s int) { - s = msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s = msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } @@ -2565,7 +2565,7 @@ func (_ *ephemeralSubkey) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *ephemeralSubkey) Msgsize() (s int) { - s = 1 + 3 + msgp.ArrayHeaderSize + (PublicKeyByteLength * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (PrivateKeyByteLength * (msgp.ByteSize)) + 6 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + 5 + msgp.ArrayHeaderSize + (SignatureByteLength * (msgp.ByteSize)) + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + 6 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + 5 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) return } diff --git a/crypto/multisig.go b/crypto/multisig.go index 886d2cb62c..6c9a1ca668 100644 --- a/crypto/multisig.go +++ b/crypto/multisig.go @@ -38,7 +38,7 @@ type MultisigSig struct { Version uint8 `codec:"v"` Threshold uint8 `codec:"thr"` - Subsigs []MultisigSubsig `codec:"subsig,allocbound=MaxMultisig"` + Subsigs []MultisigSubsig `codec:"subsig,allocbound=maxMultisig"` } // MultisigPreimageFromPKs makes an empty MultisigSig for a given preimage. It should be renamed. @@ -76,9 +76,7 @@ func (msig MultisigSig) Preimage() (version, threshold uint8, pks []PublicKey) { } const multiSigString = "MultisigAddr" - -// MaxMultisig is a bound on allocation and on the number of subsigs -const MaxMultisig = 255 +const maxMultisig = 255 // MultisigAddrGen identifes the exact group, version, // and devices (Public keys) that it requires to sign @@ -258,9 +256,8 @@ func MultisigBatchVerify(msg Hashable, addr Digest, sig MultisigSig, batchVerifi } // check that we don't have too many multisig subsigs - if len(sig.Subsigs) > MaxMultisig { + if len(sig.Subsigs) > maxMultisig { err = errInvalidNumberOfSignature - return } diff --git a/crypto/multisig_test.go b/crypto/multisig_test.go index 492c3cfe82..8636331bf6 100644 --- a/crypto/multisig_test.go +++ b/crypto/multisig_test.go @@ -297,7 +297,7 @@ func TestMoreThanMaxSigsInMultisig(t *testing.T) { var s Seed var secrets []*SecretKey var pks []PublicKey - multiSigLen := MaxMultisig + 1 + multiSigLen := maxMultisig + 1 txid := TestingHashable{[]byte("test: txid 1000")} version := uint8(1) threshold := uint8(1) diff --git a/crypto/vrf.go b/crypto/vrf.go index 36a6e8270f..88e3144854 100644 --- a/crypto/vrf.go +++ b/crypto/vrf.go @@ -45,9 +45,6 @@ type VRFVerifier = VrfPubkey // VRFProof is a deprecated name for VrfProof type VRFProof = VrfProof -// VrfPubkeyByteLength is the size, in bytes, of a VRF public key. -const VrfPubkeyByteLength = 32 - // VRFSecrets is a wrapper for a VRF keypair. Use *VrfPrivkey instead type VRFSecrets struct { _struct struct{} `codec:""` @@ -71,7 +68,7 @@ type ( // Specifically, we use a 64-byte ed25519 private key (the latter 32-bytes are the precomputed public key) VrfPrivkey [64]byte // A VrfPubkey is a public key that can be used to verify VRF proofs. - VrfPubkey [VrfPubkeyByteLength]byte + VrfPubkey [32]byte // A VrfProof for a message can be generated with a secret key and verified against a public key, like a signature. // Proofs are malleable, however, for a given message and public key, the VRF output that can be computed from a proof is unique. VrfProof [80]byte diff --git a/data/basics/msgp_gen.go b/data/basics/msgp_gen.go index 57cef5e5d6..f76a37db54 100644 --- a/data/basics/msgp_gen.go +++ b/data/basics/msgp_gen.go @@ -2541,7 +2541,7 @@ func (z *AssetParams) MarshalMsg(b []byte) (o []byte) { // omitempty: check for empty values zb0002Len := uint32(11) var zb0002Mask uint16 /* 12 bits */ - if (*z).MetadataHash == ([MetadataHashLength]byte{}) { + if (*z).MetadataHash == ([32]byte{}) { zb0002Len-- zb0002Mask |= 0x2 } @@ -2862,13 +2862,13 @@ func (_ *AssetParams) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *AssetParams) Msgsize() (s int) { - s = 1 + 2 + msgp.Uint64Size + 3 + msgp.Uint32Size + 3 + msgp.BoolSize + 3 + msgp.StringPrefixSize + len((*z).UnitName) + 3 + msgp.StringPrefixSize + len((*z).AssetName) + 3 + msgp.StringPrefixSize + len((*z).URL) + 3 + msgp.ArrayHeaderSize + (MetadataHashLength * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() + s = 1 + 2 + msgp.Uint64Size + 3 + msgp.Uint32Size + 3 + msgp.BoolSize + 3 + msgp.StringPrefixSize + len((*z).UnitName) + 3 + msgp.StringPrefixSize + len((*z).AssetName) + 3 + msgp.StringPrefixSize + len((*z).URL) + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() return } // MsgIsZero returns whether this is a zero value func (z *AssetParams) MsgIsZero() bool { - return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([MetadataHashLength]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) + return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([32]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/data/basics/userBalance.go b/data/basics/userBalance.go index b427a2f99f..a619438d30 100644 --- a/data/basics/userBalance.go +++ b/data/basics/userBalance.go @@ -323,9 +323,6 @@ const ( // AppCreatable is the CreatableType corresponds to apps AppCreatable CreatableType = 1 - - // MetadataHashLength is the number of bytes of the MetadataHash - MetadataHashLength int = 32 ) // CreatableLocator stores both the creator, whose balance record contains @@ -377,7 +374,7 @@ type AssetParams struct { // MetadataHash specifies a commitment to some unspecified asset // metadata. The format of this metadata is up to the application. - MetadataHash [MetadataHashLength]byte `codec:"am"` + MetadataHash [32]byte `codec:"am"` // Manager specifies an account that is allowed to change the // non-zero addresses in this AssetParams. diff --git a/data/pooldata/msgp_gen.go b/data/pooldata/msgp_gen.go deleted file mode 100644 index 02a11cfa20..0000000000 --- a/data/pooldata/msgp_gen.go +++ /dev/null @@ -1,91 +0,0 @@ -package pooldata - -// Code generated by github.com/algorand/msgp DO NOT EDIT. - -import ( - "github.com/algorand/go-algorand/config" - "github.com/algorand/msgp/msgp" -) - -// The following msgp objects are implemented in this file: -// SignedTxnSlice -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// - -// MarshalMsg implements msgp.Marshaler -func (z SignedTxnSlice) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0001 := range z { - o = z[za0001].MarshalMsg(o) - } - return -} - -func (_ SignedTxnSlice) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(SignedTxnSlice) - if !ok { - _, ok = (z).(*SignedTxnSlice) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *SignedTxnSlice) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > config.MaxTxGroupSize { - err = msgp.ErrOverflow(uint64(zb0002), uint64(config.MaxTxGroupSize)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(SignedTxnSlice, zb0002) - } - for zb0001 := range *z { - bts, err = (*z)[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *SignedTxnSlice) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*SignedTxnSlice) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z SignedTxnSlice) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0001 := range z { - s += z[za0001].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z SignedTxnSlice) MsgIsZero() bool { - return len(z) == 0 -} diff --git a/data/pooldata/msgp_gen_test.go b/data/pooldata/msgp_gen_test.go deleted file mode 100644 index 68ed008d01..0000000000 --- a/data/pooldata/msgp_gen_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// +build !skip_msgp_testing - -package pooldata - -// Code generated by github.com/algorand/msgp DO NOT EDIT. - -import ( - "testing" - - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" -) - -func TestMarshalUnmarshalSignedTxnSlice(t *testing.T) { - partitiontest.PartitionTest(t) - v := SignedTxnSlice{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingSignedTxnSlice(t *testing.T) { - protocol.RunEncodingTest(t, &SignedTxnSlice{}) -} - -func BenchmarkMarshalMsgSignedTxnSlice(b *testing.B) { - v := SignedTxnSlice{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgSignedTxnSlice(b *testing.B) { - v := SignedTxnSlice{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalSignedTxnSlice(b *testing.B) { - v := SignedTxnSlice{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} diff --git a/data/pooldata/signedTxGroup.go b/data/pooldata/signedTxGroup.go deleted file mode 100644 index fe4e1e24ff..0000000000 --- a/data/pooldata/signedTxGroup.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package pooldata - -import ( - "math" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/protocol" -) - -// SignedTxGroup used as the in-memory representation of a signed transaction group. -// unlike the plain array of signed transactions, this includes transaction origination and counter -// used by the transaction pool and the transaction sync -//msgp:ignore SignedTxGroup -type SignedTxGroup struct { - // Transactions contains the signed transactions that are included in this transaction group. - Transactions SignedTxnSlice - // LocallyOriginated specify whether the trancation group was inroduced via the REST API or - // by the transaction sync. - LocallyOriginated bool - // GroupCounter is a monotonic increasing counter, that provides an identify for each transaction group. - // The transaction sync is using it as a way to scan the transactions group list more efficiently, as it - // can continue scanning the list from the place where it last stopped. - // GroupCounter is local, assigned when the group is first seen by the local transaction pool. - GroupCounter uint64 - // GroupTransactionID is the hash of the entire transaction group. - GroupTransactionID transactions.Txid - // EncodedLength is the length, in bytes, of the messagepack encoding of all the transaction - // within this transaction group. - EncodedLength int -} - -// SignedTxnSlice is a slice of SignedTxn(s), allowing us to -// easily define the ID() function. -//msgp:allocbound SignedTxnSlice config.MaxTxGroupSize -type SignedTxnSlice []transactions.SignedTxn - -// ID calculate the hash of the signed transaction group. -func (s SignedTxnSlice) ID() transactions.Txid { - enc := s.MarshalMsg(append(protocol.GetEncodingBuf(), []byte(protocol.TxGroup)...)) - defer protocol.PutEncodingBuf(enc) - return transactions.Txid(crypto.Hash(enc)) -} - -// InvalidSignedTxGroupCounter is used to represent an invalid GroupCounter value. It's being used to indicate -// the absence of an entry within a []SignedTxGroup with a particular GroupCounter value. -const InvalidSignedTxGroupCounter = uint64(math.MaxUint64) diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go index d6dee4b755..664e273804 100644 --- a/data/pools/transactionPool.go +++ b/data/pools/transactionPool.go @@ -28,7 +28,6 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/ledger/ledgercore" @@ -54,11 +53,6 @@ type TransactionPool struct { // with atomic operations which require 64 bit alignment on arm. feePerByte uint64 - // latestMeasuredDataExchangeRate is the average data exchange rate, as measured by the transaction sync. - // we use the latestMeasuredDataExchangeRate in order to determine the desired proposal size, so that it - // won't create undesired network bottlenecks. - latestMeasuredDataExchangeRate uint64 - // const logProcessBlockStats bool logAssembleStats bool @@ -81,29 +75,18 @@ type TransactionPool struct { assemblyRound basics.Round assemblyResults poolAsmResults - // pendingMu protects pendingTxGroups, pendingTxids, pendingCounter and pendingLatestLocal - pendingMu deadlock.RWMutex - // pendingTxGroups is a slice of the pending transaction groups. - pendingTxGroups []pooldata.SignedTxGroup - // pendingTxids is a map of the pending *transaction ids* included in the pendingTxGroups array. - pendingTxids map[transactions.Txid]transactions.SignedTxn - // pendingCounter is a monotomic counter, indicating the next pending transaction group counter value. - pendingCounter uint64 - // pendingLatestLocal is the value of the last transaction group counter which is associated with a transaction that was - // locally originated ( i.e. posted to this node via the REST API ) - pendingLatestLocal uint64 + // pendingMu protects pendingTxGroups and pendingTxids + pendingMu deadlock.RWMutex + pendingTxGroups [][]transactions.SignedTxn + pendingTxids map[transactions.Txid]transactions.SignedTxn // Calls to remember() add transactions to rememberedTxGroups and // rememberedTxids. Calling rememberCommit() adds them to the // pendingTxGroups and pendingTxids. This allows us to batch the // changes in OnNewBlock() without preventing a concurrent call - // to PendingTxGroups(). - rememberedTxGroups []pooldata.SignedTxGroup + // to PendingTxGroups() or Verified(). + rememberedTxGroups [][]transactions.SignedTxn rememberedTxids map[transactions.Txid]transactions.SignedTxn - // rememberedLatestLocal is the value of the last transaction group counter which is associated with a transaction that was - // locally originated ( i.e. posted to this node via the REST API ). This variable is used when OnNewBlock is called and - // we filter out the pending transaction through the evaluator. - rememberedLatestLocal uint64 log logging.Logger @@ -179,14 +162,6 @@ const ( // duration it would take to execute the GenerateBlock() function generateBlockBaseDuration = 2 * time.Millisecond generateBlockTransactionDuration = 2155 * time.Nanosecond - - // minMaxTxnBytesPerBlock is the minimal maximum block size that the evaluator would be asked to create, in case - // the local node doesn't have sufficient bandwidth to support higher throughputs. - // for example: a node that has a very low bandwidth of 10KB/s. If we will follow the block size calculations, we - // would get to an unrealistic block size of 20KB. This could be due to a temporary network bandwidth fluctuations - // or other measuring issue. In order to ensure we have some more realistic block sizes to - // work with, we clamp the block size to the range of [minMaxTxnBytesPerBlock .. proto.MaxTxnBytesPerBlock]. - minMaxTxnBytesPerBlock = 100 * 1024 ) // ErrStaleBlockAssemblyRequest returned by AssembleBlock when requested block number is older than the current transaction pool round @@ -197,7 +172,6 @@ var ErrStaleBlockAssemblyRequest = fmt.Errorf("AssembleBlock: requested block as func (pool *TransactionPool) Reset() { pool.pendingTxids = make(map[transactions.Txid]transactions.SignedTxn) pool.pendingTxGroups = nil - pool.pendingLatestLocal = pooldata.InvalidSignedTxGroupCounter pool.rememberedTxids = make(map[transactions.Txid]transactions.SignedTxn) pool.rememberedTxGroups = nil pool.expiredTxCount = make(map[basics.Round]int) @@ -231,15 +205,14 @@ func (pool *TransactionPool) PendingTxIDs() []transactions.Txid { } // PendingTxGroups returns a list of transaction groups that should be proposed -// in the next block, in order. As the second return value, it returns the transaction -// group counter of the latest local generated transaction group. -func (pool *TransactionPool) PendingTxGroups() ([]pooldata.SignedTxGroup, uint64) { +// in the next block, in order. +func (pool *TransactionPool) PendingTxGroups() [][]transactions.SignedTxn { pool.pendingMu.RLock() defer pool.pendingMu.RUnlock() // note that this operation is safe for the sole reason that arrays in go are immutable. // if the underlaying array need to be expanded, the actual underlaying array would need // to be reallocated. - return pool.pendingTxGroups, pool.pendingLatestLocal + return pool.pendingTxGroups } // pendingTxIDsCount returns the number of pending transaction ids that are still waiting @@ -263,26 +236,8 @@ func (pool *TransactionPool) rememberCommit(flush bool) { if flush { pool.pendingTxGroups = pool.rememberedTxGroups pool.pendingTxids = pool.rememberedTxids - pool.pendingLatestLocal = pool.rememberedLatestLocal pool.ledger.VerifiedTransactionCache().UpdatePinned(pool.pendingTxids) } else { - // update the GroupCounter on all the transaction groups we're going to add. - // this would ensure that each transaction group has a unique monotonic GroupCounter - encodingBuf := protocol.GetEncodingBuf() - for i, txGroup := range pool.rememberedTxGroups { - pool.pendingCounter++ - txGroup.GroupCounter = pool.pendingCounter - txGroup.EncodedLength = 0 - for _, txn := range txGroup.Transactions { - encodingBuf = encodingBuf[:0] - txGroup.EncodedLength += len(txn.MarshalMsg(encodingBuf)) - } - pool.rememberedTxGroups[i] = txGroup - if txGroup.LocallyOriginated { - pool.pendingLatestLocal = txGroup.GroupCounter - } - } - protocol.PutEncodingBuf(encodingBuf) pool.pendingTxGroups = append(pool.pendingTxGroups, pool.rememberedTxGroups...) for txid, txn := range pool.rememberedTxids { @@ -290,15 +245,8 @@ func (pool *TransactionPool) rememberCommit(flush bool) { } } - pool.resetRememberedTransactionGroups() -} - -// resetRememberedTransactionGroups clears the remembered transaction groups. -// The caller is assumed to be holding pool.mu. -func (pool *TransactionPool) resetRememberedTransactionGroups() { pool.rememberedTxGroups = nil pool.rememberedTxids = make(map[transactions.Txid]transactions.SignedTxn) - pool.rememberedLatestLocal = pooldata.InvalidSignedTxGroupCounter } // PendingCount returns the number of transactions currently pending in the pool. @@ -313,7 +261,7 @@ func (pool *TransactionPool) PendingCount() int { func (pool *TransactionPool) pendingCountNoLock() int { var count int for _, txgroup := range pool.pendingTxGroups { - count += len(txgroup.Transactions) + count += len(txgroup) } return count } @@ -377,12 +325,12 @@ func (pool *TransactionPool) computeFeePerByte() uint64 { // checkSufficientFee take a set of signed transactions and verifies that each transaction has // sufficient fee to get into the transaction pool -func (pool *TransactionPool) checkSufficientFee(txgroup pooldata.SignedTxGroup) error { +func (pool *TransactionPool) checkSufficientFee(txgroup []transactions.SignedTxn) error { // Special case: the compact cert transaction, if issued from the // special compact-cert-sender address, in a singleton group, pays // no fee. - if len(txgroup.Transactions) == 1 { - t := txgroup.Transactions[0].Txn + if len(txgroup) == 1 { + t := txgroup[0].Txn if t.Type == protocol.CompactCertTx && t.Sender == transactions.CompactCertSender && t.Fee.IsZero() { return nil } @@ -391,7 +339,7 @@ func (pool *TransactionPool) checkSufficientFee(txgroup pooldata.SignedTxGroup) // get the current fee per byte feePerByte := pool.computeFeePerByte() - for _, t := range txgroup.Transactions { + for _, t := range txgroup { feeThreshold := feePerByte * uint64(t.GetEncodedLength()) if t.Txn.Fee.Raw < feeThreshold { return fmt.Errorf("fee %d below threshold %d (%d per byte * %d bytes)", @@ -425,7 +373,7 @@ type poolIngestParams struct { } // remember attempts to add a transaction group to the pool. -func (pool *TransactionPool) remember(txgroup pooldata.SignedTxGroup) error { +func (pool *TransactionPool) remember(txgroup []transactions.SignedTxn) error { params := poolIngestParams{ recomputing: false, } @@ -434,7 +382,7 @@ func (pool *TransactionPool) remember(txgroup pooldata.SignedTxGroup) error { // add tries to add the transaction group to the pool, bypassing the fee // priority checks. -func (pool *TransactionPool) add(txgroup pooldata.SignedTxGroup, stats *telemetryspec.AssembleBlockMetrics) error { +func (pool *TransactionPool) add(txgroup []transactions.SignedTxn, stats *telemetryspec.AssembleBlockMetrics) error { params := poolIngestParams{ recomputing: true, stats: stats, @@ -447,7 +395,7 @@ func (pool *TransactionPool) add(txgroup pooldata.SignedTxGroup, stats *telemetr // // ingest assumes that pool.mu is locked. It might release the lock // while it waits for OnNewBlock() to be called. -func (pool *TransactionPool) ingest(txgroup pooldata.SignedTxGroup, params poolIngestParams) error { +func (pool *TransactionPool) ingest(txgroup []transactions.SignedTxn, params poolIngestParams) error { if pool.pendingBlockEvaluator == nil { return fmt.Errorf("TransactionPool.ingest: no pending block evaluator") } @@ -469,10 +417,6 @@ func (pool *TransactionPool) ingest(txgroup pooldata.SignedTxGroup, params poolI if err != nil { return err } - - // since this is the first time the transaction was added to the transaction pool, it would - // be a good time now to figure the group's ID. - txgroup.GroupTransactionID = txgroup.Transactions.ID() } err := pool.addToPendingBlockEvaluator(txgroup, params.recomputing, params.stats) @@ -481,19 +425,22 @@ func (pool *TransactionPool) ingest(txgroup pooldata.SignedTxGroup, params poolI } pool.rememberedTxGroups = append(pool.rememberedTxGroups, txgroup) - for _, t := range txgroup.Transactions { + for _, t := range txgroup { pool.rememberedTxids[t.ID()] = t } - return nil } +// RememberOne stores the provided transaction. +// Precondition: Only RememberOne() properly-signed and well-formed transactions (i.e., ensure t.WellFormed()) +func (pool *TransactionPool) RememberOne(t transactions.SignedTxn) error { + return pool.Remember([]transactions.SignedTxn{t}) +} + // Remember stores the provided transaction group. // Precondition: Only Remember() properly-signed and well-formed transactions (i.e., ensure t.WellFormed()) -// The function is called by the transaction handler ( i.e. txsync or gossip ) or by the node when -// transaction is coming from a REST API call. -func (pool *TransactionPool) Remember(txgroup pooldata.SignedTxGroup) error { - if err := pool.checkPendingQueueSize(len(txgroup.Transactions)); err != nil { +func (pool *TransactionPool) Remember(txgroup []transactions.SignedTxn) error { + if err := pool.checkPendingQueueSize(len(txgroup)); err != nil { return err } @@ -509,34 +456,6 @@ func (pool *TransactionPool) Remember(txgroup pooldata.SignedTxGroup) error { return nil } -// RememberArray stores the provided transaction group. -// Precondition: Only RememberArray() properly-signed and well-formed transactions (i.e., ensure t.WellFormed()) -// The function is called by the transaction handler ( i.e. txsync ) -func (pool *TransactionPool) RememberArray(txgroups []pooldata.SignedTxGroup) error { - totalSize := 0 - for _, txGroup := range txgroups { - totalSize += len(txGroup.Transactions) - } - if err := pool.checkPendingQueueSize(totalSize); err != nil { - return err - } - - pool.mu.Lock() - defer pool.mu.Unlock() - - for _, txGroup := range txgroups { - err := pool.remember(txGroup) - if err != nil { - // we need to explicitly clear the remembered transaction groups here, since we might have added the first one successfully and then failing on the second one. - pool.resetRememberedTransactionGroups() - return fmt.Errorf("TransactionPool.RememberArray: %w", err) - } - } - - pool.rememberCommit(false) - return nil -} - // Lookup returns the error associated with a transaction that used // to be in the pool. If no status information is available (e.g., because // it was too long ago, or the transaction committed successfully), then @@ -640,9 +559,9 @@ func (pool *TransactionPool) isAssemblyTimedOut() bool { return time.Now().After(pool.assemblyDeadline.Add(-generateBlockDuration)) } -func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup pooldata.SignedTxGroup, recomputing bool, stats *telemetryspec.AssembleBlockMetrics) error { +func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup []transactions.SignedTxn, recomputing bool, stats *telemetryspec.AssembleBlockMetrics) error { r := pool.pendingBlockEvaluator.Round() + pool.numPendingWholeBlocks - for _, tx := range txgroup.Transactions { + for _, tx := range txgroup { if tx.Txn.LastValid < r { return transactions.TxnDeadError{ Round: r, @@ -652,7 +571,7 @@ func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup pooldata.Sig } } - txgroupad := transactions.WrapSignedTxnsWithAD(txgroup.Transactions) + txgroupad := transactions.WrapSignedTxnsWithAD(txgroup) transactionGroupStartsTime := time.Time{} if recomputing { @@ -705,7 +624,7 @@ func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup pooldata.Sig return err } -func (pool *TransactionPool) addToPendingBlockEvaluator(txgroup pooldata.SignedTxGroup, recomputing bool, stats *telemetryspec.AssembleBlockMetrics) error { +func (pool *TransactionPool) addToPendingBlockEvaluator(txgroup []transactions.SignedTxn, recomputing bool, stats *telemetryspec.AssembleBlockMetrics) error { err := pool.addToPendingBlockEvaluatorOnce(txgroup, recomputing, stats) if err == ledgercore.ErrNoSpace { pool.numPendingWholeBlocks++ @@ -762,7 +681,7 @@ func (pool *TransactionPool) recomputeBlockEvaluator(committedTxIds map[transact if hint < 0 || int(knownCommitted) < 0 { hint = 0 } - pool.pendingBlockEvaluator, err = pool.ledger.StartEvaluator(next.BlockHeader, hint, pool.calculateMaxTxnBytesPerBlock(next.BlockHeader.CurrentProtocol)) + pool.pendingBlockEvaluator, err = pool.ledger.StartEvaluator(next.BlockHeader, hint, 0) if err != nil { // The pendingBlockEvaluator is an interface, and in case of an evaluator error // we want to remove the interface itself rather then keeping an interface @@ -787,17 +706,17 @@ func (pool *TransactionPool) recomputeBlockEvaluator(committedTxIds map[transact // Feed the transactions in order for _, txgroup := range txgroups { - if len(txgroup.Transactions) == 0 { + if len(txgroup) == 0 { asmStats.InvalidCount++ continue } - if _, alreadyCommitted := committedTxIds[txgroup.Transactions[0].ID()]; alreadyCommitted { + if _, alreadyCommitted := committedTxIds[txgroup[0].ID()]; alreadyCommitted { asmStats.EarlyCommittedCount++ continue } err := pool.add(txgroup, &asmStats) if err != nil { - for _, tx := range txgroup.Transactions { + for _, tx := range txgroup { pool.statusCache.put(tx, err.Error()) } @@ -817,8 +736,6 @@ func (pool *TransactionPool) recomputeBlockEvaluator(committedTxIds map[transact stats.RemovedInvalidCount++ pool.log.Warnf("Cannot re-add pending transaction to pool: %v", err) } - } else if txgroup.LocallyOriginated { - pool.rememberedLatestLocal = txgroup.GroupCounter } } @@ -1002,7 +919,7 @@ func (pool *TransactionPool) assembleEmptyBlock(round basics.Round) (assembled * return nil, err } next := bookkeeping.MakeBlock(prev) - blockEval, err := pool.ledger.StartEvaluator(next.BlockHeader, 0, pool.calculateMaxTxnBytesPerBlock(next.BlockHeader.CurrentProtocol)) + blockEval, err := pool.ledger.StartEvaluator(next.BlockHeader, 0, 0) if err != nil { var nonSeqBlockEval ledgercore.ErrNonSequentialBlockEval if errors.As(err, &nonSeqBlockEval) { @@ -1018,46 +935,6 @@ func (pool *TransactionPool) assembleEmptyBlock(round basics.Round) (assembled * return blockEval.GenerateBlock() } -// SetDataExchangeRate updates the data exchange rate this node is expected to have. -func (pool *TransactionPool) SetDataExchangeRate(dataExchangeRate uint64) { - atomic.StoreUint64(&pool.latestMeasuredDataExchangeRate, dataExchangeRate) -} - -// calculateMaxTxnBytesPerBlock computes the optimal block size for the current node, based -// on it's effective network capabilities. This number is bound by the protocol MaxTxnBytesPerBlock. -func (pool *TransactionPool) calculateMaxTxnBytesPerBlock(consensusVersion protocol.ConsensusVersion) int { - // get the latest data exchange rate we received from the transaction sync. - dataExchangeRate := atomic.LoadUint64(&pool.latestMeasuredDataExchangeRate) - - // if we never received an update from the transaction sync connector about the data exchange rate, - // just let the evaluator use the consensus's default value. - if dataExchangeRate == 0 { - return 0 - } - - // get the consensus parameters for the given consensus version. - proto, ok := config.Consensus[consensusVersion] - if !ok { - // if we can't figure out the consensus version, just return 0. - return 0 - } - - // calculate the amount of data we can send in half of the agreement period. - halfMaxBlockSize := int(time.Duration(dataExchangeRate)*proto.AgreementFilterTimeoutPeriod0/time.Second) / 2 - - // if the amount of data is too high, bound it by the consensus parameters. - if halfMaxBlockSize > proto.MaxTxnBytesPerBlock { - return proto.MaxTxnBytesPerBlock - } - - // if the amount of data is too low, use the low transaction bytes threshold. - if halfMaxBlockSize < minMaxTxnBytesPerBlock { - return minMaxTxnBytesPerBlock - } - - return halfMaxBlockSize -} - // AssembleDevModeBlock assemble a new block from the existing transaction pool. The pending evaluator is being func (pool *TransactionPool) AssembleDevModeBlock() (assembled *ledgercore.ValidatedBlock, err error) { pool.mu.Lock() diff --git a/data/pools/transactionPool_test.go b/data/pools/transactionPool_test.go index 58b825f601..4e65333b6b 100644 --- a/data/pools/transactionPool_test.go +++ b/data/pools/transactionPool_test.go @@ -29,7 +29,6 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/ledger" @@ -56,15 +55,6 @@ type TestingT interface { var minBalance = config.Consensus[protocol.ConsensusCurrentVersion].MinBalance -// RememberOne stores the provided transaction. -// Precondition: Only RememberOne() properly-signed and well-formed transactions (i.e., ensure t.WellFormed()) -func (pool *TransactionPool) RememberOne(t transactions.SignedTxn) error { - txgroup := pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{t}, - } - return pool.Remember(txgroup) -} - func mockLedger(t TestingT, initAccounts map[basics.Address]basics.AccountData, proto protocol.ConsensusVersion) *ledger.Ledger { var hash crypto.Digest crypto.RandBytes(hash[:]) @@ -97,7 +87,7 @@ func mockLedger(t TestingT, initAccounts map[basics.Address]basics.AccountData, const inMem = true genesisInitState := ledgercore.InitState{Block: initBlock, Accounts: initAccounts, GenesisHash: hash} cfg := config.GetDefaultLocal() - cfg.Archival = false + cfg.Archival = true l, err := ledger.OpenLedger(logging.Base(), fn, true, genesisInitState, cfg) require.NoError(t, err) return l @@ -568,7 +558,7 @@ func TestRememberForget(t *testing.T) { } } - pending, _ := transactionPool.PendingTxGroups() + pending := transactionPool.PendingTxGroups() numberOfTxns := numOfAccounts*numOfAccounts - numOfAccounts require.Len(t, pending, numberOfTxns) @@ -579,7 +569,7 @@ func TestRememberForget(t *testing.T) { require.NoError(t, err) transactionPool.OnNewBlock(blk.Block(), ledgercore.StateDelta{}) - pending, _ = transactionPool.PendingTxGroups() + pending = transactionPool.PendingTxGroups() require.Len(t, pending, 0) } @@ -644,7 +634,7 @@ func TestCleanUp(t *testing.T) { transactionPool.OnNewBlock(blk.Block(), ledgercore.StateDelta{}) } - pending, _ := transactionPool.PendingTxGroups() + pending := transactionPool.PendingTxGroups() require.Zero(t, len(pending)) require.Zero(t, transactionPool.NumExpired(4)) require.Equal(t, issuedTransactions, transactionPool.NumExpired(5)) @@ -718,7 +708,7 @@ func TestFixOverflowOnNewBlock(t *testing.T) { } } } - pending, _ := transactionPool.PendingTxGroups() + pending := transactionPool.PendingTxGroups() require.Len(t, pending, savedTransactions) secret := keypair() @@ -754,7 +744,7 @@ func TestFixOverflowOnNewBlock(t *testing.T) { transactionPool.OnNewBlock(block.Block(), ledgercore.StateDelta{}) - pending, _ = transactionPool.PendingTxGroups() + pending = transactionPool.PendingTxGroups() // only one transaction is missing require.Len(t, pending, savedTransactions-1) } @@ -862,15 +852,7 @@ func TestRemove(t *testing.T) { } signedTx := tx.Sign(secrets[0]) require.NoError(t, transactionPool.RememberOne(signedTx)) - pendingTxGroups, _ := transactionPool.PendingTxGroups() - require.Equal(t, []pooldata.SignedTxGroup{ - { - Transactions: []transactions.SignedTxn{signedTx}, - GroupCounter: 1, - GroupTransactionID: (pooldata.SignedTxnSlice{signedTx}).ID(), - EncodedLength: len(signedTx.MarshalMsg([]byte{})), - }, - }, pendingTxGroups) + require.Equal(t, transactionPool.PendingTxGroups(), [][]transactions.SignedTxn{{signedTx}}) } func TestLogicSigOK(t *testing.T) { @@ -1256,7 +1238,7 @@ func TestTxPoolSizeLimits(t *testing.T) { } for groupSize := config.Consensus[protocol.ConsensusCurrentVersion].MaxTxGroupSize; groupSize > 0; groupSize-- { - var txgroup pooldata.SignedTxGroup + var txgroup []transactions.SignedTxn // fill the transaction group with groupSize transactions. for i := 0; i < groupSize; i++ { tx := transactions.Transaction{ @@ -1275,7 +1257,7 @@ func TestTxPoolSizeLimits(t *testing.T) { }, } signedTx := tx.Sign(secrets[0]) - txgroup.Transactions = append(txgroup.Transactions, signedTx) + txgroup = append(txgroup, signedTx) uniqueTxID++ } @@ -1285,7 +1267,7 @@ func TestTxPoolSizeLimits(t *testing.T) { if groupSize > 1 { // add a single transaction and ensure we succeed // consume the transaction of allowed limit - require.NoError(t, transactionPool.RememberOne(txgroup.Transactions[0])) + require.NoError(t, transactionPool.RememberOne(txgroup[0])) } } } diff --git a/data/transactions/application.go b/data/transactions/application.go index 1faef7998d..4588ed22f8 100644 --- a/data/transactions/application.go +++ b/data/transactions/application.go @@ -23,29 +23,29 @@ import ( ) const ( - // EncodedMaxApplicationArgs sets the allocation bound for the maximum + // encodedMaxApplicationArgs sets the allocation bound for the maximum // number of ApplicationArgs that a transaction decoded off of the wire // can contain. Its value is verified against consensus parameters in // TestEncodedAppTxnAllocationBounds - EncodedMaxApplicationArgs = 32 + encodedMaxApplicationArgs = 32 - // EncodedMaxAccounts sets the allocation bound for the maximum number + // encodedMaxAccounts sets the allocation bound for the maximum number // of Accounts that a transaction decoded off of the wire can contain. // Its value is verified against consensus parameters in // TestEncodedAppTxnAllocationBounds - EncodedMaxAccounts = 32 + encodedMaxAccounts = 32 - // EncodedMaxForeignApps sets the allocation bound for the maximum + // encodedMaxForeignApps sets the allocation bound for the maximum // number of ForeignApps that a transaction decoded off of the wire can // contain. Its value is verified against consensus parameters in // TestEncodedAppTxnAllocationBounds - EncodedMaxForeignApps = 32 + encodedMaxForeignApps = 32 - // EncodedMaxForeignAssets sets the allocation bound for the maximum + // encodedMaxForeignAssets sets the allocation bound for the maximum // number of ForeignAssets that a transaction decoded off of the wire // can contain. Its value is verified against consensus parameters in // TestEncodedAppTxnAllocationBounds - EncodedMaxForeignAssets = 32 + encodedMaxForeignAssets = 32 ) // OnCompletion is an enum representing some layer 1 side effect that an @@ -100,7 +100,7 @@ type ApplicationCallTxnFields struct { // ApplicationArgs are arguments accessible to the executing // ApprovalProgram or ClearStateProgram. - ApplicationArgs [][]byte `codec:"apaa,allocbound=EncodedMaxApplicationArgs"` + ApplicationArgs [][]byte `codec:"apaa,allocbound=encodedMaxApplicationArgs"` // Accounts are accounts whose balance records are accessible // by the executing ApprovalProgram or ClearStateProgram. To @@ -108,17 +108,17 @@ type ApplicationCallTxnFields struct { // the sender, that account's address must be listed here (and // since v4, the ForeignApp or ForeignAsset must also include // the app or asset id). - Accounts []basics.Address `codec:"apat,allocbound=EncodedMaxAccounts"` + Accounts []basics.Address `codec:"apat,allocbound=encodedMaxAccounts"` // ForeignApps are application IDs for applications besides // this one whose GlobalState (or Local, since v4) may be read // by the executing ApprovalProgram or ClearStateProgram. - ForeignApps []basics.AppIndex `codec:"apfa,allocbound=EncodedMaxForeignApps"` + ForeignApps []basics.AppIndex `codec:"apfa,allocbound=encodedMaxForeignApps"` // ForeignAssets are asset IDs for assets whose AssetParams // (and since v4, Holdings) may be read by the executing // ApprovalProgram or ClearStateProgram. - ForeignAssets []basics.AssetIndex `codec:"apas,allocbound=EncodedMaxForeignAssets"` + ForeignAssets []basics.AssetIndex `codec:"apas,allocbound=encodedMaxForeignAssets"` // LocalStateSchema specifies the maximum number of each type that may // appear in the local key/value store of users who opt in to this diff --git a/data/transactions/application_test.go b/data/transactions/application_test.go index 28a48e4c4f..5d50d71266 100644 --- a/data/transactions/application_test.go +++ b/data/transactions/application_test.go @@ -103,16 +103,16 @@ func TestEncodedAppTxnAllocationBounds(t *testing.T) { // ensure that all the supported protocols have value limits less or // equal to their corresponding codec allocbounds for protoVer, proto := range config.Consensus { - if proto.MaxAppArgs > EncodedMaxApplicationArgs { + if proto.MaxAppArgs > encodedMaxApplicationArgs { require.Failf(t, "proto.MaxAppArgs > encodedMaxApplicationArgs", "protocol version = %s", protoVer) } - if proto.MaxAppTxnAccounts > EncodedMaxAccounts { + if proto.MaxAppTxnAccounts > encodedMaxAccounts { require.Failf(t, "proto.MaxAppTxnAccounts > encodedMaxAccounts", "protocol version = %s", protoVer) } - if proto.MaxAppTxnForeignApps > EncodedMaxForeignApps { + if proto.MaxAppTxnForeignApps > encodedMaxForeignApps { require.Failf(t, "proto.MaxAppTxnForeignApps > encodedMaxForeignApps", "protocol version = %s", protoVer) } - if proto.MaxAppTxnForeignAssets > EncodedMaxForeignAssets { + if proto.MaxAppTxnForeignAssets > encodedMaxForeignAssets { require.Failf(t, "proto.MaxAppTxnForeignAssets > encodedMaxForeignAssets", "protocol version = %s", protoVer) } } diff --git a/data/transactions/msgp_gen.go b/data/transactions/msgp_gen.go index 218c86fa26..009de07b5b 100644 --- a/data/transactions/msgp_gen.go +++ b/data/transactions/msgp_gen.go @@ -360,8 +360,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") return } - if zb0008 > EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0008), uint64(EncodedMaxApplicationArgs)) + if zb0008 > encodedMaxApplicationArgs { + err = msgp.ErrOverflow(uint64(zb0008), uint64(encodedMaxApplicationArgs)) err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") return } @@ -389,8 +389,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "struct-from-array", "Accounts") return } - if zb0010 > EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0010), uint64(EncodedMaxAccounts)) + if zb0010 > encodedMaxAccounts { + err = msgp.ErrOverflow(uint64(zb0010), uint64(encodedMaxAccounts)) err = msgp.WrapError(err, "struct-from-array", "Accounts") return } @@ -418,8 +418,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "struct-from-array", "ForeignApps") return } - if zb0012 > EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0012), uint64(EncodedMaxForeignApps)) + if zb0012 > encodedMaxForeignApps { + err = msgp.ErrOverflow(uint64(zb0012), uint64(encodedMaxForeignApps)) err = msgp.WrapError(err, "struct-from-array", "ForeignApps") return } @@ -447,8 +447,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") return } - if zb0014 > EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0014), uint64(EncodedMaxForeignAssets)) + if zb0014 > encodedMaxForeignAssets { + err = msgp.ErrOverflow(uint64(zb0014), uint64(encodedMaxForeignAssets)) err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") return } @@ -574,8 +574,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "ApplicationArgs") return } - if zb0019 > EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0019), uint64(EncodedMaxApplicationArgs)) + if zb0019 > encodedMaxApplicationArgs { + err = msgp.ErrOverflow(uint64(zb0019), uint64(encodedMaxApplicationArgs)) err = msgp.WrapError(err, "ApplicationArgs") return } @@ -601,8 +601,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "Accounts") return } - if zb0021 > EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0021), uint64(EncodedMaxAccounts)) + if zb0021 > encodedMaxAccounts { + err = msgp.ErrOverflow(uint64(zb0021), uint64(encodedMaxAccounts)) err = msgp.WrapError(err, "Accounts") return } @@ -628,8 +628,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "ForeignApps") return } - if zb0023 > EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0023), uint64(EncodedMaxForeignApps)) + if zb0023 > encodedMaxForeignApps { + err = msgp.ErrOverflow(uint64(zb0023), uint64(encodedMaxForeignApps)) err = msgp.WrapError(err, "ForeignApps") return } @@ -655,8 +655,8 @@ func (z *ApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error err = msgp.WrapError(err, "ForeignAssets") return } - if zb0025 > EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0025), uint64(EncodedMaxForeignAssets)) + if zb0025 > encodedMaxForeignAssets { + err = msgp.ErrOverflow(uint64(zb0025), uint64(encodedMaxForeignAssets)) err = msgp.WrapError(err, "ForeignAssets") return } @@ -2056,7 +2056,7 @@ func (z *Header) MarshalMsg(b []byte) (o []byte) { zb0002Len-- zb0002Mask |= 0x40 } - if (*z).Lease == ([LeaseByteLength]byte{}) { + if (*z).Lease == ([32]byte{}) { zb0002Len-- zb0002Mask |= 0x80 } @@ -2350,13 +2350,13 @@ func (_ *Header) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Header) Msgsize() (s int) { - s = 1 + 4 + (*z).Sender.Msgsize() + 4 + (*z).Fee.Msgsize() + 3 + (*z).FirstValid.Msgsize() + 3 + (*z).LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Note) + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 4 + (*z).Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (LeaseByteLength * (msgp.ByteSize)) + 6 + (*z).RekeyTo.Msgsize() + s = 1 + 4 + (*z).Sender.Msgsize() + 4 + (*z).Fee.Msgsize() + 3 + (*z).FirstValid.Msgsize() + 3 + (*z).LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Note) + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 4 + (*z).Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + (*z).RekeyTo.Msgsize() return } // MsgIsZero returns whether this is a zero value func (z *Header) MsgIsZero() bool { - return ((*z).Sender.MsgIsZero()) && ((*z).Fee.MsgIsZero()) && ((*z).FirstValid.MsgIsZero()) && ((*z).LastValid.MsgIsZero()) && (len((*z).Note) == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).Group.MsgIsZero()) && ((*z).Lease == ([LeaseByteLength]byte{})) && ((*z).RekeyTo.MsgIsZero()) + return ((*z).Sender.MsgIsZero()) && ((*z).Fee.MsgIsZero()) && ((*z).FirstValid.MsgIsZero()) && ((*z).LastValid.MsgIsZero()) && (len((*z).Note) == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).Group.MsgIsZero()) && ((*z).Lease == ([32]byte{})) && ((*z).RekeyTo.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -4302,7 +4302,7 @@ func (z *Transaction) MarshalMsg(b []byte) (o []byte) { zb0006Len-- zb0006Mask |= 0x8000000000 } - if (*z).Header.Lease == ([LeaseByteLength]byte{}) { + if (*z).Header.Lease == ([32]byte{}) { zb0006Len-- zb0006Mask |= 0x10000000000 } @@ -4906,8 +4906,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") return } - if zb0010 > EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0010), uint64(EncodedMaxApplicationArgs)) + if zb0010 > encodedMaxApplicationArgs { + err = msgp.ErrOverflow(uint64(zb0010), uint64(encodedMaxApplicationArgs)) err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") return } @@ -4935,8 +4935,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "Accounts") return } - if zb0012 > EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0012), uint64(EncodedMaxAccounts)) + if zb0012 > encodedMaxAccounts { + err = msgp.ErrOverflow(uint64(zb0012), uint64(encodedMaxAccounts)) err = msgp.WrapError(err, "struct-from-array", "Accounts") return } @@ -4964,8 +4964,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "ForeignApps") return } - if zb0014 > EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0014), uint64(EncodedMaxForeignApps)) + if zb0014 > encodedMaxForeignApps { + err = msgp.ErrOverflow(uint64(zb0014), uint64(encodedMaxForeignApps)) err = msgp.WrapError(err, "struct-from-array", "ForeignApps") return } @@ -4993,8 +4993,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") return } - if zb0016 > EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0016), uint64(EncodedMaxForeignAssets)) + if zb0016 > encodedMaxForeignAssets { + err = msgp.ErrOverflow(uint64(zb0016), uint64(encodedMaxForeignAssets)) err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") return } @@ -5334,8 +5334,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "ApplicationArgs") return } - if zb0022 > EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0022), uint64(EncodedMaxApplicationArgs)) + if zb0022 > encodedMaxApplicationArgs { + err = msgp.ErrOverflow(uint64(zb0022), uint64(encodedMaxApplicationArgs)) err = msgp.WrapError(err, "ApplicationArgs") return } @@ -5361,8 +5361,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Accounts") return } - if zb0024 > EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0024), uint64(EncodedMaxAccounts)) + if zb0024 > encodedMaxAccounts { + err = msgp.ErrOverflow(uint64(zb0024), uint64(encodedMaxAccounts)) err = msgp.WrapError(err, "Accounts") return } @@ -5388,8 +5388,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "ForeignApps") return } - if zb0026 > EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0026), uint64(EncodedMaxForeignApps)) + if zb0026 > encodedMaxForeignApps { + err = msgp.ErrOverflow(uint64(zb0026), uint64(encodedMaxForeignApps)) err = msgp.WrapError(err, "ForeignApps") return } @@ -5415,8 +5415,8 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "ForeignAssets") return } - if zb0028 > EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0028), uint64(EncodedMaxForeignAssets)) + if zb0028 > encodedMaxForeignAssets { + err = msgp.ErrOverflow(uint64(zb0028), uint64(encodedMaxForeignAssets)) err = msgp.WrapError(err, "ForeignAssets") return } @@ -5522,7 +5522,7 @@ func (_ *Transaction) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Transaction) Msgsize() (s int) { - s = 3 + 5 + (*z).Type.Msgsize() + 4 + (*z).Header.Sender.Msgsize() + 4 + (*z).Header.Fee.Msgsize() + 3 + (*z).Header.FirstValid.Msgsize() + 3 + (*z).Header.LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Header.Note) + 4 + msgp.StringPrefixSize + len((*z).Header.GenesisID) + 3 + (*z).Header.GenesisHash.Msgsize() + 4 + (*z).Header.Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (LeaseByteLength * (msgp.ByteSize)) + 6 + (*z).Header.RekeyTo.Msgsize() + 8 + (*z).KeyregTxnFields.VotePK.Msgsize() + 7 + (*z).KeyregTxnFields.SelectionPK.Msgsize() + 8 + (*z).KeyregTxnFields.VoteFirst.Msgsize() + 8 + (*z).KeyregTxnFields.VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize + 4 + (*z).PaymentTxnFields.Receiver.Msgsize() + 4 + (*z).PaymentTxnFields.Amount.Msgsize() + 6 + (*z).PaymentTxnFields.CloseRemainderTo.Msgsize() + 5 + (*z).AssetConfigTxnFields.ConfigAsset.Msgsize() + 5 + (*z).AssetConfigTxnFields.AssetParams.Msgsize() + 5 + (*z).AssetTransferTxnFields.XferAsset.Msgsize() + 5 + msgp.Uint64Size + 5 + (*z).AssetTransferTxnFields.AssetSender.Msgsize() + 5 + (*z).AssetTransferTxnFields.AssetReceiver.Msgsize() + 7 + (*z).AssetTransferTxnFields.AssetCloseTo.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAccount.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAsset.Msgsize() + 5 + msgp.BoolSize + 5 + (*z).ApplicationCallTxnFields.ApplicationID.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.ArrayHeaderSize + s = 3 + 5 + (*z).Type.Msgsize() + 4 + (*z).Header.Sender.Msgsize() + 4 + (*z).Header.Fee.Msgsize() + 3 + (*z).Header.FirstValid.Msgsize() + 3 + (*z).Header.LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Header.Note) + 4 + msgp.StringPrefixSize + len((*z).Header.GenesisID) + 3 + (*z).Header.GenesisHash.Msgsize() + 4 + (*z).Header.Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + (*z).Header.RekeyTo.Msgsize() + 8 + (*z).KeyregTxnFields.VotePK.Msgsize() + 7 + (*z).KeyregTxnFields.SelectionPK.Msgsize() + 8 + (*z).KeyregTxnFields.VoteFirst.Msgsize() + 8 + (*z).KeyregTxnFields.VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize + 4 + (*z).PaymentTxnFields.Receiver.Msgsize() + 4 + (*z).PaymentTxnFields.Amount.Msgsize() + 6 + (*z).PaymentTxnFields.CloseRemainderTo.Msgsize() + 5 + (*z).AssetConfigTxnFields.ConfigAsset.Msgsize() + 5 + (*z).AssetConfigTxnFields.AssetParams.Msgsize() + 5 + (*z).AssetTransferTxnFields.XferAsset.Msgsize() + 5 + msgp.Uint64Size + 5 + (*z).AssetTransferTxnFields.AssetSender.Msgsize() + 5 + (*z).AssetTransferTxnFields.AssetReceiver.Msgsize() + 7 + (*z).AssetTransferTxnFields.AssetCloseTo.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAccount.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAsset.Msgsize() + 5 + msgp.BoolSize + 5 + (*z).ApplicationCallTxnFields.ApplicationID.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.ArrayHeaderSize for zb0002 := range (*z).ApplicationCallTxnFields.ApplicationArgs { s += msgp.BytesPrefixSize + len((*z).ApplicationCallTxnFields.ApplicationArgs[zb0002]) } @@ -5544,7 +5544,7 @@ func (z *Transaction) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *Transaction) MsgIsZero() bool { - return ((*z).Type.MsgIsZero()) && ((*z).Header.Sender.MsgIsZero()) && ((*z).Header.Fee.MsgIsZero()) && ((*z).Header.FirstValid.MsgIsZero()) && ((*z).Header.LastValid.MsgIsZero()) && (len((*z).Header.Note) == 0) && ((*z).Header.GenesisID == "") && ((*z).Header.GenesisHash.MsgIsZero()) && ((*z).Header.Group.MsgIsZero()) && ((*z).Header.Lease == ([LeaseByteLength]byte{})) && ((*z).Header.RekeyTo.MsgIsZero()) && ((*z).KeyregTxnFields.VotePK.MsgIsZero()) && ((*z).KeyregTxnFields.SelectionPK.MsgIsZero()) && ((*z).KeyregTxnFields.VoteFirst.MsgIsZero()) && ((*z).KeyregTxnFields.VoteLast.MsgIsZero()) && ((*z).KeyregTxnFields.VoteKeyDilution == 0) && ((*z).KeyregTxnFields.Nonparticipation == false) && ((*z).PaymentTxnFields.Receiver.MsgIsZero()) && ((*z).PaymentTxnFields.Amount.MsgIsZero()) && ((*z).PaymentTxnFields.CloseRemainderTo.MsgIsZero()) && ((*z).AssetConfigTxnFields.ConfigAsset.MsgIsZero()) && ((*z).AssetConfigTxnFields.AssetParams.MsgIsZero()) && ((*z).AssetTransferTxnFields.XferAsset.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetAmount == 0) && ((*z).AssetTransferTxnFields.AssetSender.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetReceiver.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetCloseTo.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAccount.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAsset.MsgIsZero()) && ((*z).AssetFreezeTxnFields.AssetFrozen == false) && ((*z).ApplicationCallTxnFields.ApplicationID.MsgIsZero()) && ((*z).ApplicationCallTxnFields.OnCompletion == 0) && (len((*z).ApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).ApplicationCallTxnFields.Accounts) == 0) && (len((*z).ApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).ApplicationCallTxnFields.ForeignAssets) == 0) && ((*z).ApplicationCallTxnFields.LocalStateSchema.MsgIsZero()) && ((*z).ApplicationCallTxnFields.GlobalStateSchema.MsgIsZero()) && (len((*z).ApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).ApplicationCallTxnFields.ClearStateProgram) == 0) && ((*z).ApplicationCallTxnFields.ExtraProgramPages == 0) && ((*z).CompactCertTxnFields.CertRound.MsgIsZero()) && ((*z).CompactCertTxnFields.CertType.MsgIsZero()) && ((*z).CompactCertTxnFields.Cert.MsgIsZero()) + return ((*z).Type.MsgIsZero()) && ((*z).Header.Sender.MsgIsZero()) && ((*z).Header.Fee.MsgIsZero()) && ((*z).Header.FirstValid.MsgIsZero()) && ((*z).Header.LastValid.MsgIsZero()) && (len((*z).Header.Note) == 0) && ((*z).Header.GenesisID == "") && ((*z).Header.GenesisHash.MsgIsZero()) && ((*z).Header.Group.MsgIsZero()) && ((*z).Header.Lease == ([32]byte{})) && ((*z).Header.RekeyTo.MsgIsZero()) && ((*z).KeyregTxnFields.VotePK.MsgIsZero()) && ((*z).KeyregTxnFields.SelectionPK.MsgIsZero()) && ((*z).KeyregTxnFields.VoteFirst.MsgIsZero()) && ((*z).KeyregTxnFields.VoteLast.MsgIsZero()) && ((*z).KeyregTxnFields.VoteKeyDilution == 0) && ((*z).KeyregTxnFields.Nonparticipation == false) && ((*z).PaymentTxnFields.Receiver.MsgIsZero()) && ((*z).PaymentTxnFields.Amount.MsgIsZero()) && ((*z).PaymentTxnFields.CloseRemainderTo.MsgIsZero()) && ((*z).AssetConfigTxnFields.ConfigAsset.MsgIsZero()) && ((*z).AssetConfigTxnFields.AssetParams.MsgIsZero()) && ((*z).AssetTransferTxnFields.XferAsset.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetAmount == 0) && ((*z).AssetTransferTxnFields.AssetSender.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetReceiver.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetCloseTo.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAccount.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAsset.MsgIsZero()) && ((*z).AssetFreezeTxnFields.AssetFrozen == false) && ((*z).ApplicationCallTxnFields.ApplicationID.MsgIsZero()) && ((*z).ApplicationCallTxnFields.OnCompletion == 0) && (len((*z).ApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).ApplicationCallTxnFields.Accounts) == 0) && (len((*z).ApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).ApplicationCallTxnFields.ForeignAssets) == 0) && ((*z).ApplicationCallTxnFields.LocalStateSchema.MsgIsZero()) && ((*z).ApplicationCallTxnFields.GlobalStateSchema.MsgIsZero()) && (len((*z).ApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).ApplicationCallTxnFields.ClearStateProgram) == 0) && ((*z).ApplicationCallTxnFields.ExtraProgramPages == 0) && ((*z).CompactCertTxnFields.CertRound.MsgIsZero()) && ((*z).CompactCertTxnFields.CertType.MsgIsZero()) && ((*z).CompactCertTxnFields.Cert.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index baf40a312f..fb356bb04d 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -29,9 +29,6 @@ import ( // Txid is a hash used to uniquely identify individual transactions type Txid crypto.Digest -// LeaseByteLength is the byte length of a lease -const LeaseByteLength = int(32) - // String converts txid to a pretty-printable string func (txid Txid) String() string { return fmt.Sprintf("%v", crypto.Digest(txid)) @@ -72,7 +69,7 @@ type Header struct { // lease identified by the (Sender, Lease) pair of the transaction until // the LastValid round passes. While this transaction possesses the // lease, no other transaction specifying this lease can be confirmed. - Lease [LeaseByteLength]byte `codec:"lx"` + Lease [32]byte `codec:"lx"` // RekeyTo, if nonzero, sets the sender's AuthAddr to the given address // If the RekeyTo address is the sender's actual address, the AuthAddr is set to zero diff --git a/data/transactions/verify/verifiedTxnCache.go b/data/transactions/verify/verifiedTxnCache.go index 2e228c4fc9..0c9bbe2c02 100644 --- a/data/transactions/verify/verifiedTxnCache.go +++ b/data/transactions/verify/verifiedTxnCache.go @@ -21,7 +21,6 @@ import ( "github.com/algorand/go-deadlock" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/protocol" @@ -68,8 +67,6 @@ type VerifiedTransactionCache interface { UpdatePinned(pinnedTxns map[transactions.Txid]transactions.SignedTxn) error // Pin function would mark the given transaction group as pinned. Pin(txgroup []transactions.SignedTxn) error - // PinGroups function would mark the given transaction groups as pinned. - PinGroups(txgroups []pooldata.SignedTxGroup) error } // verifiedTransactionCache provides an implementation of the VerifiedTransactionCache interface @@ -209,25 +206,6 @@ func (v *verifiedTransactionCache) UpdatePinned(pinnedTxns map[transactions.Txid func (v *verifiedTransactionCache) Pin(txgroup []transactions.SignedTxn) (err error) { v.bucketsLock.Lock() defer v.bucketsLock.Unlock() - return v.pin(txgroup) -} - -// PinGroups function would mark the given transaction groups as pinned. -func (v *verifiedTransactionCache) PinGroups(txgroups []pooldata.SignedTxGroup) error { - v.bucketsLock.Lock() - defer v.bucketsLock.Unlock() - var outError error - for _, txgroup := range txgroups { - err := v.pin(txgroup.Transactions) - if err != nil { - outError = err - } - } - return outError -} - -// Pin sets a given transaction group as pinned items, after they have already been verified. -func (v *verifiedTransactionCache) pin(txgroup []transactions.SignedTxn) (err error) { transactionMissing := false if len(v.pinned)+len(txgroup) > maxPinnedEntries { // reaching this number likely means that we have an issue not removing entries from the pinned map. @@ -305,10 +283,6 @@ func (v *mockedCache) UpdatePinned(pinnedTxns map[transactions.Txid]transactions return nil } -func (v *mockedCache) PinGroups(txgroups []pooldata.SignedTxGroup) error { - return nil -} - func (v *mockedCache) Pin(txgroup []transactions.SignedTxn) (err error) { return nil } diff --git a/data/txHandler.go b/data/txHandler.go index 0ecef433c1..fa8bf250be 100644 --- a/data/txHandler.go +++ b/data/txHandler.go @@ -25,11 +25,9 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/pools" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/verify" - "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" @@ -177,7 +175,7 @@ func (handler *TxHandler) postprocessCheckedTxn(wi *txBacklogMsg) { verifiedTxGroup := wi.unverifiedTxGroup // save the transaction, if it has high enough fee and not already in the cache - err := handler.txPool.Remember(pooldata.SignedTxGroup{Transactions: verifiedTxGroup}) + err := handler.txPool.Remember(verifiedTxGroup) if err != nil { logging.Base().Debugf("could not remember tx: %v", err) return @@ -265,6 +263,12 @@ func (handler *TxHandler) processIncomingTxn(rawmsg network.IncomingMessage) net // Note that this also checks the consistency of the transaction's group hash, // which is required for safe transaction signature caching behavior. func (handler *TxHandler) checkAlreadyCommitted(tx *txBacklogMsg) (processingDone bool) { + txids := make([]transactions.Txid, len(tx.unverifiedTxGroup)) + for i := range tx.unverifiedTxGroup { + txids[i] = tx.unverifiedTxGroup[i].ID() + } + logging.Base().Debugf("got a tx group with IDs %v", txids) + // do a quick test to check that this transaction could potentially be committed, to reject dup pending transactions err := handler.txPool.Test(tx.unverifiedTxGroup) if err != nil { @@ -274,12 +278,12 @@ func (handler *TxHandler) checkAlreadyCommitted(tx *txBacklogMsg) (processingDon return false } -func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.SignedTxn) (disconnect bool) { +func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.SignedTxn) (outmsg network.OutgoingMessage, processingDone bool) { tx := &txBacklogMsg{ unverifiedTxGroup: unverifiedTxGroup, } if handler.checkAlreadyCommitted(tx) { - return false + return network.OutgoingMessage{}, true } // build the transaction verification context @@ -287,7 +291,7 @@ func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.Signed latestHdr, err := handler.ledger.BlockHdr(latest) if err != nil { logging.Base().Warnf("Could not get header for previous block %v: %v", latest, err) - return false + return network.OutgoingMessage{}, true } unverifiedTxnGroups := bookkeeping.SignedTxnsToGroups(unverifiedTxGroup) @@ -295,7 +299,7 @@ func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.Signed if err != nil { // transaction is invalid logging.Base().Warnf("One or more transactions were malformed: %v", err) - return true + return network.OutgoingMessage{Action: network.Disconnect}, true } // at this point, we've verified the transaction group, @@ -303,10 +307,10 @@ func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.Signed verifiedTxGroup := unverifiedTxGroup // save the transaction, if it has high enough fee and not already in the cache - err = handler.txPool.Remember(pooldata.SignedTxGroup{Transactions: verifiedTxGroup}) + err = handler.txPool.Remember(verifiedTxGroup) if err != nil { logging.Base().Debugf("could not remember tx: %v", err) - return false + return network.OutgoingMessage{}, true } // if we remembered without any error ( i.e. txpool wasn't full ), then we should pin these transactions. @@ -315,98 +319,7 @@ func (handler *TxHandler) processDecoded(unverifiedTxGroup []transactions.Signed logging.Base().Warnf("unable to pin transaction: %v", err) } - return false -} - -// filterAlreadyCommitted scan the list of signed transaction groups, and filter out the ones that have already been included, -// or that should not be added to the transaction pool. -// the resulting slice is using the *same* underlying array as the input slice, and the caller must ensure that this would not -// cause issue on the caller side. The hasError describe whether any of the removed transacation groups was -// removed for a reason *other* than being duplicate ( for instance, malformed transaction ) -func (handler *TxHandler) filterAlreadyCommitted(unverifiedTxGroups []pooldata.SignedTxGroup) (filteredGroups []pooldata.SignedTxGroup, hasError bool) { - remainedTxnsGroupOffset := 0 - for idx, utxng := range unverifiedTxGroups { - err := handler.txPool.Test(utxng.Transactions) - switch err.(type) { - case nil: - // no error was generated. - if remainedTxnsGroupOffset != idx { - unverifiedTxGroups[remainedTxnsGroupOffset] = utxng - } - remainedTxnsGroupOffset++ - case *ledgercore.TransactionInLedgerError: - // this is a duplicate transaction group. - default: - // some non-duplicate error was reported on this group. - hasError = true - } - } - return unverifiedTxGroups[:remainedTxnsGroupOffset], hasError -} - -// processDecodedArray receives a slice of transaction groups and attempt to add them to the transaction pool. -// The processDecodedArray returns whether the node should be disconnecting from the source of these transactions ( in case a malicious transaction is found ) -// as well as whether all the provided transactions were included in the transaction pool or committed. -func (handler *TxHandler) processDecodedArray(unverifiedTxGroups []pooldata.SignedTxGroup) (disconnect, allTransactionIncluded bool) { - var hasError bool - unverifiedTxGroups, hasError = handler.filterAlreadyCommitted(unverifiedTxGroups) - - if len(unverifiedTxGroups) == 0 { - return false, !hasError - } - - // build the transaction verification context - latest := handler.ledger.Latest() - latestHdr, err := handler.ledger.BlockHdr(latest) - if err != nil { - // being unable to retrieve the last's block header is not something a working node is expected to expirience ( ever ). - logging.Base().Errorf("Could not get header for previous block %d: %v", latest, err) - // returning a disconnect=true, would not fix the problem for the local node, but would force the remote node to pick a different - // relay, which ( hopefully ! ) would not have the same issue as this one. - return true, false - } - - unverifiedTxnGroups := make([][]transactions.SignedTxn, len(unverifiedTxGroups)) - for i, unverifiedGroup := range unverifiedTxGroups { - unverifiedTxnGroups[i] = unverifiedGroup.Transactions - } - - err = verify.PaysetGroups(context.Background(), unverifiedTxnGroups, latestHdr, handler.txVerificationPool, handler.ledger.VerifiedTransactionCache()) - if err != nil { - // transaction is invalid - logging.Base().Warnf("One or more transactions were malformed: %v", err) - return true, false - } - - // at this point, we've verified the transaction group, - // so we can safely treat the transaction as a verified transaction. - verifiedTxGroups := unverifiedTxGroups - - // before calling RememberArray we should reallocate the individual remaining - // signed transactions - these transactions were allocated in bulk by the - // transaction sync. By re-allocating the backing storage, we would allow the - // original backing storage ( which includes transactions that won't go into the - // transaction pool ) to be garbge collected. - for i, group := range verifiedTxGroups { - copiedTransactions := make(pooldata.SignedTxnSlice, len(group.Transactions)) - copy(copiedTransactions, group.Transactions) - verifiedTxGroups[i].Transactions = copiedTransactions - } - - // save the transaction, if it has high enough fee and not already in the cache - err = handler.txPool.RememberArray(verifiedTxGroups) - if err != nil { - logging.Base().Debugf("could not remember tx: %v", err) - return false, false - } - - // if we remembered without any error ( i.e. txpool wasn't full ), then we should pin these transactions. - err = handler.ledger.VerifiedTransactionCache().PinGroups(verifiedTxGroups) - if err != nil { - logging.Base().Warnf("unable to pin transaction: %v", err) - } - - return false, !hasError + return network.OutgoingMessage{}, false } // SolicitedTxHandler handles messages received through channels other than the gossip network. @@ -415,146 +328,19 @@ type SolicitedTxHandler interface { Handle(txgroup []transactions.SignedTxn) error } -type solicitedTxHandler struct { - txHandler *TxHandler -} - // SolicitedTxHandler converts a transaction handler to a SolicitedTxHandler func (handler *TxHandler) SolicitedTxHandler() SolicitedTxHandler { return &solicitedTxHandler{txHandler: handler} } +type solicitedTxHandler struct { + txHandler *TxHandler +} + func (handler *solicitedTxHandler) Handle(txgroup []transactions.SignedTxn) error { - disconnect := handler.txHandler.processDecoded(txgroup) - if disconnect { + outmsg, _ := handler.txHandler.processDecoded(txgroup) + if outmsg.Action == network.Disconnect { return fmt.Errorf("invalid transaction") } return nil } - -// SolicitedAsyncTxHandler handles slices of transaction groups received from the transaction sync. -// It provides a non-blocking queueing for the processing of these transaction groups, which allows -// the single-threaded transaction sync to keep processing other messages. -type SolicitedAsyncTxHandler interface { - // HandleTransactionGroups enqueues the given slice of transaction groups that came from the given network peer with - // the given message sequence number. The provided acknowledgement channel provides a feedback for the transaction sync - // that the entire transaction group slice was added ( or already included ) within the transaction pool. The method - // return true if it's able to enqueue the processing task, or false if it's unable to enqueue the processing task. - HandleTransactionGroups(networkPeer interface{}, ackCh chan uint64, messageSeq uint64, groups []pooldata.SignedTxGroup) bool - Start() - Stop() -} - -type solicitedAsyncTxHandler struct { - txHandler *TxHandler - backlogGroups chan *txGroups - stopped sync.WaitGroup - stopCtxFunc context.CancelFunc - // skipNextBacklogWarning is used to avoid repeated backlog full warning messages. - skipNextBacklogWarning bool -} - -type txGroups struct { - // the network package opaque network peer - networkPeer interface{} - // the feedback channel, in case we've successfully added the transaction groups to the transaction pool. - ackCh chan uint64 - // the message sequence number, which would be written back to the feedback channel - messageSeq uint64 - // the transactions groups slice - txGroups []pooldata.SignedTxGroup -} - -// SolicitedAsyncTxHandler converts a transaction handler to a SolicitedTxHandler -func (handler *TxHandler) SolicitedAsyncTxHandler() SolicitedAsyncTxHandler { - return &solicitedAsyncTxHandler{ - txHandler: handler, - backlogGroups: make(chan *txGroups, txBacklogSize), - skipNextBacklogWarning: false, - } -} - -// HandleTransactionGroups implements the solicitedAsyncTxHandler.HandleTransactionGroups interface. -// It enqueues the given slice of transaction groups that came from the given network peer with -// the given message sequence number. The provided acknowledgement channel provides a feedback for the transaction sync -// that the entire transaction group slice was added ( or already included ) within the transaction pool. The method -// return true if it's able to enqueue the processing task, or false if it's unable to enqueue the processing task. -func (handler *solicitedAsyncTxHandler) HandleTransactionGroups(networkPeer interface{}, ackCh chan uint64, messageSeq uint64, groups []pooldata.SignedTxGroup) (enqueued bool) { - select { - case handler.backlogGroups <- &txGroups{networkPeer: networkPeer, txGroups: groups, ackCh: ackCh, messageSeq: messageSeq}: - // reset the skipNextBacklogWarning once the number of pending items on the backlogGroups channels goes to - // less than half of it's capacity. - if handler.skipNextBacklogWarning && (len(handler.backlogGroups)*2 < cap(handler.backlogGroups)) { - handler.skipNextBacklogWarning = false - } - enqueued = true - default: - if !handler.skipNextBacklogWarning { - logging.Base().Warnf("solicitedAsyncTxHandler exhusted groups backlog") - handler.skipNextBacklogWarning = true - } - // if we failed here we want to increase the corresponding metric. It might suggest that we - // want to increase the queue size. - transactionMessagesDroppedFromBacklog.Inc(nil) - } - return -} - -func (handler *solicitedAsyncTxHandler) Start() { - if handler.stopCtxFunc == nil { - handler.txHandler.Start() - var ctx context.Context - ctx, handler.stopCtxFunc = context.WithCancel(context.Background()) - handler.stopped.Add(1) - go handler.loop(ctx) - } -} - -func (handler *solicitedAsyncTxHandler) Stop() { - if handler.stopCtxFunc != nil { - handler.stopCtxFunc() - handler.stopped.Wait() - handler.stopCtxFunc = nil - handler.txHandler.Stop() - } -} - -func (handler *solicitedAsyncTxHandler) loop(ctx context.Context) { - defer handler.stopped.Done() - var groups *txGroups - for { - select { - case <-ctx.Done(): - return - case groups = <-handler.backlogGroups: - } - disconnect, allTransactionsIncluded := handler.txHandler.processDecodedArray(groups.txGroups) - if disconnect { - handler.txHandler.net.Disconnect(groups.networkPeer) - handler.txHandler.net.RequestConnectOutgoing(false, make(chan struct{})) - transactionMessagesDroppedFromPool.Inc(nil) - } else if allTransactionsIncluded { - for _, txnGroup := range groups.txGroups { - // We reencode here instead of using rawmsg.Data to avoid broadcasting non-canonical encodings - err := handler.txHandler.net.Relay(ctx, protocol.TxnTag, reencode(txnGroup.Transactions), false, groups.networkPeer) - if err != nil { - logging.Base().Infof("solicitedAsyncTxHandler was unable to relay transaction message : %v", err) - break - } - } - select { - case groups.ackCh <- groups.messageSeq: - // all good, write was successful. - default: - // unable to write since channel was full - log this: - logging.Base().Warnf("solicitedAsyncTxHandler was unable to ack transaction groups inclusion since the acknowledgement channel was full") - } - // we've processed this message, so increase the counter. - transactionMessagesHandled.Inc(nil) - } else { - transactionMessagesDroppedFromPool.Inc(nil) - } - // clear out the groups; that would allow the GC to collect the group's memory allocations while we wait for the next task. - *groups = txGroups{} - } -} diff --git a/data/txHandler_test.go b/data/txHandler_test.go index ad3bbc8336..a53d831630 100644 --- a/data/txHandler_test.go +++ b/data/txHandler_test.go @@ -29,18 +29,19 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/pools" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" "github.com/algorand/go-algorand/util/execpool" ) -func makeTestingTransactionPoolAndLedger(tb testing.TB, N int) (*pools.TransactionPool, *Ledger, []*crypto.SignatureSecrets, []basics.Address) { +func BenchmarkTxHandlerProcessDecoded(b *testing.B) { + b.StopTimer() + b.ResetTimer() + const numRounds = 10 const numUsers = 100 - log := logging.TestingLog(tb) + log := logging.TestingLog(b) secrets := make([]*crypto.SignatureSecrets, numUsers) addresses := make([]basics.Address, numUsers) @@ -61,25 +62,20 @@ func makeTestingTransactionPoolAndLedger(tb testing.TB, N int) (*pools.Transacti MicroAlgos: basics.MicroAlgos{Raw: config.Consensus[protocol.ConsensusCurrentVersion].MinBalance}, } - require.Equal(tb, len(genesis), numUsers+1) + require.Equal(b, len(genesis), numUsers+1) genBal := bookkeeping.MakeGenesisBalances(genesis, sinkAddr, poolAddr) - ledgerName := fmt.Sprintf("%s-mem-%d", tb.Name(), N) + ledgerName := fmt.Sprintf("%s-mem-%d", b.Name(), b.N) const inMem = true cfg := config.GetDefaultLocal() cfg.Archival = true ledger, err := LoadLedger(log, ledgerName, inMem, protocol.ConsensusCurrentVersion, genBal, genesisID, genesisHash, nil, cfg) - require.NoError(tb, err) + require.NoError(b, err) + + l := ledger cfg.TxPoolSize = 20000 cfg.EnableProcessBlockStats = false - tp := pools.MakeTransactionPool(ledger.Ledger, cfg, logging.Base()) - return tp, ledger, secrets, addresses -} - -func BenchmarkTxHandlerProcessDecoded(b *testing.B) { - const numUsers = 100 - tp, l, secrets, addresses := makeTestingTransactionPoolAndLedger(b, b.N) - defer l.Close() + tp := pools.MakeTransactionPool(l.Ledger, cfg, logging.Base()) signedTransactions := make([]transactions.SignedTxn, 0, b.N) for i := 0; i < b.N/numUsers; i++ { for u := 0; u < numUsers; u++ { @@ -104,17 +100,19 @@ func BenchmarkTxHandlerProcessDecoded(b *testing.B) { } backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) txHandler := MakeTxHandler(tp, l, &mocks.MockNetwork{}, "", crypto.Digest{}, backlogPool) - b.ResetTimer() + b.StartTimer() for _, signedTxn := range signedTransactions { txHandler.processDecoded([]transactions.SignedTxn{signedTxn}) } } func BenchmarkTimeAfter(b *testing.B) { + b.StopTimer() + b.ResetTimer() deadline := time.Now().Add(5 * time.Second) after := 0 before := 0 - b.ResetTimer() + b.StartTimer() for i := 0; i < b.N; i++ { if time.Now().After(deadline) { after++ @@ -123,143 +121,3 @@ func BenchmarkTimeAfter(b *testing.B) { } } } -func TestFilterAlreadyCommitted(t *testing.T) { - partitiontest.PartitionTest(t) - - const numUsers = 100 - tp, l, secrets, addresses := makeTestingTransactionPoolAndLedger(t, 1) - defer l.Close() - signedTransactions := make([]transactions.SignedTxn, 0, 100) - - for u := 0; u < numUsers; u++ { - // generate transactions - tx := transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: addresses[u], - Fee: basics.MicroAlgos{Raw: proto.MinTxnFee * 2}, - FirstValid: 0, - LastValid: basics.Round(proto.MaxTxnLife), - GenesisHash: l.GenesisHash(), - Note: make([]byte, 2), - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: addresses[(u+1)%numUsers], - Amount: basics.MicroAlgos{Raw: mockBalancesMinBalance + (rand.Uint64() % 10000)}, - }, - } - signedTx := tx.Sign(secrets[u]) - signedTransactions = append(signedTransactions, signedTx) - } - - backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) - txHandler := MakeTxHandler(tp, l, &mocks.MockNetwork{}, "", crypto.Digest{}, backlogPool) - - // add the first 10 transactions to the pool. - for i := 0; i < 10; i++ { - tp.Remember(pooldata.SignedTxGroup{Transactions: []transactions.SignedTxn{signedTransactions[i]}}) - } - - allNew := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[10:11], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - } - allNewRef := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[10:11], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - } - allNewTransactions, allNewNonDupFilteredGroups := txHandler.filterAlreadyCommitted(allNew) - require.Equal(t, allNewRef, allNewTransactions) - require.False(t, allNewNonDupFilteredGroups) - - firstTxDup := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{signedTransactions[1]}, - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - } - firstTxExpectedOutput := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - } - firstTxDupTransactions, firstTxDupNonDupFilteredGroups := txHandler.filterAlreadyCommitted(firstTxDup) - require.Equal(t, firstTxExpectedOutput, firstTxDupTransactions) - require.False(t, firstTxDupNonDupFilteredGroups) - - lastTxDup := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{signedTransactions[1]}, - }, - } - lastTxExpectedOutput := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - } - lastTxDupTransactions, lastTxDupNonDupFilteredGroups := txHandler.filterAlreadyCommitted(lastTxDup) - require.Equal(t, lastTxExpectedOutput, lastTxDupTransactions) - require.False(t, lastTxDupNonDupFilteredGroups) - - midTxDup := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[10:11], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{signedTransactions[1]}, - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[13:14], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[14:15], - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{signedTransactions[2]}, - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{signedTransactions[3]}, - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[15:16], - }, - } - midTxDupExpectedOutput := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: signedTransactions[10:11], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[11:12], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[13:14], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[14:15], - }, - pooldata.SignedTxGroup{ - Transactions: signedTransactions[15:16], - }, - } - midTxDupTransactions, midTxDupNonDupFilteredGroups := txHandler.filterAlreadyCommitted(midTxDup) - require.Equal(t, midTxDupExpectedOutput, midTxDupTransactions) - require.False(t, midTxDupNonDupFilteredGroups) - - return -} diff --git a/go.sum b/go.sum index d2be52cec6..b06032e668 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,7 @@ github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e h1:CHPYEbz7 github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e/go.mod h1:6Xhs0ZlsRjXLIiSMLKafbZxML/j30pg9Z1priLuha5s= github.com/cpuguy83/go-md2man v1.0.8 h1:DwoNytLphI8hzS2Af4D0dfaEaiSq2bN05mEm4R6vf8M= github.com/cpuguy83/go-md2man v1.0.8/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY= +github.com/cyberdelia/templates v0.0.0-20191230040416-20a325f050d4 h1:Fphwr1XDjkTR/KFbrrkLfY6D2CEOlHqFGomQQrxcHFs= github.com/cyberdelia/templates v0.0.0-20191230040416-20a325f050d4/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -32,6 +33,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/gen2brain/beeep v0.0.0-20180718162406-4e430518395f h1:eyHMPp7tXlBMF8PZHdsL89G0ehuRNflu7zKUeoQjcJ0= github.com/gen2brain/beeep v0.0.0-20180718162406-4e430518395f/go.mod h1:GprdPCZglWh5OMcIDpeKBxuUJI+fEDOTVUfxZeda4zo= @@ -40,24 +42,33 @@ github.com/getkin/kin-openapi v0.22.0 h1:J5IFyKd/5yuB6AZAgwK0CMBKnabWcmkowtsl6bR github.com/getkin/kin-openapi v0.22.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi v4.1.1+incompatible h1:MmTgB0R8Bt/jccxp+t6S/1VGIKdJw5J74CK/c9tTfA4= github.com/go-chi/chi v4.1.1+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f h1:zlOR3rOlPAVvtfuxGKoghCmop5B0TRyu/ZieziZuGiM= github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gofrs/flock v0.7.0 h1:pGFUjl501gafK9HBt1VGL1KCOd/YhIooID+xgyJCf3g= github.com/gofrs/flock v0.7.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherwasm v1.0.1 h1:Gmj9RMDjh+P9EFzzQltoCtjAxR5mUkaJqaNPfeaNe2I= github.com/gopherjs/gopherwasm v1.0.1/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/schema v1.0.2 h1:sAgNfOcNYvdDSrzGHVy9nzCQahG+qmsg+nE8dK85QRA= github.com/gorilla/schema v1.0.2/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -71,17 +82,22 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGi github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o= github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo= github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/matryer/moq v0.0.0-20200310130814-7721994d1b54 h1:p8zN0Xu28xyEkPpqLbFXAnjdgBVvTJCpfOtoDf/+/RQ= github.com/matryer/moq v0.0.0-20200310130814-7721994d1b54/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -94,7 +110,9 @@ github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK86 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/olivere/elastic v6.2.14+incompatible h1:k+KadwNP/dkXE0/eu+T6otk1+5fe0tEpPyQJ4XVm5i8= github.com/olivere/elastic v6.2.14+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= @@ -120,13 +138,16 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 h1:OXcKh35JaYsGMRzpvFkLv/MEyPuL49CThT1pZ8aSml4= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= @@ -139,6 +160,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= @@ -151,6 +173,7 @@ golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOL golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -168,6 +191,7 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -179,13 +203,17 @@ golang.org/x/tools v0.0.0-20200423205358-59e73619c742 h1:9OGWpORUXvk8AsaBJlpzzDx golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 h1:q/fZgS8MMadqFFGa8WL4Oyz+TmjiZfi8UrzWhTl8d5w= gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009/go.mod h1:O0bY1e/dSoxMYZYTHP0SWKxG5EWLEvKR9/cOjWPPMKU= +gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 h1:MZF6J7CV6s/h0HBkfqebrYfKCVEo5iN+wzE4QhV3Evo= gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2/go.mod h1:s1Sn2yZos05Qfs7NKt867Xe18emOmtsO3eAKbDaon0o= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/installer/config.json.example b/installer/config.json.example index 467f6edd44..fac1122017 100644 --- a/installer/config.json.example +++ b/installer/config.json.example @@ -71,7 +71,7 @@ "OutgoingMessageFilterBucketSize": 128, "ParticipationKeysRefreshInterval": 60000000000, "PeerConnectionsUpdateInterval": 3600, - "PeerPingPeriodSeconds": 10, + "PeerPingPeriodSeconds": 0, "PriorityPeers": {}, "ProposalAssemblyTime": 250000000, "PublicAddress": "", diff --git a/ledger/README.md b/ledger/README.md index 04c088e4c6..37d6baed72 100644 --- a/ledger/README.md +++ b/ledger/README.md @@ -124,13 +124,13 @@ three functions: - Construct a new block, based on a pool of potential transactions and rewards, that will be valid. This is done by using - the `Ledger.StartEvaluator(hdr, paysetHint, maxTxnBytesPerBlock)` method. - This returns a `BlockEvaluator`, which can then accept tentative transactions + the `Ledger.StartEvaluator(hdr, txcache)` method. This returns a + `BlockEvaluator`, which can then accept tentative transactions and rewards (using `BlockEvaluator.Transaction()` and `BlockEvaluator.Reward()`). The caller can finalize the block by - calling `BlockEvaluator.GenerateBlock()`. `paysetHint` provides a hint - to the evaluator for the upcoming number of transactions. `maxTxnBytesPerBlock` - allows the evaluator to adjust the size of the block dynamically. + calling `BlockEvaluator.GenerateBlock()`. `txcache` represents a + cache of previously verified transactions, to avoid repeated checking + of transaction signatures. - Validate a block. This is done by calling `Ledger.Validate(block, txcache)`. Under the covers, it executes the same logic using a `BlockEvaluator`. diff --git a/ledger/internal/eval.go b/ledger/internal/eval.go index 38b21798d0..3864bd0f6d 100644 --- a/ledger/internal/eval.go +++ b/ledger/internal/eval.go @@ -394,14 +394,15 @@ type BlockEvaluator struct { proto config.ConsensusParams genesisHash crypto.Digest - block bookkeeping.Block - blockTxBytes int - specials transactions.SpecialAddresses - maxTxnBytesPerBlock int + block bookkeeping.Block + blockTxBytes int + specials transactions.SpecialAddresses blockGenerated bool // prevent repeated GenerateBlock calls l LedgerForEvaluator + + maxTxnBytesPerBlock int } // LedgerForEvaluator defines the ledger interface needed by the evaluator. diff --git a/logging/telemetryspec/metric.go b/logging/telemetryspec/metric.go index 2e87502fd7..349d3f9724 100644 --- a/logging/telemetryspec/metric.go +++ b/logging/telemetryspec/metric.go @@ -83,67 +83,6 @@ func (m AssembleBlockMetrics) Identifier() Metric { return assembleBlockMetricsIdentifier } -// the identifier for the transaction sync profiling metrics. -const transactionSyncProfilingMetricsIdentifier Metric = "SyncProfile" - -// TransactionSyncProfilingMetrics is the profiling metrics of the recent transaction sync activity -type TransactionSyncProfilingMetrics struct { - // total number of operations - TotalOps uint64 - // number of idle operations - IdleOps uint64 - // number of transaction pool changes operations - TransactionPoolChangedOps uint64 - // number of new rounds operations - NewRoundOps uint64 - // number of peer state changes operations - PeerStateOps uint64 - // number of incoming messages operations - IncomingMsgOps uint64 - // number of outgoing message operations - OutgoingMsgOps uint64 - // number of next offsets message operations - NextOffsetOps uint64 - // number of times transaction sync was retrieving the transaction groups from the transaction pool - GetTxnGroupsOps uint64 - // number of times the transaction sync was assembling messages - AssembleMessageOps uint64 - // number of times the transaction sync was creating bloom filters - MakeBloomFilterOps uint64 - // number of times the transaction sync was selecting pending transactions out of existing pool - SelectPendingTransactionsOps uint64 - - // total duration of this profiling session - TotalDuration time.Duration - // percent of time the transaction sync was idle - IdlePercent float64 - // percent of time the transaction sync was processing transaction pool changes - TransactionPoolChangedPercent float64 - // percent of time the transaction sync was processing new rounds - NewRoundPercent float64 - // percent of time the transaction sync was processing peer state changes - PeerStatePercent float64 - // percent of time the transaction sync was processing incoming messages - IncomingMsgPercent float64 - // percent of time the transaction sync was processing outgoing messages - OutgoingMsgPercent float64 - // percent of time the transaction sync was processing next offset messages - NextOffsetPercent float64 - // percent of time the transaction sync was collecting next set of transaction groups from the transaction pool - GetTxnGroupsPercent float64 - // percent of time the transaction sync was assembling messages - AssembleMessagePercent float64 - // percent of time the transaction sync was creating bloom filter - MakeBloomFilterPercent float64 - // percent of time the transaction sync was selecting transaction to be sent - SelectPendingTransactionsPercent float64 -} - -// Identifier implements the required MetricDetails interface, retrieving the Identifier for this set of metrics. -func (m TransactionSyncProfilingMetrics) Identifier() Metric { - return transactionSyncProfilingMetricsIdentifier -} - //------------------------------------------------------- // ProcessBlock diff --git a/network/latencyTracker.go b/network/latencyTracker.go deleted file mode 100644 index ff503ddb2a..0000000000 --- a/network/latencyTracker.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package network - -import ( - "errors" - "net" - "strconv" - "sync/atomic" - "time" - - "github.com/algorand/websocket" - - "github.com/algorand/go-deadlock" - - "github.com/algorand/go-algorand/config" -) - -const pongMessageWriteDuration = time.Second -const pingMessageWriteDuration = time.Second - -var errInvalidPongMessageContent = errors.New("invalid pong message content") -var errInvalidPingMessageContent = errors.New("invalid ping message content") - -// latencyTracker works in conjunction with the wspeer in measuring the -// communication latency over the websocket connection. -type latencyTracker struct { - // receivedPacketCounter is a counter for all incoming messages - // placed here to be aligned with 64bit address. - receivedPacketCounter uint64 - - // latency is the effective latency of the connection. - // placed here to be aligned with 64bit address. - latency int64 - - // lastPingSentTime is the timestamp at which we last sent a message. - // this variable is only touched by checkPingSending, and therefore doesn't - // need to be syncronized. The "clone" of this variable lastPingSentTimeSynced, - // is being used by both the checkPingSending as well as by the pongHandler - // and therefore require synchronization. - lastPingSentTime int64 - - // static variables - // ( doesn't get changed after init, hence, no synchronization needed ) - - // conn is the underlying connection object. - conn wsPeerWebsocketConn - - // enabled indicates whether the pingpong is currently enabled or not. - enabled bool - - // pingInterval is the max interval at which the client would send ping messages. - pingInterval time.Duration - - // lastPingMu synchronize the protected variables that might be modified across - // the checkPingSending and the pongHandler. All the variable below this point - // need to be syncronized with the mutex. - lastPingMu deadlock.Mutex - - // lastPingID is the last ping ID, a monotonic growing number used to ensure - // that the pong message we've receive corresponds to the latest ping message - // that we've sent. - lastPingID uint64 - - // lastPingReceivedCounter stores message counter at the time we sent the ping. - // In order to ensure the timing accuracy, we want to have no other messages - // being exchanged. This, of course, would only delay the ping-pong until a - // better measurement could be taken. - lastPingReceivedCounter uint64 - - // lastPingSentTimeSynced, as stated above, is the syncronized version of lastPingSentTime. - // it is used only in the case where we end up sending the ping message. - lastPingSentTimeSynced int64 -} - -func (lt *latencyTracker) init(conn wsPeerWebsocketConn, cfg config.Local, initialConnectionLatency time.Duration) { - lt.conn = conn - lt.enabled = cfg.PeerPingPeriodSeconds > 0 && cfg.EnablePingHandler - lt.latency = int64(initialConnectionLatency) - lt.pingInterval = time.Duration(cfg.PeerPingPeriodSeconds) * time.Second - conn.SetPingHandler(lt.pingHandler) - conn.SetPongHandler(lt.pongHandler) -} - -func (lt *latencyTracker) pingHandler(message string) error { - if _, err := strconv.Atoi(message); err != nil { - return errInvalidPingMessageContent - } - err := lt.conn.WriteControl(websocket.PongMessage, []byte(message), time.Now().Add(pongMessageWriteDuration)) - if err == websocket.ErrCloseSent { - return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { - return nil - } - return err -} - -func (lt *latencyTracker) pongHandler(message string) error { - pongID, err := strconv.Atoi(message) - if err != nil { - return errInvalidPongMessageContent - } - - lt.lastPingMu.Lock() - defer lt.lastPingMu.Unlock() - - if uint64(pongID) != lt.lastPingID { - // we've sent more than one ping since; ignore this message. - return nil - } - if lt.receivedPacketCounter != lt.lastPingReceivedCounter { - // we've received other messages since the one that we sent. The timing - // here would not be accurate. - return nil - } - lastPingSentTime := time.Unix(0, lt.lastPingSentTimeSynced) - roundtripDuration := time.Since(lastPingSentTime) - atomic.StoreInt64(<.latency, roundtripDuration.Nanoseconds()) - return nil -} - -func (lt *latencyTracker) getConnectionLatency() time.Duration { - return time.Duration(atomic.LoadInt64(<.latency)) -} - -func (lt *latencyTracker) checkPingSending(now *time.Time) error { - if !lt.enabled { - return nil - } - if now.Sub(time.Unix(0, lt.lastPingSentTime)) < lt.pingInterval { - return nil - } - - // it looks like it's time to send a ping : - lt.lastPingMu.Lock() - defer lt.lastPingMu.Unlock() - - lt.lastPingID++ - err := lt.conn.WriteControl(websocket.PingMessage, []byte(strconv.Itoa(int(lt.lastPingID))), now.Add(pingMessageWriteDuration)) - if err == websocket.ErrCloseSent { - return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { - return nil - } - if err != nil { - return err - } - lt.lastPingSentTimeSynced = now.UnixNano() - lt.lastPingReceivedCounter = atomic.LoadUint64(<.receivedPacketCounter) - lt.lastPingSentTime = lt.lastPingSentTimeSynced - return nil -} - -func (lt *latencyTracker) increaseReceivedCounter() { - atomic.AddUint64(<.receivedPacketCounter, 1) -} diff --git a/network/latencyTracker_test.go b/network/latencyTracker_test.go deleted file mode 100644 index e7a62c1d7e..0000000000 --- a/network/latencyTracker_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package network - -import ( - "context" - "math/rand" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestLatencyTracker(t *testing.T) { - partitiontest.PartitionTest(t) - - netA := makeTestFilterWebsocketNode(t, "a") - netA.config.GossipFanout = 1 - netA.config.PeerPingPeriodSeconds = 2 - netA.Start() - defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() - - netB := makeTestFilterWebsocketNode(t, "b") - netB.config.GossipFanout = 1 - addrA, postListen := netA.Address() - require.True(t, postListen) - t.Log(addrA) - netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) - - netB.Start() - defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() - counter := &messageCounterHandler{t: t, limit: 1, done: make(chan struct{})} - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) - debugTag2 := protocol.ProposalPayloadTag - counter2 := &messageCounterHandler{t: t, limit: 1, done: make(chan struct{})} - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: debugTag2, MessageHandler: counter2}}) - - readyTimeout := time.NewTimer(2 * time.Second) - waitReady(t, netA, readyTimeout.C) - waitReady(t, netB, readyTimeout.C) - - msg := make([]byte, 200) - rand.Read(msg) - var lastMsgTime time.Time - - var connLatencyInitialA time.Duration - // wait for up to 20 seconds for the network latency to be established. - startTime := time.Now() - for { - if time.Since(lastMsgTime) > 100*time.Millisecond { - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, msg, true, nil) - lastMsgTime = time.Now() - } - - connLatencyA := netA.peers[0].GetConnectionLatency() - if connLatencyA == time.Duration(0) { - require.LessOrEqual(t, time.Since(startTime).Nanoseconds(), (20 * time.Second).Nanoseconds()) - time.Sleep(time.Millisecond) - continue - } - require.LessOrEqual(t, connLatencyA.Nanoseconds(), (20 * time.Second).Nanoseconds()) - connLatencyInitialA = connLatencyA - break - } - - // wait for up to 20 seconds for the network latency to be established. - startTime = time.Now() - lastMsgTime = time.Time{} - for { - if time.Since(lastMsgTime) > 100*time.Millisecond { - netB.Broadcast(context.Background(), protocol.AgreementVoteTag, msg, true, nil) - lastMsgTime = time.Now() - } - - connLatencyB := netB.peers[0].GetConnectionLatency() - if connLatencyB == time.Duration(0) { - require.LessOrEqual(t, time.Since(startTime).Nanoseconds(), (20 * time.Second).Nanoseconds()) - time.Sleep(time.Millisecond) - continue - } - require.LessOrEqual(t, connLatencyB.Nanoseconds(), (20 * time.Second).Nanoseconds()) - break - } - - // send the given message until we get a different latency. - // wait for up to 20 seconds for the network latency to be established. - startTime = time.Now() - lastMsgTime = time.Time{} - for { - if time.Since(lastMsgTime) > 100*time.Millisecond { - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, msg, true, nil) - lastMsgTime = time.Now() - } - - connLatencyA := netA.peers[0].GetConnectionLatency() - if connLatencyA != connLatencyInitialA { - require.NotEqual(t, connLatencyA.Nanoseconds(), int64(0)) - waitTime := time.Since(lastMsgTime) - require.Less(t, waitTime.Seconds(), float64(netA.config.PeerPingPeriodSeconds*2)) - break - } - time.Sleep(time.Millisecond) - } -} diff --git a/network/wsNetwork.go b/network/wsNetwork.go index ac29a8e8a3..9f4a1b281d 100644 --- a/network/wsNetwork.go +++ b/network/wsNetwork.go @@ -52,11 +52,7 @@ import ( ) const incomingThreads = 20 - -// messageFilterSize is the threshold beyond we send a request to the other peer to avoid sending us a message with that particular hash. -// typically, this is beneficial for proposal messages, which tends to be large and uniform across the network. Non-uniform messages, such -// as the transaction sync messages should not included in this filter. -const messageFilterSize = 200000 +const messageFilterSize = 5000 // messages greater than that size may be blocked by incoming/outgoing filter // httpServerReadHeaderTimeout is the amount of time allowed to read // request headers. The connection's read deadline is reset @@ -222,9 +218,6 @@ type IncomingMessage struct { Err error Net GossipNode - // Sequence is the sequence number of the message for the specific tag and peer - Sequence uint64 - // Received is time.Time.UnixNano() Received int64 @@ -1136,21 +1129,7 @@ func (wn *WebsocketNetwork) ServeHTTP(response http.ResponseWriter, request *htt // We are careful to encode this prior to starting the server to avoid needing 'messagesOfInterestMu' here. if wn.messagesOfInterestEnc != nil { - msg := wn.messagesOfInterestEnc - // for older peers, we want to include also the "TX" message, for backward compatibility. - // this statement could be safely removed once we've fully migrated. - if peer.version == "2.1" { - wn.messagesOfInterestMu.Lock() - txSendMsgTags := make(map[protocol.Tag]bool) - for tag := range wn.messagesOfInterest { - txSendMsgTags[tag] = true - } - wn.messagesOfInterestMu.Unlock() - txSendMsgTags[protocol.TxnTag] = true - msg = MarshallMessageOfInterestMap(txSendMsgTags) - } - err = peer.Unicast(wn.ctx, msg, protocol.MsgOfInterestTag, nil) - + err = peer.Unicast(wn.ctx, wn.messagesOfInterestEnc, protocol.MsgOfInterestTag) if err != nil { wn.log.Infof("ws send msgOfInterest: %v", err) } @@ -1432,7 +1411,7 @@ func (wn *WebsocketNetwork) innerBroadcast(request broadcastRequest, prio bool, if peer == request.except { continue } - ok := peer.writeNonBlockMsgs(request.ctx, data, prio, digests, request.enqueueTime, nil) + ok := peer.writeNonBlockMsgs(request.ctx, data, prio, digests, request.enqueueTime) if ok { sentMessageCount++ continue @@ -1807,15 +1786,14 @@ const ProtocolVersionHeader = "X-Algorand-Version" const ProtocolAcceptVersionHeader = "X-Algorand-Accept-Version" // SupportedProtocolVersions contains the list of supported protocol versions by this node ( in order of preference ). -var SupportedProtocolVersions = []string{"2.1", "3.0"} +var SupportedProtocolVersions = []string{"2.1"} // ProtocolVersion is the current version attached to the ProtocolVersionHeader header /* Version history: * 1 Catchup service over websocket connections with unicast messages between peers * 2.1 Introduced topic key/data pairs and enabled services over the gossip connections - * 3.0 Introduced new transaction gossiping protocol */ -const ProtocolVersion = "3.0" +const ProtocolVersion = "2.1" // TelemetryIDHeader HTTP header for telemetry-id for logging const TelemetryIDHeader = "X-Algorand-TelId" @@ -2081,7 +2059,7 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { resp := wn.prioScheme.MakePrioResponse(challenge) if resp != nil { mbytes := append([]byte(protocol.NetPrioResponseTag), resp...) - sent := peer.writeNonBlock(context.Background(), mbytes, true, crypto.Digest{}, time.Now(), nil) + sent := peer.writeNonBlock(context.Background(), mbytes, true, crypto.Digest{}, time.Now()) if !sent { wn.log.With("remote", addr).With("local", localAddr).Warnf("could not send priority response to %v", addr) } diff --git a/network/wsNetwork_test.go b/network/wsNetwork_test.go index 1a5a3d427b..74c6902413 100644 --- a/network/wsNetwork_test.go +++ b/network/wsNetwork_test.go @@ -238,7 +238,7 @@ func TestWebsocketNetworkBasic(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -246,8 +246,8 @@ func TestWebsocketNetworkBasic(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte("foo"), false, nil) - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte("bar"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("foo"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("bar"), false, nil) select { case <-counterDone: @@ -274,7 +274,7 @@ func TestWebsocketNetworkUnicast(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -285,9 +285,9 @@ func TestWebsocketNetworkUnicast(t *testing.T) { require.Equal(t, 1, len(netA.peers)) require.Equal(t, 1, len(netA.GetPeers(PeersConnectedIn))) peerB := netA.peers[0] - err := peerB.Unicast(context.Background(), []byte("foo"), protocol.AgreementVoteTag, nil) + err := peerB.Unicast(context.Background(), []byte("foo"), protocol.TxnTag) assert.NoError(t, err) - err = peerB.Unicast(context.Background(), []byte("bar"), protocol.AgreementVoteTag, nil) + err = peerB.Unicast(context.Background(), []byte("bar"), protocol.TxnTag) assert.NoError(t, err) select { @@ -353,7 +353,7 @@ func TestWebsocketNetworkArray(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 3) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -361,7 +361,7 @@ func TestWebsocketNetworkArray(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - tags := []protocol.Tag{protocol.AgreementVoteTag, protocol.AgreementVoteTag, protocol.AgreementVoteTag} + tags := []protocol.Tag{protocol.TxnTag, protocol.TxnTag, protocol.TxnTag} data := [][]byte{[]byte("foo"), []byte("bar"), []byte("algo")} netA.BroadcastArray(context.Background(), tags, data, false, nil) @@ -390,7 +390,7 @@ func TestWebsocketNetworkCancel(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 100) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -401,8 +401,8 @@ func TestWebsocketNetworkCancel(t *testing.T) { tags := make([]protocol.Tag, 100) data := make([][]byte, 100) for i := range data { - tags[i] = protocol.AgreementVoteTag - data[i] = []byte(fmt.Sprintf("%d", i)) + tags[i] = protocol.TxnTag + data[i] = []byte(string(rune(i))) } ctx, cancel := context.WithCancel(context.Background()) @@ -438,7 +438,7 @@ func TestWebsocketNetworkCancel(t *testing.T) { mbytes := make([]byte, len(tbytes)+len(msg)) copy(mbytes, tbytes) copy(mbytes[len(tbytes):], msg) - msgs = append(msgs, sendMessage{data: mbytes, enqueued: time.Now(), peerEnqueued: enqueueTime, ctx: context.Background()}) + msgs = append(msgs, sendMessage{data: mbytes, enqueued: time.Now(), peerEnqueued: enqueueTime, hash: crypto.Hash(mbytes), ctx: context.Background()}) } msgs[50].ctx = ctx @@ -476,7 +476,7 @@ func TestWebsocketNetworkNoAddress(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -484,8 +484,8 @@ func TestWebsocketNetworkNoAddress(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte("foo"), false, nil) - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte("bar"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("foo"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("bar"), false, nil) select { case <-counterDone: @@ -508,7 +508,7 @@ func lineNetwork(t *testing.T, numNodes int) (nodes []*WebsocketNetwork, counter addrPrev, postListen := nodes[i-1].Address() require.True(t, postListen) nodes[i].phonebook.ReplacePeerList([]string{addrPrev}, "default", PhoneBookEntryRelayRole) - nodes[i].RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: &counters[i]}}) + nodes[i].RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: &counters[i]}}) } nodes[i].Start() counters[i].t = t @@ -565,7 +565,7 @@ func TestLineNetwork(t *testing.T) { sendTime := time.Now().UnixNano() var timeblob [8]byte binary.LittleEndian.PutUint64(timeblob[:], uint64(sendTime)) - nodes[0].Broadcast(context.Background(), protocol.AgreementVoteTag, timeblob[:], true, nil) + nodes[0].Broadcast(context.Background(), protocol.TxnTag, timeblob[:], true, nil) } select { case <-counterDone: @@ -792,124 +792,71 @@ func avgSendBufferHighPrioLength(wn *WebsocketNetwork) float64 { return float64(sum) / float64(len(wn.peers)) } -// TestSlowOutboundPeer tests what happens when one outbound peer is slow and the rest are fine. +// TestSlowOutboundPeer tests what happens when one outbound peer is slow and the rest are fine. Current logic is to disconnect the one slow peer when its outbound channel is full. +// +// This is a deeply invasive test that reaches into the guts of WebsocketNetwork and wsPeer. If the implementation chainges consider throwing away or totally reimplementing this test. func TestSlowOutboundPeer(t *testing.T) { partitiontest.PartitionTest(t) - nodeA := makeTestWebsocketNode(t) - nodeA.config.GossipFanout = 0 - nodeA.Start() - defer nodeA.Stop() - - addrA, postListenA := nodeA.Address() - require.True(t, postListenA) - - nodeB := makeTestWebsocketNode(t) - nodeB.config.GossipFanout = 0 - nodeB.Start() - defer nodeB.Stop() - - addrB, postListenB := nodeB.Address() - require.True(t, postListenB) - + t.Skip() // todo - update this test to reflect the new implementation. + xtag := protocol.ProposalPayloadTag node := makeTestWebsocketNode(t) - node.config.GossipFanout = 2 - dl := eventsDetailsLogger{Logger: logging.TestingLog(t), eventReceived: make(chan interface{}, 100), eventIdentifier: telemetryspec.DisconnectPeerEvent} - node.log = dl - - node.phonebook.ReplacePeerList([]string{addrA, addrB}, "default", PhoneBookEntryRelayRole) - node.Start() - defer node.Stop() - - msg := make([]byte, 100) - rand.Read(msg) - - muHandleA := deadlock.Mutex{} - numHandledA := 0 - waitMessageArriveHandlerA := func(msg IncomingMessage) (out OutgoingMessage) { - muHandleA.Lock() - defer muHandleA.Unlock() - numHandledA++ - return + destPeers := make([]wsPeer, 5) + for i := range destPeers { + destPeers[i].closing = make(chan struct{}) + destPeers[i].net = node + destPeers[i].sendBufferHighPrio = make(chan sendMessages, sendBufferLength) + destPeers[i].sendBufferBulk = make(chan sendMessages, sendBufferLength) + destPeers[i].conn = &nopConnSingleton + destPeers[i].rootURL = fmt.Sprintf("fake %d", i) + node.addPeer(&destPeers[i]) } - nodeA.RegisterHandlers([]TaggedMessageHandler{ - { - Tag: protocol.AgreementVoteTag, - MessageHandler: HandlerFunc(waitMessageArriveHandlerA), - }}) - - muHandleB := deadlock.Mutex{} - numHandledB := 0 - waitMessageArriveHandlerB := func(msg IncomingMessage) (out OutgoingMessage) { - muHandleB.Lock() - defer muHandleB.Unlock() - numHandledB++ - return + node.Start() + tctx, cf := context.WithTimeout(context.Background(), 5*time.Second) + for i := 0; i < sendBufferLength; i++ { + t.Logf("broadcast %d", i) + sent := node.Broadcast(tctx, xtag, []byte{byte(i)}, true, nil) + require.NoError(t, sent) } - nodeB.RegisterHandlers([]TaggedMessageHandler{ - { - Tag: protocol.AgreementVoteTag, - MessageHandler: HandlerFunc(waitMessageArriveHandlerB), - }}) - - readyTimeout := time.NewTimer(2 * time.Second) - waitReady(t, node, readyTimeout.C) - require.Equal(t, 2, len(node.peers)) - - callback := func(enqueued bool, sequenceNumber uint64) error { - time.Sleep(2 * maxMessageQueueDuration) - return nil + cf() + ok := false + for i := 0; i < 10; i++ { + time.Sleep(time.Millisecond) + aoql := avgSendBufferHighPrioLength(node) + if aoql == sendBufferLength { + ok = true + break + } + t.Logf("node.avgOutboundQueueLength() %f", aoql) } - - rand.Read(msg) - x := 0 -MAINLOOP: - for ; x < 1000; x++ { - select { - case eventDetails := <-dl.eventReceived: - switch disconnectPeerEventDetails := eventDetails.(type) { - case telemetryspec.DisconnectPeerEventDetails: - require.Equal(t, string(disconnectSlowConn), disconnectPeerEventDetails.Reason) - default: - require.FailNow(t, "Unexpected event was send : %v", eventDetails) - } - break MAINLOOP - default: + require.True(t, ok) + for p := range destPeers { + if p == 0 { + continue } - - node.Broadcast(context.Background(), protocol.AgreementVoteTag, msg, true, nil) - if x == 0 { - node.peers[0].Unicast(context.Background(), msg, protocol.AgreementVoteTag, callback) + for j := 0; j < sendBufferLength; j++ { + // throw away a message as if sent + <-destPeers[p].sendBufferHighPrio } - time.Sleep(200 * time.Millisecond) } + aoql := avgSendBufferHighPrioLength(node) + if aoql > (sendBufferLength / 2) { + t.Fatalf("avgOutboundQueueLength=%f wanted <%f", aoql, sendBufferLength/2.0) + return + } + // it shouldn't have closed for just sitting on the limit of full + require.False(t, peerIsClosed(&destPeers[0])) - require.Less(t, x, 1000) + // function context just to contain defer cf() + func() { + timeout, cf := context.WithTimeout(context.Background(), time.Second) + defer cf() + sent := node.Broadcast(timeout, xtag, []byte{byte(42)}, true, nil) + assert.NoError(t, sent) + }() - maxNumHandled := 0 - minNumHandled := 0 - for i := 0; i < 10; i++ { - muHandleA.Lock() - a := numHandledA - muHandleA.Unlock() - - muHandleB.Lock() - b := numHandledB - muHandleB.Unlock() - - maxNumHandled = b - minNumHandled = a - if maxNumHandled < a { - maxNumHandled = a - minNumHandled = b - } - if maxNumHandled == x { - break - } - time.Sleep(100 * time.Millisecond) - } - require.Equal(t, maxNumHandled, x) - require.Less(t, minNumHandled, x/2) + // and now with the rest of the peers well and this one slow, we closed the slow one + require.True(t, peerIsClosed(&destPeers[0])) } func makeTestFilterWebsocketNode(t *testing.T, nodename string) *WebsocketNetwork { @@ -1097,7 +1044,7 @@ func BenchmarkWebsocketNetworkBasic(t *testing.B) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() returns := make(chan uint64, 100) bhandler := benchmarkHandler{returns} - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: &bhandler}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: &bhandler}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -1120,7 +1067,7 @@ func BenchmarkWebsocketNetworkBasic(t *testing.B) { } msg := make([]byte, msgSize) binary.LittleEndian.PutUint64(msg, uint64(i)) - err := netA.Broadcast(context.Background(), protocol.AgreementVoteTag, msg, true, nil) + err := netA.Broadcast(context.Background(), protocol.TxnTag, msg, true, nil) if err != nil { t.Errorf("error on broadcast: %v", err) return @@ -1222,7 +1169,7 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { netB.config.GossipFanout = 1 netB.config.NetAddress = "" netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counterB}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counterB}}) netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() @@ -1236,7 +1183,7 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { netC.config.GossipFanout = 1 netC.config.NetAddress = "" netC.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) - netC.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counterC}}) + netC.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counterC}}) netC.Start() defer func() { t.Log("stopping C"); netC.Stop(); t.Log("C done") }() @@ -1260,7 +1207,7 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { waitReady(t, netA, time.After(time.Second)) firstPeer := netA.peers[0] - netA.Broadcast(context.Background(), protocol.AgreementVoteTag, nil, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, nil, true, nil) failed := false select { @@ -1450,7 +1397,7 @@ func TestDelayedMessageDrop(t *testing.T) { defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 5) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -1458,7 +1405,7 @@ func TestDelayedMessageDrop(t *testing.T) { currentTime := time.Now() for i := 0; i < 10; i++ { - err := netA.broadcastWithTimestamp(protocol.AgreementVoteTag, []byte("foo"), currentTime.Add(time.Hour*time.Duration(i-5))) + err := netA.broadcastWithTimestamp(protocol.TxnTag, []byte("foo"), currentTime.Add(time.Hour*time.Duration(i-5))) require.NoErrorf(t, err, "No error was expected") } @@ -1553,7 +1500,7 @@ func TestForceMessageRelaying(t *testing.T) { counter := newMessageCounter(t, 5) counterDone := counter.done - netA.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netA.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) netA.Start() addrA, postListen := netA.Address() require.Truef(t, postListen, "Listening network failed to start") @@ -1580,9 +1527,9 @@ func TestForceMessageRelaying(t *testing.T) { // send 5 messages from both netB and netC to netA for i := 0; i < 5; i++ { - err := netB.Relay(context.Background(), protocol.AgreementVoteTag, []byte{1, 2, 3}, true, nil) + err := netB.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) - err = netC.Relay(context.Background(), protocol.AgreementVoteTag, []byte{1, 2, 3}, true, nil) + err = netC.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) } @@ -1598,13 +1545,13 @@ func TestForceMessageRelaying(t *testing.T) { netA.ClearHandlers() counter = newMessageCounter(t, 10) counterDone = counter.done - netA.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) + netA.RegisterHandlers([]TaggedMessageHandler{{Tag: protocol.TxnTag, MessageHandler: counter}}) // hack the relayMessages on the netB so that it would start sending messages. netB.relayMessages = true // send additional 10 messages from netB for i := 0; i < 10; i++ { - err := netB.Relay(context.Background(), protocol.AgreementVoteTag, []byte{1, 2, 3}, true, nil) + err := netB.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) } @@ -1827,7 +1774,7 @@ func TestWebsocketNetworkMessageOfInterest(t *testing.T) { // send 5 messages of few types. for i := 0; i < 5; i++ { netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) - netA.Broadcast(context.Background(), protocol.CompactCertSigTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte{0, 1, 2, 3, 4}, true, nil) netA.Broadcast(context.Background(), protocol.ProposalPayloadTag, []byte{0, 1, 2, 3, 4}, true, nil) netA.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) } @@ -1925,7 +1872,7 @@ func TestWebsocketDisconnection(t *testing.T) { case eventDetails := <-dl.eventReceived: switch disconnectPeerEventDetails := eventDetails.(type) { case telemetryspec.DisconnectPeerEventDetails: - require.Equal(t, string(disconnectRequestReceived), disconnectPeerEventDetails.Reason) + require.Equal(t, disconnectPeerEventDetails.Reason, string(disconnectRequestReceived)) default: require.FailNow(t, "Unexpected event was send : %v", eventDetails) } @@ -2061,7 +2008,7 @@ func BenchmarkVariableTransactionMessageBlockSizes(t *testing.B) { // register all the handlers. taggedHandlersA := []TaggedMessageHandler{ { - Tag: protocol.AgreementVoteTag, + Tag: protocol.TxnTag, MessageHandler: HandlerFunc(msgHandlerA), }, } @@ -2085,7 +2032,7 @@ func BenchmarkVariableTransactionMessageBlockSizes(t *testing.B) { t.ResetTimer() startTime := time.Now() for i := 0; i < t.N/txnCount; i++ { - netB.Broadcast(context.Background(), protocol.AgreementVoteTag, dataBuffer, true, nil) + netB.Broadcast(context.Background(), protocol.TxnTag, dataBuffer, true, nil) <-msgProcessed } deltaTime := time.Now().Sub(startTime) diff --git a/network/wsPeer.go b/network/wsPeer.go index c661629aa6..f476cfa7e7 100644 --- a/network/wsPeer.go +++ b/network/wsPeer.go @@ -76,10 +76,10 @@ var defaultSendMessageTags = map[protocol.Tag]bool{ protocol.ProposalPayloadTag: true, protocol.TopicMsgRespTag: true, protocol.MsgOfInterestTag: true, + protocol.TxnTag: true, protocol.UniCatchupReqTag: true, protocol.UniEnsBlockReqTag: true, protocol.VoteBundleTag: true, - protocol.Txn2Tag: true, } // interface allows substituting debug implementation for *websocket.Conn @@ -96,10 +96,10 @@ type wsPeerWebsocketConn interface { type sendMessage struct { data []byte - enqueued time.Time // the time at which the message was first generated - peerEnqueued time.Time // the time at which the peer was attempting to enqueue the message - msgTags map[protocol.Tag]bool // when msgTags is specified ( i.e. non-nil ), the send goroutine is to replace the message tag filter with this one. No data would be accompanied to this message. - callback UnicastWebsocketMessageStateCallback // when non-nil, the callback function would be called after entry would be placed on the outgoing websocket queue + enqueued time.Time // the time at which the message was first generated + peerEnqueued time.Time // the time at which the peer was attempting to enqueue the message + msgTags map[protocol.Tag]bool // when msgTags is specified ( i.e. non-nil ), the send goroutine is to replace the message tag filter with this one. No data would be accompanied to this message. + hash crypto.Digest ctx context.Context } @@ -124,7 +124,6 @@ const disconnectLeastPerformingPeer disconnectReason = "LeastPerformingPeer" const disconnectCliqueResolve disconnectReason = "CliqueResolving" const disconnectRequestReceived disconnectReason = "DisconnectRequest" const disconnectStaleWrite disconnectReason = "DisconnectStaleWrite" -const disconnectClientCallback disconnectReason = "ClientCallback" // Response is the structure holding the response from the server type Response struct { @@ -175,7 +174,11 @@ type wsPeer struct { processed chan struct{} - latencyTracker latencyTracker + pingLock deadlock.Mutex + pingSent time.Time + pingData []byte + pingInFlight bool + lastPingRoundTripTime time.Duration // Hint about position in wn.peers. Definitely valid if the peer // is present in wn.peers. @@ -221,9 +224,6 @@ type wsPeer struct { // clientDataStoreMu synchronizes access to clientDataStore clientDataStoreMu deadlock.Mutex - - // outgoingMessageCounters counts the number of messages send for each tag. It allows us to use implicit message counting. - outgoingMessageCounters map[protocol.Tag]uint64 } // HTTPPeer is what the opaque Peer might be. @@ -233,22 +233,16 @@ type HTTPPeer interface { GetHTTPClient() *http.Client } -// UnicastWebsocketMessageStateCallback provide asyncrounious feedback for the sequence number of a message -// if the caller return an error, the network peer would disconnect -type UnicastWebsocketMessageStateCallback func(enqueued bool, sequenceNumber uint64) error - // UnicastPeer is another possible interface for the opaque Peer. // It is possible that we can only initiate a connection to a peer over websockets. type UnicastPeer interface { GetAddress() string // Unicast sends the given bytes to this specific peer. Does not wait for message to be sent. - Unicast(ctx context.Context, data []byte, tag protocol.Tag, callback UnicastWebsocketMessageStateCallback) error + Unicast(ctx context.Context, data []byte, tag protocol.Tag) error // Version returns the matching version from network.SupportedProtocolVersions Version() string Request(ctx context.Context, tag Tag, topics Topics) (resp *Response, e error) Respond(ctx context.Context, reqMsg IncomingMessage, topics Topics) (e error) - IsOutgoing() bool - GetConnectionLatency() time.Duration } // Create a wsPeerCore object @@ -278,20 +272,9 @@ func (wp *wsPeer) Version() string { return wp.version } -// IsOutgoing returns true if the connection is an outgoing connection or false if it the connection -// is an incoming connection. -func (wp *wsPeer) IsOutgoing() bool { - return wp.outgoing -} - -// GetConnectionLatency returns the connection latency between the local node and this peer. -func (wp *wsPeer) GetConnectionLatency() time.Duration { - return wp.latencyTracker.getConnectionLatency() -} - // Unicast sends the given bytes to this specific peer. Does not wait for message to be sent. // (Implements UnicastPeer) -func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag, callback UnicastWebsocketMessageStateCallback) error { +func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) error { var err error tbytes := []byte(tag) @@ -303,7 +286,7 @@ func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag, cal digest = crypto.Hash(mbytes) } - ok := wp.writeNonBlock(ctx, mbytes, false, digest, time.Now(), callback) + ok := wp.writeNonBlock(ctx, mbytes, false, digest, time.Now()) if !ok { networkBroadcastsDropped.Inc(nil) err = fmt.Errorf("wsPeer failed to unicast: %v", wp.GetAddress()) @@ -356,7 +339,6 @@ func (wp *wsPeer) init(config config.Local, sendBufferLength int) { wp.responseChannels = make(map[uint64]chan *Response) wp.sendMessageTag = defaultSendMessageTags wp.clientDataStore = make(map[string]interface{}) - wp.outgoingMessageCounters = make(map[protocol.Tag]uint64) // processed is a channel that messageHandlerThread writes to // when it's done with one of our messages, so that we can queue @@ -371,24 +353,6 @@ func (wp *wsPeer) init(config config.Local, sendBufferLength int) { wp.outgoingMsgFilter = makeMessageFilter(config.OutgoingMessageFilterBucketCount, config.OutgoingMessageFilterBucketSize) } - // if we're on an older version, then add the old style transaction message to the send messages tag. - // once we deprecate old style transaction sending, this part can go away. - if wp.version != "3.0" { - txSendMsgTags := make(map[protocol.Tag]bool) - for tag := range wp.sendMessageTag { - txSendMsgTags[tag] = true - } - txSendMsgTags[protocol.TxnTag] = true - wp.sendMessageTag = txSendMsgTags - } - - wp.latencyTracker.init(wp.conn, config, time.Duration(0)) - // send a ping right away. - now := time.Now() - if err := wp.latencyTracker.checkPingSending(&now); err != nil { - wp.net.log.Infof("failed to send ping message to peer : %v", err) - } - wp.wg.Add(2) go wp.readLoop() go wp.writeLoop() @@ -421,7 +385,6 @@ func (wp *wsPeer) readLoop() { }() wp.conn.SetReadLimit(maxMessageLength) slurper := MakeLimitedReaderSlurper(averageMessageLength, maxMessageLength) - sequenceCounters := make(map[protocol.Tag]uint64) for { msg := IncomingMessage{} mtype, reader, err := wp.conn.NextReader() @@ -457,7 +420,7 @@ func (wp *wsPeer) readLoop() { wp.reportReadErr(err) return } - wp.latencyTracker.increaseReceivedCounter() + msg.processing = wp.processed msg.Received = time.Now().UnixNano() msg.Data = slurper.Bytes() @@ -468,8 +431,6 @@ func (wp *wsPeer) readLoop() { networkReceivedBytesByTag.Add(string(tag[:]), uint64(len(msg.Data)+2)) networkMessageReceivedByTag.Add(string(tag[:]), 1) msg.Sender = wp - msg.Sequence = sequenceCounters[msg.Tag] - sequenceCounters[msg.Tag] = msg.Sequence + 1 // for outgoing connections, we want to notify the connection monitor that we've received // a message. The connection monitor would update it's statistics accordingly. @@ -623,12 +584,6 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason { if len(msg.data) > maxMessageLength { wp.net.log.Errorf("trying to send a message longer than we would receive: %d > %d tag=%s", len(msg.data), maxMessageLength, string(msg.data[0:2])) // just drop it, don't break the connection - if msg.callback != nil { - // let the callback know that the message was not sent. - if nil != msg.callback(false, 0) { - return disconnectClientCallback - } - } return disconnectReasonNone } if msg.msgTags != nil { @@ -641,12 +596,6 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason { tag := protocol.Tag(msg.data[:2]) if !wp.sendMessageTag[tag] { // the peer isn't interested in this message. - if msg.callback != nil { - // let the callback know that the message was not sent. - if nil != msg.callback(false, 0) { - return disconnectClientCallback - } - } return disconnectReasonNone } @@ -656,20 +605,9 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason { if msgWaitDuration > maxMessageQueueDuration { wp.net.log.Warnf("peer stale enqueued message %dms", msgWaitDuration.Nanoseconds()/1000000) networkConnectionsDroppedTotal.Inc(map[string]string{"reason": "stale message"}) - if msg.callback != nil { - // let the callback know that the message was not sent. - if nil != msg.callback(false, 0) { - return disconnectClientCallback - } - } return disconnectStaleWrite } - // is it time to send a ping message ? - if err := wp.latencyTracker.checkPingSending(&now); err != nil { - wp.net.log.Infof("failed to send ping message to peer : %v", err) - } - atomic.StoreInt64(&wp.intermittentOutgoingMessageEnqueueTime, msg.enqueued.UnixNano()) defer atomic.StoreInt64(&wp.intermittentOutgoingMessageEnqueueTime, 0) err := wp.conn.WriteMessage(websocket.BinaryMessage, msg.data) @@ -678,12 +616,6 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason { wp.net.log.Warn("peer write error ", err) networkConnectionsDroppedTotal.Inc(map[string]string{"reason": "write err"}) } - if msg.callback != nil { - // let the callback know that the message was not sent. - if nil != msg.callback(false, 0) { - return disconnectClientCallback - } - } return disconnectWriteError } atomic.StoreInt64(&wp.lastPacketTime, time.Now().UnixNano()) @@ -692,16 +624,6 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason { networkMessageSentTotal.AddUint64(1, nil) networkMessageSentByTag.Add(string(tag), 1) networkMessageQueueMicrosTotal.AddUint64(uint64(time.Now().Sub(msg.peerEnqueued).Nanoseconds()/1000), nil) - - if msg.callback != nil { - // for performance reasons, we count messages only for messages that request a callback. we might want to revisit this - // in the future. - seq := wp.outgoingMessageCounters[tag] - if nil != msg.callback(true, seq) { - return disconnectClientCallback - } - wp.outgoingMessageCounters[tag] = seq + 1 - } return disconnectReasonNone } @@ -744,16 +666,16 @@ func (wp *wsPeer) writeLoopCleanup(reason disconnectReason) { wp.wg.Done() } -func (wp *wsPeer) writeNonBlock(ctx context.Context, data []byte, highPrio bool, digest crypto.Digest, msgEnqueueTime time.Time, callback UnicastWebsocketMessageStateCallback) bool { +func (wp *wsPeer) writeNonBlock(ctx context.Context, data []byte, highPrio bool, digest crypto.Digest, msgEnqueueTime time.Time) bool { msgs := make([][]byte, 1, 1) digests := make([]crypto.Digest, 1, 1) msgs[0] = data digests[0] = digest - return wp.writeNonBlockMsgs(ctx, msgs, highPrio, digests, msgEnqueueTime, callback) + return wp.writeNonBlockMsgs(ctx, msgs, highPrio, digests, msgEnqueueTime) } // return true if enqueued/sent -func (wp *wsPeer) writeNonBlockMsgs(ctx context.Context, data [][]byte, highPrio bool, digest []crypto.Digest, msgEnqueueTime time.Time, callback UnicastWebsocketMessageStateCallback) bool { +func (wp *wsPeer) writeNonBlockMsgs(ctx context.Context, data [][]byte, highPrio bool, digest []crypto.Digest, msgEnqueueTime time.Time) bool { includeIndices := make([]int, 0, len(data)) for i := range data { if wp.outgoingMsgFilter != nil && len(data[i]) > messageFilterSize && wp.outgoingMsgFilter.CheckDigest(digest[i], false, false) { @@ -775,7 +697,7 @@ func (wp *wsPeer) writeNonBlockMsgs(ctx context.Context, data [][]byte, highPrio msgs := make([]sendMessage, 0, len(includeIndices)) enqueueTime := time.Now() for _, index := range includeIndices { - msgs = append(msgs, sendMessage{data: data[index], enqueued: msgEnqueueTime, peerEnqueued: enqueueTime, ctx: ctx, callback: callback}) + msgs = append(msgs, sendMessage{data: data[index], enqueued: msgEnqueueTime, peerEnqueued: enqueueTime, hash: digest[index], ctx: ctx}) } if highPrio { @@ -791,6 +713,42 @@ func (wp *wsPeer) writeNonBlockMsgs(ctx context.Context, data [][]byte, highPrio return false } +const pingLength = 8 +const maxPingWait = 60 * time.Second + +// sendPing sends a ping block to the peer. +// return true if either a ping request was enqueued or there is already ping request in flight in the past maxPingWait time. +func (wp *wsPeer) sendPing() bool { + wp.pingLock.Lock() + defer wp.pingLock.Unlock() + now := time.Now() + if wp.pingInFlight && (now.Sub(wp.pingSent) < maxPingWait) { + return true + } + + tagBytes := []byte(protocol.PingTag) + mbytes := make([]byte, len(tagBytes)+pingLength) + copy(mbytes, tagBytes) + crypto.RandBytes(mbytes[len(tagBytes):]) + wp.pingData = mbytes[len(tagBytes):] + sent := wp.writeNonBlock(context.Background(), mbytes, false, crypto.Digest{}, time.Now()) + + if sent { + wp.pingInFlight = true + wp.pingSent = now + } + return sent +} + +// get some times out of the peer while observing the ping data lock +func (wp *wsPeer) pingTimes() (lastPingSent time.Time, lastPingRoundTripTime time.Duration) { + wp.pingLock.Lock() + defer wp.pingLock.Unlock() + lastPingSent = wp.pingSent + lastPingRoundTripTime = wp.lastPingRoundTripTime + return +} + // called when the connection had an error or closed remotely func (wp *wsPeer) internalClose(reason disconnectReason) { if atomic.CompareAndSwapInt32(&wp.didSignalClose, 0, 1) { diff --git a/node/assemble_test.go b/node/assemble_test.go index 6a4e1ce65c..5f7dae7d50 100644 --- a/node/assemble_test.go +++ b/node/assemble_test.go @@ -30,7 +30,6 @@ import ( "github.com/algorand/go-algorand/data" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/pools" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" @@ -132,8 +131,7 @@ func BenchmarkAssembleBlock(b *testing.B) { if okcount == 0 { worstTxID = signedTx.ID() } - - err := tp.Remember(pooldata.SignedTxGroup{Transactions: []transactions.SignedTxn{signedTx}}) + err := tp.Remember([]transactions.SignedTxn{signedTx}) if err != nil { errcount++ b.Logf("(%d/%d) could not send [%d] %s -> [%d] %s: %s", errcount, okcount, sourcei, addresses[sourcei], desti, addresses[desti], err) diff --git a/node/node.go b/node/node.go index fa0d970955..fc7ef0fba0 100644 --- a/node/node.go +++ b/node/node.go @@ -38,7 +38,6 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/committee" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/pools" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/verify" @@ -50,7 +49,6 @@ import ( "github.com/algorand/go-algorand/node/indexer" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/rpcs" - "github.com/algorand/go-algorand/txnsync" "github.com/algorand/go-algorand/util/db" "github.com/algorand/go-algorand/util/execpool" "github.com/algorand/go-algorand/util/metrics" @@ -108,7 +106,6 @@ type AlgorandFullNode struct { blockService *rpcs.BlockService ledgerService *rpcs.LedgerService txPoolSyncerService *rpcs.TxSyncer - txnSyncService *txnsync.Service indexer *indexer.Indexer @@ -136,8 +133,6 @@ type AlgorandFullNode struct { tracer messagetracer.MessageTracer compactCert *compactcert.Worker - - txnSyncConnector *transactionSyncNodeConnector } // TxnWithStatus represents information about a single transaction, @@ -215,6 +210,15 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAdd node.transactionPool = pools.MakeTransactionPool(node.ledger.Ledger, cfg, node.log) + blockListeners := []ledger.BlockListener{ + node.transactionPool, + node, + } + + if node.config.EnableTopAccountsReporting { + blockListeners = append(blockListeners, &accountListener) + } + node.ledger.RegisterBlockListeners(blockListeners) node.txHandler = data.MakeTxHandler(node.transactionPool, node.ledger, node.net, node.genesisID, node.genesisHash, node.lowPriorityCryptoVerificationPool) // Indexer setup @@ -263,8 +267,6 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAdd node.catchupBlockAuth = blockAuthenticatorImpl{Ledger: node.ledger, AsyncVoteVerifier: agreement.MakeAsyncVoteVerifier(node.lowPriorityCryptoVerificationPool)} node.catchupService = catchup.MakeService(node.log, node.config, p2pNode, node.ledger, node.catchupBlockAuth, agreementLedger.UnmatchedPendingCertificates, node.lowPriorityCryptoVerificationPool) node.txPoolSyncerService = rpcs.MakeTxSyncer(node.transactionPool, node.net, node.txHandler.SolicitedTxHandler(), time.Duration(cfg.TxSyncIntervalSeconds)*time.Second, time.Duration(cfg.TxSyncTimeoutSeconds)*time.Second, cfg.TxSyncServeResponseSize) - node.txnSyncConnector = makeTransactionSyncNodeConnector(node) - node.txnSyncService = txnsync.MakeTransactionSyncService(node.log, node.txnSyncConnector, cfg.NetAddress != "", node.genesisID, node.genesisHash, node.config, node.lowPriorityCryptoVerificationPool) err = node.loadParticipationKeys() if err != nil { @@ -298,17 +300,6 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAdd } node.compactCert = compactcert.NewWorker(compactCertAccess, node.log, node.accountManager, node.ledger.Ledger, node.net, node) - blockListeners := []ledger.BlockListener{ - node.txnSyncConnector, - node.transactionPool, - node, - } - - if node.config.EnableTopAccountsReporting { - blockListeners = append(blockListeners, &accountListener) - } - node.ledger.RegisterBlockListeners(blockListeners) - return node, err } @@ -379,12 +370,9 @@ func (node *AlgorandFullNode) Start() { node.txPoolSyncerService.Start(node.catchupService.InitialSyncDone) node.blockService.Start() node.ledgerService.Start() + node.txHandler.Start() node.compactCert.Start() - node.txnSyncService.Start() - node.txnSyncConnector.start() - startNetwork() - // start indexer if idx, err := node.Indexer(); err == nil { err := idx.Start() @@ -451,8 +439,7 @@ func (node *AlgorandFullNode) Stop() { if node.catchpointCatchupService != nil { node.catchpointCatchupService.Stop() } else { - node.txnSyncService.Stop() - node.txnSyncConnector.stop() + node.txHandler.Stop() node.agreementService.Shutdown() node.catchupService.Stop() node.txPoolSyncerService.Stop() @@ -528,7 +515,7 @@ func (node *AlgorandFullNode) BroadcastSignedTxGroup(txgroup []transactions.Sign return err } - err = node.transactionPool.Remember(pooldata.SignedTxGroup{Transactions: txgroup, LocallyOriginated: true}) + err = node.transactionPool.Remember(txgroup) if err != nil { node.log.Infof("rejected by local pool: %v - transaction group was %+v", err, txgroup) return err @@ -539,8 +526,6 @@ func (node *AlgorandFullNode) BroadcastSignedTxGroup(txgroup []transactions.Sign logging.Base().Infof("unable to pin transaction: %v", err) } - node.txnSyncConnector.onNewTransactionPoolEntry(node.transactionPool.PendingCount()) - var enc []byte var txids []transactions.Txid for _, tx := range txgroup { @@ -755,12 +740,7 @@ func (node *AlgorandFullNode) SuggestedFee() basics.MicroAlgos { // GetPendingTxnsFromPool returns a snapshot of every pending transactions from the node's transaction pool in a slice. // Transactions are sorted in decreasing order. If no transactions, returns an empty slice. func (node *AlgorandFullNode) GetPendingTxnsFromPool() ([]transactions.SignedTxn, error) { - poolGroups, _ := node.transactionPool.PendingTxGroups() - txnGroups := make([][]transactions.SignedTxn, len(poolGroups)) - for i := range txnGroups { - txnGroups[i] = poolGroups[i].Transactions - } - return bookkeeping.SignedTxnGroupsFlatten(txnGroups), nil + return bookkeeping.SignedTxnGroupsFlatten(node.transactionPool.PendingTxGroups()), nil } // Reload participation keys from disk periodically @@ -862,17 +842,10 @@ func (node *AlgorandFullNode) IsArchival() bool { } // OnNewBlock implements the BlockListener interface so we're notified after each block is written to the ledger -// The method is being called *after* the transaction pool received it's OnNewBlock call. func (node *AlgorandFullNode) OnNewBlock(block bookkeeping.Block, delta ledgercore.StateDelta) { - blkRound := block.Round() - if node.ledger.Latest() > blkRound { + if node.ledger.Latest() > block.Round() { return } - - // the transaction pool already updated its transactions (dumping out old and invalid transactions). At this point, - // we need to let the txnsync know about the size of the transaction pool. - node.txnSyncConnector.onNewTransactionPoolEntry(node.transactionPool.PendingCount()) - node.syncStatusMu.Lock() node.lastRoundTimestamp = time.Now() node.hasSyncedSinceStartup = true @@ -1040,8 +1013,7 @@ func (node *AlgorandFullNode) SetCatchpointCatchupMode(catchpointCatchupMode boo node.waitMonitoringRoutines() }() node.net.ClearHandlers() - node.txnSyncConnector.stop() - node.txnSyncService.Stop() + node.txHandler.Stop() node.agreementService.Shutdown() node.catchupService.Stop() node.txPoolSyncerService.Stop() @@ -1065,8 +1037,7 @@ func (node *AlgorandFullNode) SetCatchpointCatchupMode(catchpointCatchupMode boo node.txPoolSyncerService.Start(node.catchupService.InitialSyncDone) node.blockService.Start() node.ledgerService.Start() - node.txnSyncService.Start() - node.txnSyncConnector.start() + node.txHandler.Start() // start indexer if idx, err := node.Indexer(); err == nil { diff --git a/node/txnSyncConn.go b/node/txnSyncConn.go deleted file mode 100644 index 00f5607ea7..0000000000 --- a/node/txnSyncConn.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -// Package node is the Algorand node itself, with functions exposed to the frontend -package node - -import ( - "context" - "time" - - "github.com/algorand/go-algorand/data" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/ledger/ledgercore" - "github.com/algorand/go-algorand/network" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/txnsync" - "github.com/algorand/go-algorand/util/timers" -) - -// txnsyncPeerDataKey is the key name by which we're going to store the -// transaction sync internal data object inside the network peer. -const txnsyncPeerDataKey = "txsync" - -// transactionSyncNodeConnector implements the txnsync.NodeConnector interface, allowing the -// transaction sync communicate with the node and it's child objects. -type transactionSyncNodeConnector struct { - node *AlgorandFullNode - eventsCh chan txnsync.Event - clock timers.WallClock - messageHandler txnsync.IncomingMessageHandler - txHandler data.SolicitedAsyncTxHandler - openStateCh chan struct{} -} - -func makeTransactionSyncNodeConnector(node *AlgorandFullNode) *transactionSyncNodeConnector { - return &transactionSyncNodeConnector{ - node: node, - eventsCh: make(chan txnsync.Event, 1), - clock: timers.MakeMonotonicClock(time.Now()), - txHandler: node.txHandler.SolicitedAsyncTxHandler(), - openStateCh: make(chan struct{}), - } -} - -func (tsnc *transactionSyncNodeConnector) Events() <-chan txnsync.Event { - return tsnc.eventsCh -} - -// GetCurrentRoundSettings is called when the txsync is starting up, proving -// round information. -func (tsnc *transactionSyncNodeConnector) GetCurrentRoundSettings() txnsync.RoundSettings { - round := tsnc.node.ledger.Latest() - return txnsync.RoundSettings{ - Round: round, - FetchTransactions: tsnc.node.config.ForceFetchTransactions || tsnc.node.accountManager.HasLiveKeys(round, round), - } -} - -// NotifyMonitor is used for testing purposes only, and can remain(almost) empty on production code. -func (tsnc *transactionSyncNodeConnector) NotifyMonitor() chan struct{} { - return tsnc.openStateCh -} - -func (tsnc *transactionSyncNodeConnector) Random(upperBound uint64) uint64 { - return tsnc.node.Uint64() % upperBound -} - -func (tsnc *transactionSyncNodeConnector) Clock() timers.WallClock { - return tsnc.clock -} - -func (tsnc *transactionSyncNodeConnector) GetPeer(networkPeer interface{}) txnsync.PeerInfo { - unicastPeer := networkPeer.(network.UnicastPeer) - if unicastPeer == nil { - return txnsync.PeerInfo{} - } - - peerData := tsnc.node.net.GetPeerData(networkPeer, txnsyncPeerDataKey) - if peerData == nil { - return txnsync.PeerInfo{ - IsOutgoing: unicastPeer.IsOutgoing(), - NetworkPeer: unicastPeer, - } - } - return txnsync.PeerInfo{ - IsOutgoing: unicastPeer.IsOutgoing(), - NetworkPeer: unicastPeer, - TxnSyncPeer: peerData.(*txnsync.Peer), - } -} - -func (tsnc *transactionSyncNodeConnector) GetPeers() (peersInfo []txnsync.PeerInfo) { - networkPeers := tsnc.node.net.GetPeers(network.PeersConnectedOut, network.PeersConnectedIn) - peersInfo = make([]txnsync.PeerInfo, len(networkPeers)) - k := 0 - for i := range networkPeers { - unicastPeer := networkPeers[i].(network.UnicastPeer) - if unicastPeer == nil { - continue - } - // check version. - if unicastPeer.Version() != "3.0" { - continue - } - peersInfo[k].IsOutgoing = unicastPeer.IsOutgoing() - peersInfo[k].NetworkPeer = networkPeers[i] - peerData := tsnc.node.net.GetPeerData(networkPeers[i], txnsyncPeerDataKey) - if peerData != nil { - peersInfo[k].TxnSyncPeer = peerData.(*txnsync.Peer) - } - k++ - } - - return peersInfo[:k] -} - -func (tsnc *transactionSyncNodeConnector) UpdatePeers(txnsyncPeers []*txnsync.Peer, netPeers []interface{}, averageDataExchangeRate uint64) { - for i, netPeer := range netPeers { - tsnc.node.net.SetPeerData(netPeer, txnsyncPeerDataKey, txnsyncPeers[i]) - } - // The average peers data exchange rate has been updated. - if averageDataExchangeRate > 0 { - // update the transaction pool with the latest peers data exchange rate. - tsnc.node.transactionPool.SetDataExchangeRate(averageDataExchangeRate) - } -} - -func (tsnc *transactionSyncNodeConnector) SendPeerMessage(netPeer interface{}, msg []byte, callback txnsync.SendMessageCallback) { - unicastPeer := netPeer.(network.UnicastPeer) - if unicastPeer == nil { - return - } - - // this might return an error to the network package callback routine. Returning an error signal the network package - // that we want to disconnect from this peer. This aligns with the transaction sync txnsync.SendMessageCallback function - // behaviour. - if err := unicastPeer.Unicast(context.Background(), msg, protocol.Txn2Tag, network.UnicastWebsocketMessageStateCallback(callback)); err != nil { - if callbackErr := callback(false, 0); callbackErr != nil { - // disconnect from peer - the transaction sync wasn't able to process message sending confirmation - tsnc.node.net.Disconnect(unicastPeer) - } - } -} - -func (tsnc *transactionSyncNodeConnector) GetPeerLatency(netPeer interface{}) time.Duration { - unicastPeer := netPeer.(network.UnicastPeer) - return unicastPeer.GetConnectionLatency() -} - -// GetPendingTransactionGroups is called by the transaction sync when it needs to look into the transaction -// pool and get the updated set of pending transactions. The second returned argument is the latest locally originated -// group counter within the given transaction groups list. If there is no group that is locally originated, the expected -// value is InvalidSignedTxGroupCounter. -func (tsnc *transactionSyncNodeConnector) GetPendingTransactionGroups() ([]pooldata.SignedTxGroup, uint64) { - return tsnc.node.transactionPool.PendingTxGroups() -} - -func (tsnc *transactionSyncNodeConnector) onNewTransactionPoolEntry(transactionPoolSize int) { - select { - case tsnc.eventsCh <- txnsync.MakeTransactionPoolChangeEvent(transactionPoolSize, false): - default: - } -} - -// OnNewBlock receives a notification that we've moved to a new round from the ledger. -// This notification would be received before the transaction pool get a similar notification, due -// the ordering of the block notifier registration. -func (tsnc *transactionSyncNodeConnector) OnNewBlock(block bookkeeping.Block, delta ledgercore.StateDelta) { - blkRound := block.Round() - - fetchTransactions := tsnc.node.config.ForceFetchTransactions || tsnc.node.accountManager.HasLiveKeys(blkRound, blkRound) - // if this is a relay, then we always want to fetch transactions, regardless if we have participation keys. - if tsnc.node.config.NetAddress != "" { - fetchTransactions = true - } - - select { - case tsnc.eventsCh <- txnsync.MakeNewRoundEvent(blkRound, fetchTransactions): - default: - } - -} - -func (tsnc *transactionSyncNodeConnector) start() { - tsnc.txHandler.Start() - tsnc.messageHandler = tsnc.node.txnSyncService.GetIncomingMessageHandler() - handlers := []network.TaggedMessageHandler{ - {Tag: protocol.Txn2Tag, MessageHandler: tsnc}, - } - tsnc.node.net.RegisterHandlers(handlers) -} - -func (tsnc *transactionSyncNodeConnector) Handle(raw network.IncomingMessage) network.OutgoingMessage { - unicastPeer := raw.Sender.(network.UnicastPeer) - if unicastPeer != nil { - // check version. - if unicastPeer.Version() != "3.0" { - return network.OutgoingMessage{ - Action: network.Ignore, - } - } - } - var peer *txnsync.Peer - peerData := tsnc.node.net.GetPeerData(raw.Sender, txnsyncPeerDataKey) - if peerData != nil { - peer = peerData.(*txnsync.Peer) - } - - err := tsnc.messageHandler(raw.Sender, peer, raw.Data, raw.Sequence, raw.Received) - if err != nil { - return network.OutgoingMessage{ - Action: network.Disconnect, - } - } - return network.OutgoingMessage{ - Action: network.Ignore, - } -} - -func (tsnc *transactionSyncNodeConnector) stop() { - tsnc.txHandler.Stop() -} - -func (tsnc *transactionSyncNodeConnector) IncomingTransactionGroups(peer *txnsync.Peer, messageSeq uint64, txGroups []pooldata.SignedTxGroup) (transactionPoolSize int) { - if tsnc.txHandler.HandleTransactionGroups(peer.GetNetworkPeer(), peer.GetTransactionPoolAckChannel(), messageSeq, txGroups) { - transactionPoolSize = tsnc.node.transactionPool.PendingCount() - } else { - transactionPoolSize = -1 - } - return -} diff --git a/protocol/tags.go b/protocol/tags.go index 070460c1aa..0cab256282 100644 --- a/protocol/tags.go +++ b/protocol/tags.go @@ -41,5 +41,4 @@ const ( //UniEnsBlockResTag Tag = "US" was used for wsfetcherservice //UniCatchupResTag Tag = "UT" was used for wsfetcherservice VoteBundleTag Tag = "VB" - Txn2Tag Tag = "tx" ) diff --git a/protocol/txntype.go b/protocol/txntype.go index 8f6129139b..919c576d4e 100644 --- a/protocol/txntype.go +++ b/protocol/txntype.go @@ -47,15 +47,3 @@ const ( // UnknownTx signals an error UnknownTx TxType = "unknown" ) - -// TxnTypes is an array containing all the defined transaction types -var TxnTypes = []TxType{ - PaymentTx, - KeyRegistrationTx, - AssetConfigTx, - AssetTransferTx, - AssetFreezeTx, - ApplicationCallTx, - CompactCertTx, - UnknownTx, -} diff --git a/rpcs/blockService_test.go b/rpcs/blockService_test.go index 38d07aba1e..542e8783ed 100644 --- a/rpcs/blockService_test.go +++ b/rpcs/blockService_test.go @@ -44,14 +44,11 @@ type mockUnicastPeer struct { func (mup *mockUnicastPeer) GetAddress() string { return "" } -func (mup *mockUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag, callback network.UnicastWebsocketMessageStateCallback) error { +func (mup *mockUnicastPeer) Unicast(ctx context.Context, data []byte, tag protocol.Tag) error { return nil } func (mup *mockUnicastPeer) Version() string { - return network.ProtocolVersion -} -func (mup *mockUnicastPeer) IsOutgoing() bool { - return false + return "2.1" } // GetConnectionLatency returns the connection latency between the local node and this peer. diff --git a/rpcs/txService.go b/rpcs/txService.go index 9201f96e2e..df08114c64 100644 --- a/rpcs/txService.go +++ b/rpcs/txService.go @@ -194,11 +194,7 @@ func (txs *TxService) updateTxCache() (pendingTxGroups [][]transactions.SignedTx // The txs.pool.PendingTxGroups() function allocates a new array on every call. That means that the old // array ( if being used ) is still valid. There is no risk of data race here since // the txs.pendingTxGroups is a slice (hence a pointer to the array) and not the array itself. - pendingSignedTxGroups, _ := txs.pool.PendingTxGroups() - txs.pendingTxGroups = make([][]transactions.SignedTxn, len(pendingSignedTxGroups)) - for i := range txs.pendingTxGroups { - txs.pendingTxGroups[i] = pendingSignedTxGroups[i].Transactions - } + txs.pendingTxGroups = txs.pool.PendingTxGroups() txs.lastUpdate = currentUnixTime } return txs.pendingTxGroups diff --git a/rpcs/txSyncer.go b/rpcs/txSyncer.go index 4d9f344f11..0290d82a6d 100644 --- a/rpcs/txSyncer.go +++ b/rpcs/txSyncer.go @@ -23,7 +23,6 @@ import ( "time" "github.com/algorand/go-algorand/data" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" @@ -33,7 +32,7 @@ import ( // PendingTxAggregate is a container of pending transactions type PendingTxAggregate interface { PendingTxIDs() []transactions.Txid - PendingTxGroups() ([]pooldata.SignedTxGroup, uint64) + PendingTxGroups() [][]transactions.SignedTxn } // TxSyncClient abstracts sync-ing pending transactions from a peer. diff --git a/rpcs/txSyncer_test.go b/rpcs/txSyncer_test.go index c9a0d274fc..9b89fda1bd 100644 --- a/rpcs/txSyncer_test.go +++ b/rpcs/txSyncer_test.go @@ -32,7 +32,6 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" @@ -76,16 +75,8 @@ func (mock mockPendingTxAggregate) PendingTxIDs() []transactions.Txid { } return ids } -func makeSignedTxGroup(source [][]transactions.SignedTxn) (result []pooldata.SignedTxGroup) { - result = make([]pooldata.SignedTxGroup, len(source)) - for i := range source { - result[i].Transactions = source[i] - } - return -} - -func (mock mockPendingTxAggregate) PendingTxGroups() ([]pooldata.SignedTxGroup, uint64) { - return makeSignedTxGroup(bookkeeping.SignedTxnsToGroups(mock.txns)), pooldata.InvalidSignedTxGroupCounter +func (mock mockPendingTxAggregate) PendingTxGroups() [][]transactions.SignedTxn { + return bookkeeping.SignedTxnsToGroups(mock.txns) } type mockHandler struct { @@ -106,7 +97,7 @@ type mockRunner struct { done chan *rpc.Call failWithNil bool failWithError bool - txgroups []pooldata.SignedTxGroup + txgroups [][]transactions.SignedTxn } type mockRPCClient struct { @@ -137,11 +128,7 @@ func (client *mockRPCClient) Sync(ctx context.Context, bloom *bloom.Filter) (txg if client.client.failWithError { return nil, errors.New("failing call") } - txgroups = make([][]transactions.SignedTxn, len(client.client.txgroups)) - for i := range txgroups { - txgroups[i] = client.client.txgroups[i].Transactions - } - return txgroups, nil + return client.client.txgroups, nil } // network.HTTPPeer interface @@ -181,8 +168,7 @@ func TestSyncFromClient(t *testing.T) { clientPool := makeMockPendingTxAggregate(2) serverPool := makeMockPendingTxAggregate(1) - serverTxGroups, _ := serverPool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: serverTxGroups[len(serverTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: serverPool.PendingTxGroups()[len(serverPool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -197,8 +183,7 @@ func TestSyncFromUnsupportedClient(t *testing.T) { partitiontest.PartitionTest(t) pool := makeMockPendingTxAggregate(3) - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: true, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: true, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -213,8 +198,7 @@ func TestSyncFromClientAndQuit(t *testing.T) { partitiontest.PartitionTest(t) pool := makeMockPendingTxAggregate(3) - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -229,8 +213,7 @@ func TestSyncFromClientAndError(t *testing.T) { partitiontest.PartitionTest(t) pool := makeMockPendingTxAggregate(3) - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: true, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: true, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -244,8 +227,7 @@ func TestSyncFromClientAndTimeout(t *testing.T) { partitiontest.PartitionTest(t) pool := makeMockPendingTxAggregate(3) - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -266,8 +248,7 @@ func TestSync(t *testing.T) { nodeA.start() nodeAURL := nodeA.rootURL() - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, rootURL: nodeAURL, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -302,8 +283,7 @@ func TestStartAndStop(t *testing.T) { nodeA.start() nodeAURL := nodeA.rootURL() - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, rootURL: nodeAURL, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} @@ -340,8 +320,7 @@ func TestStartAndQuit(t *testing.T) { partitiontest.PartitionTest(t) pool := makeMockPendingTxAggregate(3) - poolTxGroups, _ := pool.PendingTxGroups() - runner := mockRunner{failWithNil: false, failWithError: false, txgroups: poolTxGroups[len(poolTxGroups)-1:], done: make(chan *rpc.Call)} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.PendingTxGroups()[len(pool.PendingTxGroups())-1:], done: make(chan *rpc.Call)} client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} diff --git a/test/e2e-go/cli/goal/expect/goalNodeTest.exp b/test/e2e-go/cli/goal/expect/goalNodeTest.exp index d1af42d77a..efab678f1e 100644 --- a/test/e2e-go/cli/goal/expect/goalNodeTest.exp +++ b/test/e2e-go/cli/goal/expect/goalNodeTest.exp @@ -53,35 +53,22 @@ if { [catch { # Stop node ::AlgorandGoal::StopNode $TEST_PRIMARY_NODE_DIR - set WAIT_FOR_EOF 0 # Try stopping the node again, should fail spawn goal node stop -d $TEST_PRIMARY_NODE_DIR expect { timeout { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" } - "^Cannot kill node: no running node in directory '*'" {puts "Node failed to stop, as expected"; set WAIT_FOR_EOF 1; exp_continue } - eof { - if {$WAIT_FOR_EOF == 0} { - close; - ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" - } - set WAIT_FOR_EOF 0 - } + "^Cannot kill node: no running node in directory '*'" {puts "Node failed successfully"; close} + eof { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" } } - # Try stopping node in invalid directory, should fail + #Try stopping node in invalid directory, should fail spawn goal node stop -d '' expect { timeout { close; ::AlgorandGoal::Abort "Goal Node Fail did not fail as expected" } - "^Cannot kill node: the provided directory '*' does not exist" {puts "Node failed to start on an invalid directory, as expected"; set WAIT_FOR_EOF 1; exp_continue } - eof { - if {$WAIT_FOR_EOF == 0} { - close; - ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" - } - set WAIT_FOR_EOF 0 - } + "^Cannot kill node: the provided directory '*' does not exist" {puts "Node failed successfully"; close} + eof { close; ::AlgorandGoal::Abort "Goal Node Stop did not fail as expected" } } - + # "break" the node by replacing it's ledger data files with "broken" ones. lassign [exec find $TEST_PRIMARY_NODE_DIR -name "ledger.tracker.sqlite"] PRIMARY_TRACKER_DATABASE_FILE exec find $TEST_PRIMARY_NODE_DIR -name "ledger.tracker.sqlite*" -delete diff --git a/test/e2e-go/features/transactions/messageRate_test.go b/test/e2e-go/features/transactions/messageRate_test.go deleted file mode 100644 index ac0394e644..0000000000 --- a/test/e2e-go/features/transactions/messageRate_test.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package transactions - -import ( - "bufio" - "context" - "fmt" - "io/ioutil" - "math" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/account" - "github.com/algorand/go-algorand/libgoal" - "github.com/algorand/go-algorand/test/framework/fixtures" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/db" -) - -// this test checks that the txsync outgoing message rate -// varies according to the transaction rate -func TestMessageRateChangesWithTxnRate(t *testing.T) { - partitiontest.PartitionTest(t) - if _, present := os.LookupEnv("GORACE"); present { - t.Skip("Skipping MessageRateChangesWithTxnRate test when race mode is enabled") - } - a := require.New(fixtures.SynchronizedTest(t)) - txnRates := []uint{50, 300, 800, 1200} - if testing.Short() { - txnRates = []uint{50, 300} - } - prevMsgRate := 0.0 - for _, txnRate := range txnRates { - avgTps, msgRate := testMessageRateChangesWithTxnRate(t, filepath.Join("nettemplates", "OneNodeTwoRelays.json"), txnRate, a) - fmt.Printf("Message rate: %f Previous Message Rate: %f \nExpected Transaction rate: %f Actual Transaction rate: %f\n", msgRate, prevMsgRate, float64(txnRate), avgTps) - aErrorMessage := fmt.Sprintf("TxSync message rate not monotonic for txn rate: %d", txnRate) - a.GreaterOrEqual(msgRate, prevMsgRate, aErrorMessage) - prevMsgRate = msgRate - } - -} - -func throttleTransactionRate(startTime time.Time, txnRate uint, sentSoFar uint) float64 { - timeDelta := time.Since(startTime) - currentTps := float64(sentSoFar) / timeDelta.Seconds() - if currentTps > float64(txnRate) { - sleepDuration := float64(sentSoFar)/float64(txnRate) - timeDelta.Seconds() - sleepTime := time.Duration(int64(math.Round(sleepDuration*1000))) * time.Millisecond - time.Sleep(sleepTime) - currentTps = float64(sentSoFar) / (sleepDuration + timeDelta.Seconds()) - } - return currentTps -} - -func testMessageRateChangesWithTxnRate(t *testing.T, templatePath string, txnRate uint, a *require.Assertions) (avgTps, msgRate float64) { - var fixture fixtures.RestClientFixture - fixture.SetupNoStart(t, templatePath) - nodeDataDir, err := fixture.GetNodeDir("Node") - a.NoError(err) - cfg, err := config.LoadConfigFromDisk(nodeDataDir) - a.NoError(err) - cfg.EnableVerbosedTransactionSyncLogging = true - cfg.SaveToDisk(nodeDataDir) - fixture.Start() - - defer fixture.Shutdown() - - client := fixture.GetLibGoalClientForNamedNode("Node") - accountsList, err := fixture.GetNodeWalletsSortedByBalance(client.DataDir()) - a.NoError(err) - account := accountsList[0].Address - clientAlgod := fixture.GetAlgodClientForController(fixture.GetNodeControllerForDataDir(nodeDataDir)) - - // get the node account's secret key - secretKey, err := fetchSecretKey(client, nodeDataDir) - a.NoError(err) - signatureSecrets, err := crypto.SecretKeyToSignatureSecrets(secretKey) - a.NoError(err) - - // build the path for the primary node's log file - logPath := filepath.Join(nodeDataDir, "node.log") - - // Get the relay's gossip port - r1, err := fixture.GetNodeController("Relay1") - a.NoError(err) - listeningURLRaw, err := r1.GetListeningAddress() - a.NoError(err) - listeningURL := strings.Split(listeningURLRaw, "//")[1] - - errChan := make(chan error) - resetChan := make(chan bool) - msgRateChan := make(chan float64) - ctx, stopParsing := context.WithCancel(context.Background()) - defer stopParsing() - - go parseLog(ctx, logPath, listeningURL, errChan, msgRateChan, resetChan) - - // get the min transaction fee - minTxnFee, _, err := fixture.CurrentMinFeeAndBalance() - a.NoError(err) - transactionFee := minTxnFee * 1000 * 253 - - startTime := time.Now() - txnSentCount := uint(0) - - for { - // send txns at txnRate for 30s - timeSinceStart := time.Since(startTime) - if timeSinceStart > 30*time.Second { - break - } - - tx, err := client.ConstructPayment(account, account, transactionFee, 0, GenerateRandomBytes(8), "", [32]byte{}, 0, 0) - a.NoError(err) - signedTxn := tx.Sign(signatureSecrets) - - _, err = clientAlgod.SendRawTransaction(signedTxn) - a.NoError(err, "Unable to send raw txn") - - txnSentCount++ - - avgTps = throttleTransactionRate(startTime, txnRate, txnSentCount) - } - - // send reset on resetChan to signal the parseLog goroutine to send the msgRate and reset its counters - resetChan <- true - - select { - case err := <-errChan: - a.Error(err) - case msgRate = <-msgRateChan: - break - } - return -} - -// parseLog continuously monitors the log for txnsync messages sent to filterAddress -// resetChan is used to signal it to send results on msgRate chan -// and reset its internal counters -// errChan is used to propagate errors if any -func parseLog(ctx context.Context, logPath string, filterAddress string, errChan chan error, msgRateChan chan float64, resetChan chan bool) { - file, err := os.Open(logPath) - if err != nil { - errChan <- err - return - } - defer file.Close() - - messageCount := 0 - var firstTimestamp, lastTimestamp time.Time - firstTimestamp = time.Now() - - scanner := bufio.NewScanner(file) - for { - select { - case <-ctx.Done(): - return - case <-resetChan: - lastTimestamp = time.Now() - msgRate := float64(messageCount) / float64(lastTimestamp.Sub(firstTimestamp)) * float64(time.Second) - msgRateChan <- msgRate - messageCount = 0 - firstTimestamp = time.Now() - continue - default: - } - scanned := scanner.Scan() - if !scanned { - if err := scanner.Err(); err != nil { - errChan <- err - return - } - time.Sleep(100 * time.Millisecond) - scanner = bufio.NewScanner(file) - continue - } - - line := scanner.Text() - // look for txnsync messages sent to `filterAddress` - if strings.Contains(line, "Outgoing Txsync") && strings.Contains(line, filterAddress) { - messageCount++ - } - } -} - -func fetchSecretKey(client libgoal.Client, dataDir string) (crypto.PrivateKey, error) { - secretKey := crypto.PrivateKey{} - genID, err := client.GenesisID() - if err != nil { - return secretKey, err - } - - keyDir := filepath.Join(dataDir, genID) - files, err := ioutil.ReadDir(keyDir) - if err != nil { - return secretKey, err - } - - // For each of these files - for _, info := range files { - var handle db.Accessor - - filename := info.Name() - - // If it isn't a key file we care about, skip it - if config.IsRootKeyFilename(filename) { - handle, err = db.MakeAccessor(filepath.Join(keyDir, filename), true, false) - if err != nil { - // Couldn't open it, skip it - continue - } - - // Fetch an account.Root from the database - root, err := account.RestoreRoot(handle) - if err != nil { - return secretKey, err - } - - secretKey = crypto.PrivateKey(root.Secrets().SK) - break - } - - } - - return secretKey, nil -} diff --git a/test/e2e-go/features/transactions/sendReceive_test.go b/test/e2e-go/features/transactions/sendReceive_test.go index a04b86dd7a..fadf5b620d 100644 --- a/test/e2e-go/features/transactions/sendReceive_test.go +++ b/test/e2e-go/features/transactions/sendReceive_test.go @@ -17,14 +17,12 @@ package transactions import ( - "fmt" "math/rand" "path/filepath" "testing" "github.com/stretchr/testify/require" - "github.com/algorand/go-algorand/config" v1 "github.com/algorand/go-algorand/daemon/algod/api/spec/v1" "github.com/algorand/go-algorand/test/framework/fixtures" "github.com/algorand/go-algorand/test/partitiontest" @@ -68,16 +66,11 @@ func TestDevModeAccountsCanSendMoney(t *testing.T) { func testAccountsCanSendMoney(t *testing.T, templatePath string, numberOfSends int) { t.Parallel() + a := require.New(fixtures.SynchronizedTest(t)) var fixture fixtures.RestClientFixture fixture.Setup(t, templatePath) defer fixture.Shutdown() - testAccountsCanSendMoneyFixture(t, &fixture, numberOfSends) -} - -func testAccountsCanSendMoneyFixture(t *testing.T, fixture *fixtures.RestClientFixture, numberOfSends int) { - a := require.New(fixtures.SynchronizedTest(t)) - c := fixture.LibGoalClient pingClient := fixture.LibGoalClient @@ -166,104 +159,3 @@ func testAccountsCanSendMoneyFixture(t *testing.T, fixture *fixtures.RestClientF a.True(expectedPingBalance <= pingBalance, "ping balance is different than expected.") a.True(expectedPongBalance <= pongBalance, "pong balance is different than expected.") } - -// this test checks that two accounts' balances stay up to date -// as they send each other money many times -func TestAccountsCanSendMoneyAcrossTxSync(t *testing.T) { - partitiontest.PartitionTest(t) - defer fixtures.ShutdownSynchronizedTest(t) - - numberOfSends := 3 - a := require.New(fixtures.SynchronizedTest(t)) - - networkProtocolVersions := []string{"3.0", "2.1"} - - testMoneySending := func(t *testing.T, primaryNodeVersionIdx, nodeVersionIdx int) { - t.Run(fmt.Sprintf("%s->%s", networkProtocolVersions[primaryNodeVersionIdx], networkProtocolVersions[nodeVersionIdx]), - func(t *testing.T) { - t.Parallel() - var fixture fixtures.RestClientFixture - fixture.SetupNoStart(t, filepath.Join("nettemplates", "TwoNodes50Each.json")) - defer fixture.Shutdown() - - cfg, err := config.LoadConfigFromDisk(fixture.PrimaryDataDir()) - a.NoError(err) - cfg.NetworkProtocolVersion = networkProtocolVersions[primaryNodeVersionIdx] - cfg.SaveToDisk(fixture.PrimaryDataDir()) - - cfg, err = config.LoadConfigFromDisk(fixture.NodeDataDirs()[0]) - a.NoError(err) - cfg.NetworkProtocolVersion = networkProtocolVersions[primaryNodeVersionIdx] - cfg.SaveToDisk(fixture.NodeDataDirs()[0]) - - fixture.Start() - testAccountsCanSendMoneyFixture(t, &fixture, numberOfSends) - }) - } - - // test to see that we can communicate correctly regardless of the network protocol version. - for primaryNodeVersionIdx := 0; primaryNodeVersionIdx < 2; primaryNodeVersionIdx++ { - for nodeVersionIdx := 0; nodeVersionIdx < 2; nodeVersionIdx++ { - testMoneySending(t, primaryNodeVersionIdx, nodeVersionIdx) - } - } -} - -// this test checks that a relay would relay a transaction -// received via the txnsync onto a node that doesn't support -// transaction sync. -func TestTransactionSyncRelayBridge(t *testing.T) { - - partitiontest.PartitionTest(t) - defer fixtures.ShutdownSynchronizedTest(t) - - a := require.New(fixtures.SynchronizedTest(t)) - - var fixture fixtures.RestClientFixture - fixture.SetupNoStart(t, filepath.Join("nettemplates", "ThreeNodesOneOnline.json")) - defer fixture.Shutdown() - - onlineNodeController, err := fixture.GetNodeController("OnlineNode") - a.NoError(err) - - cfg, err := config.LoadConfigFromDisk(onlineNodeController.GetDataDir()) - a.NoError(err) - cfg.NetworkProtocolVersion = "2.1" - cfg.SaveToDisk(onlineNodeController.GetDataDir()) - - offlineNodeController, err := fixture.GetNodeController("OfflineNode") - a.NoError(err) - - cfg, err = config.LoadConfigFromDisk(offlineNodeController.GetDataDir()) - a.NoError(err) - cfg.NetworkProtocolVersion = "3.0" - cfg.SaveToDisk(offlineNodeController.GetDataDir()) - - fixture.Start() - - client := fixture.GetLibGoalClientFromNodeController(offlineNodeController) - accounts, err := fixture.GetNodeWalletsSortedByBalance(client.DataDir()) - a.NoError(err) - - a.Equal(1, len(accounts)) - - sendingAccount := accounts[0].Address - - _, err = client.SendPaymentFromUnencryptedWallet(sendingAccount, sendingAccount, 1024*1024, 1024, nil) - a.NoError(err) - - startRoundStatus, err := client.Status() - a.NoError(err) - for { - pendingTxns, err := client.GetPendingTransactions(2) - a.NoError(err) - if pendingTxns.TotalTxns == 0 { - break - } - status, err := client.Status() - a.NoError(err) - _, err = client.WaitForRound(status.LastRound) - a.NoError(err) - a.Less(uint64(status.LastRound), uint64(startRoundStatus.LastRound+5), "transaction is still pending after 5 rounds, whereas it should have been confirmed within 2 rounds.") - } -} diff --git a/test/e2e-go/features/transactions/txnsync_test.go b/test/e2e-go/features/transactions/txnsync_test.go deleted file mode 100644 index ee373ea5ee..0000000000 --- a/test/e2e-go/features/transactions/txnsync_test.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package transactions - -import ( - "context" - "fmt" - "math" - "path/filepath" - "testing" - "time" - - "github.com/algorand/go-deadlock" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/libgoal" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/framework/fixtures" - "github.com/algorand/go-algorand/test/partitiontest" -) - -// This test sets up a network with 2 nodes and 2 relays. -// The two nodes send payment transactions. - -// For each transaction, the test checks if the relays and the nodes -// (including the node that originated the transaction) have the -// transaction in the pool (i.e. the transactionInfo.ConfirmedRound == -// 0). - -// The tests needs to check for the transactions in the pool fast -// enough before they get evicted from the pool to the block. - -// To achieve this, it sends transactions during the first half of the -// round period, to give the test enough time to check for the -// transactions. -func TestTxnSync(t *testing.T) { - partitiontest.PartitionTest(t) - - maxNumberOfSends := 1200 - maxRate := 1000 // txn/sec - if testing.Short() { - maxNumberOfSends = 300 - } - templatePath := filepath.Join("nettemplates", "TwoNodes50EachWithTwoRelays.json") - - var fixture fixtures.RestClientFixture - - roundTime := time.Duration(8 * 1000 * time.Millisecond) - - proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] - require.True(t, ok) - proto.AgreementFilterTimeoutPeriod0 = roundTime - proto.AgreementFilterTimeout = roundTime - fixture.SetConsensus(config.ConsensusProtocols{protocol.ConsensusCurrentVersion: proto}) - - fixture.Setup(t, templatePath) - defer fixture.Shutdown() - - node1 := fixture.GetLibGoalClientForNamedNode("Node1") - node2 := fixture.GetLibGoalClientForNamedNode("Node2") - relay1 := fixture.GetLibGoalClientForNamedNode("Relay1") - relay2 := fixture.GetLibGoalClientForNamedNode("Relay2") - - n1chan := make(chan string, maxNumberOfSends*2) - n2chan := make(chan string, maxNumberOfSends*2) - r1chan := make(chan string, maxNumberOfSends*2) - r2chan := make(chan string, maxNumberOfSends*2) - - ctx, cancel := context.WithCancel(context.Background()) - - account1List, err := fixture.GetNodeWalletsSortedByBalance(node1.DataDir()) - require.NoError(t, err) - account1 := account1List[0].Address - - account2List, err := fixture.GetNodeWalletsSortedByBalance(node2.DataDir()) - require.NoError(t, err) - account2 := account2List[0].Address - - ttn1 := transactionTracker{ - t: t, - ctx: ctx, - client: &node1, - othersToVerify: []chan string{n2chan, r1chan, r2chan, n1chan}, - selfToVerify: n1chan, - pendingVerification: make(map[string]bool), - account1: account1, - account2: account2, - name: "node1", - cancelFunc: cancel, - } - - ttn2 := transactionTracker{ - t: t, - ctx: ctx, - client: &node2, - othersToVerify: []chan string{n1chan, r1chan, r2chan, n2chan}, - selfToVerify: n2chan, - pendingVerification: make(map[string]bool), - account1: account1, - account2: account2, - name: "node2", - cancelFunc: cancel, - } - - ttr1 := transactionTracker{ - t: t, - ctx: ctx, - client: &relay1, - othersToVerify: []chan string{n1chan, n2chan, r2chan, r1chan}, - selfToVerify: r1chan, - pendingVerification: make(map[string]bool), - account1: account1, - account2: account2, - name: "relay1", - cancelFunc: cancel, - } - - ttr2 := transactionTracker{ - t: t, - ctx: ctx, - client: &relay2, - othersToVerify: []chan string{n1chan, n2chan, r1chan, r2chan}, - selfToVerify: r2chan, - pendingVerification: make(map[string]bool), - account1: account1, - account2: account2, - name: "relay2", - cancelFunc: cancel, - } - - minTxnFee, minAcctBalance, err := fixture.CurrentMinFeeAndBalance() - require.NoError(t, err) - - transactionFee := minTxnFee * 1000 - amount1 := minAcctBalance / uint64(maxNumberOfSends) - amount2 := minAcctBalance / uint64(maxNumberOfSends) - - defer ttn1.terminate() - defer ttn2.terminate() - defer ttr1.terminate() - defer ttr2.terminate() - - defer cancel() - - go ttn1.passTxnsToVeirfy() - go ttn2.passTxnsToVeirfy() - go ttr1.passTxnsToVeirfy() - go ttr2.passTxnsToVeirfy() - - go ttn1.checkAll() - go ttn2.checkAll() - go ttr1.checkAll() - go ttr2.checkAll() - - // wait for the 1st round - nextRound := uint64(1) - err = fixture.ClientWaitForRound(fixture.AlgodClient, nextRound, 20*roundTime) - require.NoError(t, err) - nextRound++ - - st := time.Now() - timeout := time.NewTimer(roundTime / 2) - - for i := 0; i < maxNumberOfSends; i++ { - - select { - case <-ctx.Done(): - require.True(t, false, "Context canceled due to an error at iteration %d", i) - return - case <-timeout.C: - // Send the transactions only during the first half of the round - // Wait for the next round, and stop sending transactions after the first half - err = fixture.ClientWaitForRound(fixture.AlgodClient, nextRound, 10*roundTime) - require.NoError(t, err) - fmt.Printf("Round %d\n", int(nextRound)) - nextRound++ - timeout = time.NewTimer(roundTime / 2) - default: - } - throttleRate(st, maxRate, i*2) - tx1, err := node1.SendPaymentFromUnencryptedWallet(account1, account2, transactionFee, amount1, GenerateRandomBytes(8)) - require.NoError(t, err, "Failed to send transaction on iteration %d", i) - ttn1.addTransactionToVerify(tx1.ID().String()) - - tx2, err := node2.SendPaymentFromUnencryptedWallet(account2, account1, transactionFee, amount2, GenerateRandomBytes(8)) - require.NoError(t, err, "Failed to send transaction on iteration %d", i) - ttn2.addTransactionToVerify(tx2.ID().String()) - if i%100 == 0 { - fmt.Printf("txn sent %d / %d\n", i, maxNumberOfSends) - } - } - close(ttn1.selfToVerify) - close(ttn2.selfToVerify) - close(ttr1.selfToVerify) - close(ttr2.selfToVerify) - - // wait until all channels are empty for max 50 seconds - for x := 0; x < 250; x++ { - select { - case <-ctx.Done(): - require.True(t, false, "Context canceled due to an error") - default: - } - - if ttn1.channelsAreEmpty() { - break - } - time.Sleep(200 * time.Millisecond) - if x%10 == 0 { - fmt.Printf("waiting for channel flushing [%d %d %d %d] %d / %d\n", len(n1chan), len(n2chan), len(r1chan), len(r2chan), x, 250) - } - } - require.True(t, ttn1.channelsAreEmpty()) - - unprocessed := 0 - maxWait := 100 - for x := 0; x < maxWait; x++ { - select { - case <-ctx.Done(): - require.True(t, false, "Context canceled due to an error") - default: - } - ttn1.mu.Lock() - unprocessed = len(ttn1.pendingVerification) - ttn1.mu.Unlock() - - ttn2.mu.Lock() - unprocessed += len(ttn2.pendingVerification) - ttn2.mu.Unlock() - - ttr1.mu.Lock() - unprocessed += len(ttr1.pendingVerification) - ttr1.mu.Unlock() - - ttr2.mu.Lock() - unprocessed += len(ttr2.pendingVerification) - ttr2.mu.Unlock() - - if unprocessed == 0 { - break - } - time.Sleep(200 * time.Millisecond) - if x%10 == 0 { - fmt.Printf("waiting for pending verificaitons [%d] %d / %d\n", unprocessed, x, maxWait) - } - } - require.Equal(t, 0, unprocessed, "missing %d transactions", unprocessed) -} - -type transactionTracker struct { - t *testing.T - ctx context.Context - mu deadlock.Mutex - client *libgoal.Client - othersToVerify []chan string - selfToVerify chan string - pendingVerification map[string]bool - account1 string - account2 string - name string - cancelFunc context.CancelFunc -} - -// Adds the transaction to the channels of the nodes intended to receive the transaction -// This should not block to maintain the transaction rate. Hence, the channel is large enough. -func (tt *transactionTracker) addTransactionToVerify(transactionID string) { - for _, c := range tt.othersToVerify { - select { - case <-tt.ctx.Done(): - return - case c <- transactionID: - } - } -} - -func (tt *transactionTracker) passTxnsToVeirfy() { - for tid := range tt.selfToVerify { - select { - case <-tt.ctx.Done(): - return - default: - } - - tt.mu.Lock() - tt.pendingVerification[tid] = true - tt.mu.Unlock() - } -} - -func (tt *transactionTracker) checkAll() { - for { - select { - case <-tt.ctx.Done(): - return - case _, more := <-tt.selfToVerify: - tt.mu.Lock() - if !more && len(tt.pendingVerification) == 0 { - tt.mu.Unlock() - return - } - tt.mu.Unlock() - default: - } - transactions, err := tt.client.GetPendingTransactionsByAddress(tt.account1, 1000000) - if err != nil { - tt.cancelFunc() - require.NoError(tt.t, err) - } - - for _, transactionInfo := range transactions.TruncatedTxns.Transactions { - tt.mu.Lock() - if _, ok := tt.pendingVerification[transactionInfo.TxID]; ok { - delete(tt.pendingVerification, transactionInfo.TxID) - } - tt.mu.Unlock() - } - - transactions, err = tt.client.GetPendingTransactionsByAddress(tt.account2, 1000000) - if err != nil { - tt.cancelFunc() - require.NoError(tt.t, err) - } - - for _, transactionInfo := range transactions.TruncatedTxns.Transactions { - tt.mu.Lock() - if _, ok := tt.pendingVerification[transactionInfo.TxID]; ok { - delete(tt.pendingVerification, transactionInfo.TxID) - } - tt.mu.Unlock() - } - time.Sleep(time.Second) - } -} - -func (tt *transactionTracker) terminate() { - tt.mu.Lock() - defer tt.mu.Unlock() - require.Equal(tt.t, 0, len(tt.pendingVerification), "%s is missing %d transactions", tt.name, len(tt.pendingVerification)) -} - -// Retruns true if all the associated channels are empty -func (tt *transactionTracker) channelsAreEmpty() bool { - for _, c := range tt.othersToVerify { - if len(c) > 0 { - return false - } - } - return true -} - -// throttle transaction rate -func throttleRate(startTime time.Time, targetRate int, total int) { - localTimeDelta := time.Now().Sub(startTime) - currentTps := float64(total) / localTimeDelta.Seconds() - if currentTps > float64(targetRate) { - sleepSec := float64(total)/float64(targetRate) - localTimeDelta.Seconds() - sleepTime := time.Duration(int64(math.Round(sleepSec*1000))) * time.Millisecond - time.Sleep(sleepTime) - } -} diff --git a/test/testdata/configs/config-v18.json b/test/testdata/configs/config-v18.json index b1a977e64c..aa7a010b30 100644 --- a/test/testdata/configs/config-v18.json +++ b/test/testdata/configs/config-v18.json @@ -71,7 +71,7 @@ "OutgoingMessageFilterBucketSize": 128, "ParticipationKeysRefreshInterval": 60000000000, "PeerConnectionsUpdateInterval": 3600, - "PeerPingPeriodSeconds": 10, + "PeerPingPeriodSeconds": 0, "PriorityPeers": {}, "PublicAddress": "", "ReconnectTime": 60000000000, diff --git a/test/testdata/configs/config-v19.json b/test/testdata/configs/config-v19.json index 467f6edd44..fac1122017 100644 --- a/test/testdata/configs/config-v19.json +++ b/test/testdata/configs/config-v19.json @@ -71,7 +71,7 @@ "OutgoingMessageFilterBucketSize": 128, "ParticipationKeysRefreshInterval": 60000000000, "PeerConnectionsUpdateInterval": 3600, - "PeerPingPeriodSeconds": 10, + "PeerPingPeriodSeconds": 0, "PriorityPeers": {}, "ProposalAssemblyTime": 250000000, "PublicAddress": "", diff --git a/test/testdata/mainnetblocks b/test/testdata/mainnetblocks deleted file mode 100644 index 1acd125b09..0000000000 Binary files a/test/testdata/mainnetblocks and /dev/null differ diff --git a/test/testdata/nettemplates/OneNodeTwoRelays.json b/test/testdata/nettemplates/OneNodeTwoRelays.json deleted file mode 100644 index 552930b3fa..0000000000 --- a/test/testdata/nettemplates/OneNodeTwoRelays.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "Genesis": { - "NetworkName": "tbd", - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 100, - "Online": true - } - ] - }, - "Nodes": [ - { - "Name": "Relay1", - "IsRelay": true - - }, - { - "Name": "Relay2", - "IsRelay": true - }, - { - "Name": "Node", - "Wallets": [ - { "Name": "Wallet1", - "ParticipationOnly": false } - ] - } - ] -} diff --git a/test/testdata/nettemplates/ThreeNodesOneOnline.json b/test/testdata/nettemplates/ThreeNodesOneOnline.json deleted file mode 100644 index df214101f9..0000000000 --- a/test/testdata/nettemplates/ThreeNodesOneOnline.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "Genesis": { - "NetworkName": "tbd", - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 50, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 50, - "Online": false - } - ] - }, - "Nodes": [ - { - "Name": "Primary", - "IsRelay": true, - "Wallets": [ - ] - }, - { - "Name": "OnlineNode", - "Wallets": [ - { "Name": "Wallet1", - "ParticipationOnly": true } - ] - }, - { - "Name": "OfflineNode", - "Wallets": [ - { "Name": "Wallet2", - "ParticipationOnly": false } - ] - } - ] -} diff --git a/test/testdata/nettemplates/TwoNodes50EachWithTwoRelays.json b/test/testdata/nettemplates/TwoNodes50EachWithTwoRelays.json deleted file mode 100644 index 70bae5b7e4..0000000000 --- a/test/testdata/nettemplates/TwoNodes50EachWithTwoRelays.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "Genesis": { - "NetworkName": "tbd", - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 50, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 50, - "Online": true - } - ] - }, - "Nodes": [ - { - "Name": "Relay1", - "IsRelay": true - }, - { - "Name": "Relay2", - "IsRelay": true - }, - { - "Name": "Node1", - "Wallets": [ - { "Name": "Wallet1", - "ParticipationOnly": false } - ] - }, - { - "Name": "Node2", - "Wallets": [ - { "Name": "Wallet2", - "ParticipationOnly": false } - ] - } - ] -} diff --git a/txnsync/bitmask.go b/txnsync/bitmask.go deleted file mode 100644 index 6990fc1d71..0000000000 --- a/txnsync/bitmask.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" -) - -var errIndexNotFound = errors.New("invalid bitmask: index not found") -var errInvalidBitmaskType = errors.New("invalid bitmask type") - -//msgp:allocbound bitmask maxBitmaskSize -type bitmask []byte - -// assumed to be in mode 0, sets bit at index to 1 -func (b *bitmask) setBit(index int) { - // bitmask type is stored at index 0, so the rest of the data is stored after. - byteIndex := index/8 + 1 - (*b)[byteIndex] |= 1 << (index % 8) -} - -// trimBitmask compresses the bitmask into one of the 4 types: -// type 0: input bitmask bit pos x b -> output bitmask bit pos x b -// type 1: input bitmask bit pos x b -> output bitmask bit pos x !b -// type 2: stores the positions of bits where the bit value is 1 -// input bitmask first bit 1 at pos A, second bit 1 at pos B, ... -// output bitmask stores A, B-A, ... -// type 3: same as type 2, but stores the positons where the bit is 0 -func (b *bitmask) trimBitmask(entries int) { - if *b == nil { - return - } - numBitsCase0 := 0 - numBitsCase1 := 0 - numExists := 0 - for i := 0; i < entries; i++ { - byteIndex := i/8 + 1 - if (*b)[byteIndex]&(1<<(i%8)) != 0 { - numBitsCase0 = i + 1 - numExists++ - } else { - numBitsCase1 = i + 1 - } - } - bitmaskType := 0 - bestSize := bytesNeededBitmask(numBitsCase0) - if bestSize > bytesNeededBitmask(numBitsCase1) { - bitmaskType = 1 - bestSize = bytesNeededBitmask(numBitsCase1) - } - if bestSize > numExists*2+1 { - bitmaskType = 2 - bestSize = numExists*2 + 1 - } - if bestSize > (entries-numExists)*2+1 { - bitmaskType = 3 - bestSize = (entries-numExists)*2 + 1 - } - switch bitmaskType { - case 0: - *b = (*b)[:bestSize] - case 1: - (*b)[0] = 1 - for i := range *b { - if i != 0 { - (*b)[i] = 255 - (*b)[i] // invert bits - } - } - *b = (*b)[:bestSize] - case 2: - newBitmask := make(bitmask, 1, bestSize) - newBitmask[0] = 2 - last := 0 - for i := 0; i < entries; i++ { - byteIndex := i/8 + 1 - if (*b)[byteIndex]&(1<<(i%8)) != 0 { - diff := i - last - newBitmask = append(newBitmask, byte(diff/256), byte(diff%256)) - last = i - } - } - *b = newBitmask - case 3: - newBitmask := make(bitmask, 1, bestSize) - newBitmask[0] = 3 - last := 0 - for i := 0; i < entries; i++ { - byteIndex := i/8 + 1 - if (*b)[byteIndex]&(1<<(i%8)) == 0 { - diff := i - last - newBitmask = append(newBitmask, byte(diff/256), byte(diff%256)) - last = i - } - } - *b = newBitmask - } -} - -// iterate through the elements of bitmask without expanding it. -// call the func(entriesCount, setBitIndex) for every set bit -// numTransactions: is the size of the array that transactionIndex is accessing: transactionIndex < numTransactions -// numItems: is the size of the array that itemIndex is accessing: itemIndex < numItems (itemIndex is also the set bit counter) -func (b *bitmask) iterate(numTransactions int, numItems int, callback func(int, int) error) error { - option := 0 - if len(*b) > 0 { - option = int((*b)[0]) - } else { // nothing to iterate - return nil - } - itemIndex := 0 - switch option { - case 0: - transactionIndex := 0 - maxV := bytesNeededBitmask(numTransactions) - if len(*b) > maxV { - return errIndexNotFound - } - for i, v := range (*b)[1:] { - for ; transactionIndex < numTransactions && v > 0; transactionIndex++ { - if v&1 != 0 { - if itemIndex >= numItems { - return errDataMissing - } - if err := callback(transactionIndex, itemIndex); err != nil { - return err - } - itemIndex++ - } - v >>= 1 - } - if v > 0 { - // remaining set bits, but transactionIndex exceeded numTransactions - return errIndexNotFound - } - // in case the loop is cut short because there are no more set bits in the byte - transactionIndex = (i + 1) * 8 - } - case 1: - transactionIndex := 0 - maxV := bytesNeededBitmask(numTransactions) - if len(*b) > maxV { - return errIndexNotFound - } - for _, v := range (*b)[1:] { - // after the first iteration of the loop below, v will be less than 255 - if v >= 255 { - transactionIndex += 8 - continue - } - maxJ := 8 - if maxJ > numTransactions-transactionIndex { - maxJ = numTransactions - transactionIndex - } - for j := 0; j < maxJ; j++ { - if v&1 == 0 { - if itemIndex >= numItems { - return errDataMissing - } - if err := callback(transactionIndex, itemIndex); err != nil { - return err - } - itemIndex++ - } - v >>= 1 - transactionIndex++ - } - if 255>>maxJ != v { - // The remaining of the bits must be 1 - return errIndexNotFound - } - } - if numTransactions-transactionIndex > numItems-itemIndex { - return errDataMissing - } - for ; transactionIndex < numTransactions; transactionIndex++ { - if err := callback(transactionIndex, itemIndex); err != nil { - return err - } - itemIndex++ - } - case 2: - sum := 0 // transactionIndex - elementsCount := (len(*b) - 1) / 2 - if elementsCount > numItems { - return errDataMissing - } - for itemIndex := 0; itemIndex < elementsCount; itemIndex++ { - sum += int((*b)[itemIndex*2+1])*256 + int((*b)[itemIndex*2+2]) - if sum >= numTransactions { - return errIndexNotFound - } - if err := callback(sum, itemIndex); err != nil { - return err - } - } - case 3: - sum := 0 - // This is the least amount of elements can be set. - // There could be more, if the numbers are corrupted - // i.e. when sum >= numTransactions - elementsCount := numTransactions - (len(*b)-1)/2 - if elementsCount > numItems || elementsCount < 0 { - return errDataMissing - } - transactionIndex := 0 - for i := 0; i*2+2 < len(*b); i++ { - sum += int((*b)[i*2+1])*256 + int((*b)[i*2+2]) - if sum >= numTransactions { - return errIndexNotFound - } - for transactionIndex < sum { - if err := callback(transactionIndex, itemIndex); err != nil { - return err - } - transactionIndex++ - itemIndex++ - } - transactionIndex++ - } - for transactionIndex < numTransactions { - if err := callback(transactionIndex, itemIndex); err != nil { - return err - } - transactionIndex++ - itemIndex++ - } - default: - return errInvalidBitmaskType - } - return nil -} - -// bytesNeededBitmask returns the number of bytes needed to store entries bits. -func bytesNeededBitmask(entries int) int { - return (entries+7)/8 + 1 -} diff --git a/txnsync/bitmask_test.go b/txnsync/bitmask_test.go deleted file mode 100644 index 516b3bc20d..0000000000 --- a/txnsync/bitmask_test.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "encoding/binary" - "errors" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestTrimBitmaskNil(t *testing.T) { - partitiontest.PartitionTest(t) - - var b bitmask - b.trimBitmask(0) - require.Nil(t, b) -} - -func TestIterateExceptions(t *testing.T) { - partitiontest.PartitionTest(t) - - var b bitmask - require.Nil(t, b.iterate(0, 0, nil)) - -} - -func TestBitmaskType0(t *testing.T) { - partitiontest.PartitionTest(t) - - setBits := make([]int, 0, 5) - setBits = append(setBits, 0) - setBits = append(setBits, 2) - setBits = append(setBits, 3) - setBits = append(setBits, 10) - - trimIterateHelper(t, setBits) -} - -func TestBitmaskType1(t *testing.T) { - partitiontest.PartitionTest(t) - - setBits := make([]int, 0, 80) - entries := 80 - for i := 0; i < entries; i++ { - if i%3 != 0 || i > entries-10 { - setBits = append(setBits, i) - } - } - trimIterateHelper(t, setBits) -} - -func TestBitmaskType2(t *testing.T) { - partitiontest.PartitionTest(t) - - setBits := make([]int, 0, 5) - setBits = append(setBits, 0) - setBits = append(setBits, 2) - setBits = append(setBits, 69) - - trimIterateHelper(t, setBits) -} - -func TestBitmaskType3(t *testing.T) { - partitiontest.PartitionTest(t) - - entries := 80 - setBits := make([]int, 0, entries) - for i := 0; i < entries; i++ { - if i != 0 && i != 2 && i != 3 && i != 71 { - setBits = append(setBits, i) - } - } - trimIterateHelper(t, setBits) -} - -// Test for corrupted bitmask -func TestBitmaskType3Corrupted(t *testing.T) { - partitiontest.PartitionTest(t) - - // 10 entries, bitmask has 3 compliment bits (case 3): 10-3=7 set bits, - // last valid index should be 6 - maxIndex := 7 - entries := 10 - - var b bitmask - b = make([]byte, 7) - b[0] = 3 - b[1] = 0 - b[3] = 0 - b[5] = 0 - - b[2] = 1 // index 1 is not set - b[4] = 1 // index 2 is not set - b[6] = 8 // index 2+8=10 is not set. 10 is outside the entries, and does not count - // set bits: 0, 3, 4, 5, 6, 7, 8, 9 - - require.Equal(t, errIndexNotFound, b.iterate(entries, maxIndex, func(entry, index int) error { - return nil - })) -} - -func TestBitmaskTypeX(t *testing.T) { - partitiontest.PartitionTest(t) - - b := make(bitmask, bytesNeededBitmask(80)) - b[0] = 4 - require.Equal(t, b.iterate(0, 0, nil), errInvalidBitmaskType) -} - -func trimIterateHelper(t *testing.T, setBits []int) { - entries := 80 - b := make(bitmask, bytesNeededBitmask(entries)) - - for _, x := range setBits { - b.setBit(x) - } - iterated := make([]bool, entries) - iterfunc := func(i int, index int) error { - iterated[i] = true - return nil - } - var errTestError = errors.New("some error") - errorAfter := 0 - errfunc := func(i int, index int) error { - if index > errorAfter { - return errTestError - } - return nil - } - - require.Equal(t, errTestError, b.iterate(entries, len(setBits), errfunc)) - require.Equal(t, errDataMissing, b.iterate(entries, len(setBits)-1, iterfunc)) // less than set bits - require.NoError(t, b.iterate(entries, len(setBits), iterfunc)) - - s := 0 - for i := 0; i < entries; i++ { - if s < len(setBits) && i == setBits[s] { - require.True(t, iterated[i], i) - s++ - } else { - require.False(t, iterated[i], i) - } - } - b.trimBitmask(entries) - if int(b[0]) < 2 { - // make sure TrimRight is behaving as expected - require.True(t, int(b[len(b)-1]) > 0) - } - iterated = make([]bool, entries) - - require.Equal(t, errTestError, b.iterate(entries, len(setBits), errfunc)) - require.Equal(t, errDataMissing, b.iterate(entries, len(setBits)-1, iterfunc)) - - // For types 0 and 2, let the entries be smaller than what the bitmap will provide - // This is the edge case, and will not be a problem for the compliment set bitmasks - if int((b)[0]) == 0 || int((b)[0]) == 2 { - require.Equal(t, errIndexNotFound, b.iterate(setBits[len(setBits)-1], len(setBits), iterfunc)) - require.Nil(t, b.iterate(setBits[len(setBits)-1]+1, len(setBits), iterfunc)) - } - - // For types 1 and 3, let the entries be smaller than what the bitmap will provide - // This requires a much smaller entries limit, since it is only checked in the first stage - if int((b)[0]) == 1 || int((b)[0]) == 3 { - require.Equal(t, errIndexNotFound, b.iterate(70, len(setBits), iterfunc)) - } - - // For types 1 and 3, test the error handling in the second stage. - errorAfter = len(setBits) - 1 - 8 - require.Equal(t, errTestError, b.iterate(entries, len(setBits), errfunc)) - require.Equal(t, errDataMissing, b.iterate(entries, len(setBits)-1-8, iterfunc)) - - require.NoError(t, b.iterate(entries, len(setBits), func(i int, index int) error { - iterated[i] = true - return nil - })) - - s = 0 - for i := 0; i < entries; i++ { - if s < len(setBits) && i == setBits[s] { - require.True(t, iterated[i], i) - s++ - } else { - require.False(t, iterated[i], i) - } - } -} - -func TestFuzzBitmask(t *testing.T) { - partitiontest.PartitionTest(t) - - randSeed := uint64(0) - rand := func() byte { - bytes := [16]byte{} - l := binary.PutUvarint(bytes[:], randSeed) - h := crypto.Hash(bytes[:l]) - randSeed = 0 - for i := 0; i < 8; i++ { - randSeed += uint64(h[i]) << (i * 8) - } - return byte(h[0]) - } - for iterationsCount := 0; iterationsCount < 1000; iterationsCount++ { - bitmaskType := rand() % 4 - blen := int(rand()%33) + 1 - var b bitmask - b = make([]byte, blen) - b[0] = byte(bitmaskType) - for i := 1; i < blen; i++ { - b[i] = rand() - } - entries := int(rand()) - maxIndex := int(rand()) - lastEntryIndex := -1 - b.iterate(entries, maxIndex, func(i, j int) error { - require.Greater(t, i, lastEntryIndex) - lastEntryIndex = i - require.Less(t, i, entries) - require.Less(t, j, maxIndex) - return nil - }) - // reset to mode 0 - b[0] = 0 - entries = (blen - 1) * 8 - err1 := b.iterate(entries, maxIndex, func(i, j int) error { - return nil - }) - b.trimBitmask(entries) - err2 := b.iterate(entries, maxIndex, func(i, j int) error { - return nil - }) - require.Equal(t, err1, err2) - } -} diff --git a/txnsync/bloomFilter.go b/txnsync/bloomFilter.go deleted file mode 100644 index 013888fa89..0000000000 --- a/txnsync/bloomFilter.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "encoding/binary" - "errors" - "math" - - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/util/bloom" -) - -// bloomFilterFalsePositiveRate is used as the target false positive rate for the multiHashBloomFilter implementation. -// the xor based bloom filters have their own hard-coded false positive rate, and therefore require no configuration. -const bloomFilterFalsePositiveRate = 0.01 - -var errInvalidBloomFilterEncoding = errors.New("invalid bloom filter encoding") -var errEncodingBloomFilterFailed = errors.New("encoding bloom filter failed") - -//msgp:ignore bloomFilterType -type bloomFilterType byte - -const ( - invalidBloomFilter bloomFilterType = iota //nolint:deadcode,varcheck - multiHashBloomFilter - xorBloomFilter32 - xorBloomFilter8 -) - -// transactionsRange helps us to identify a subset of the transaction pool pending transaction groups. -// it's being used as part of an optimization when we're attempting to recreate a bloom filter : -// if the new bloom filter shares the same set of parameters, then the result is expected to be the -// same and therefore the old bloom filter can be used. -type transactionsRange struct { - firstCounter uint64 - lastCounter uint64 - transactionsCount uint64 -} - -type bloomFilter struct { - containedTxnsRange transactionsRange - - encoded encodedBloomFilter - - encodedLength int -} - -// testableBloomFilter is used for a bloom filters that were received from the network, decoded -// and are ready to be tested against. -type testableBloomFilter struct { - encodingParams requestParams - - filter bloom.GenericFilter - - clearPrevious bool -} - -func decodeBloomFilter(enc encodedBloomFilter) (outFilter *testableBloomFilter, err error) { - outFilter = &testableBloomFilter{ - encodingParams: enc.EncodingParams, - clearPrevious: enc.ClearPrevious != 0, - } - switch bloomFilterType(enc.BloomFilterType) { - case multiHashBloomFilter: - outFilter.filter, err = bloom.UnmarshalBinary(enc.BloomFilter) - case xorBloomFilter32: - outFilter.filter = new(bloom.XorFilter) - err = outFilter.filter.UnmarshalBinary(enc.BloomFilter) - case xorBloomFilter8: - outFilter.filter = new(bloom.XorFilter8) - err = outFilter.filter.UnmarshalBinary(enc.BloomFilter) - default: - return nil, errInvalidBloomFilterEncoding - } - - if err != nil { - return nil, err - } - return -} - -func (bf *bloomFilter) encode(filter bloom.GenericFilter, filterType bloomFilterType) (err error) { - bf.encoded.BloomFilterType = byte(filterType) - bf.encoded.BloomFilter, err = filter.MarshalBinary() - bf.encodedLength = len(bf.encoded.BloomFilter) - if err != nil || bf.encodedLength == 0 { - return errEncodingBloomFilterFailed - } - // increase the counter for a successful bloom filter encoding - txsyncEncodedBloomFiltersTotal.Inc(nil) - return -} - -func (bf *bloomFilter) sameParams(other bloomFilter) bool { - return (bf.encoded.EncodingParams == other.encoded.EncodingParams) && - (bf.containedTxnsRange == other.containedTxnsRange) -} - -func (bf *testableBloomFilter) test(txID transactions.Txid) bool { - if bf.encodingParams.Modulator > 1 { - if txidToUint64(txID)%uint64(bf.encodingParams.Modulator) != uint64(bf.encodingParams.Offset) { - return false - } - } - return bf.filter.Test(txID[:]) -} - -func filterFactoryBloom(numEntries int, s *syncState) (filter bloom.GenericFilter, filterType bloomFilterType) { - shuffler := uint32(s.node.Random(math.MaxUint64)) - sizeBits, numHashes := bloom.Optimal(numEntries, bloomFilterFalsePositiveRate) - return bloom.New(sizeBits, numHashes, shuffler), multiHashBloomFilter -} - -func filterFactoryXor8(numEntries int, s *syncState) (filter bloom.GenericFilter, filterType bloomFilterType) { //nolint:deadcode,unused - s.xorBuilder.RandomNumberGeneratorSeed = s.node.Random(math.MaxUint64) - return bloom.NewXor8(numEntries, &s.xorBuilder), xorBloomFilter8 -} - -func filterFactoryXor32(numEntries int, s *syncState) (filter bloom.GenericFilter, filterType bloomFilterType) { - s.xorBuilder.RandomNumberGeneratorSeed = s.node.Random(math.MaxUint64) - return bloom.NewXor(numEntries, &s.xorBuilder), xorBloomFilter32 -} - -var filterFactory func(int, *syncState) (filter bloom.GenericFilter, filterType bloomFilterType) = filterFactoryXor32 - -func (s *syncState) makeBloomFilter(encodingParams requestParams, txnGroups []pooldata.SignedTxGroup, excludeTransactions *transactionCache, hintPrevBloomFilter *bloomFilter) (result bloomFilter) { - result.encoded.EncodingParams = encodingParams - if encodingParams.Modulator == 0 { - // we want none. - return - } - if encodingParams.Modulator == 1 && excludeTransactions == nil { - // we want all. - if len(txnGroups) > 0 { - result.containedTxnsRange.firstCounter = txnGroups[0].GroupCounter - result.containedTxnsRange.lastCounter = txnGroups[len(txnGroups)-1].GroupCounter - result.containedTxnsRange.transactionsCount = uint64(len(txnGroups)) - } else { - return - } - - if hintPrevBloomFilter != nil { - if result.sameParams(*hintPrevBloomFilter) { - return *hintPrevBloomFilter - } - } - - filter, filterType := filterFactory(len(txnGroups), s) - for _, group := range txnGroups { - filter.Set(group.GroupTransactionID[:]) - } - err := result.encode(filter, filterType) - if err != nil { - // fall back to standard bloom filter - filter, filterType = filterFactoryBloom(len(txnGroups), s) - for _, group := range txnGroups { - filter.Set(group.GroupTransactionID[:]) - } - result.encode(filter, filterType) //nolint:errcheck - // the error in the above case can be silently ignored. - } - return result - } - - // we want subset. - result.containedTxnsRange.firstCounter = math.MaxUint64 - filteredTransactionsIDs := getTxIDSliceBuffer(len(txnGroups)) - defer releaseTxIDSliceBuffer(filteredTransactionsIDs) - - excludedTransactions := 0 - for _, group := range txnGroups { - txID := group.GroupTransactionID - if txidToUint64(txID)%uint64(encodingParams.Modulator) != uint64(encodingParams.Offset) { - continue - } - - if result.containedTxnsRange.firstCounter == math.MaxUint64 { - result.containedTxnsRange.firstCounter = group.GroupCounter - } - result.containedTxnsRange.lastCounter = group.GroupCounter - - if excludeTransactions != nil && excludeTransactions.contained(txID) { - excludedTransactions++ - continue - } - - filteredTransactionsIDs = append(filteredTransactionsIDs, txID) - } - - result.containedTxnsRange.transactionsCount = uint64(len(filteredTransactionsIDs) + excludedTransactions) - - if hintPrevBloomFilter != nil { - if result.sameParams(*hintPrevBloomFilter) { - return *hintPrevBloomFilter - } - } - - if len(filteredTransactionsIDs) == 0 { - return - } - - filter, filterType := filterFactory(len(filteredTransactionsIDs), s) - - for _, txid := range filteredTransactionsIDs { - filter.Set(txid[:]) - } - err := result.encode(filter, filterType) - if err != nil { - // fall back to standard bloom filter - filter, filterType = filterFactoryBloom(len(filteredTransactionsIDs), s) - for _, txid := range filteredTransactionsIDs { - filter.Set(txid[:]) - } - result.encode(filter, filterType) //nolint:errcheck - // the error in the above case can be silently ignored. - } - - return result -} - -func txidToUint64(txID transactions.Txid) uint64 { - return binary.LittleEndian.Uint64(txID[:8]) -} diff --git a/txnsync/bloomFilter_test.go b/txnsync/bloomFilter_test.go deleted file mode 100644 index 57a1635fcd..0000000000 --- a/txnsync/bloomFilter_test.go +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "encoding/binary" - "math/rand" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/bloom" - "github.com/algorand/go-algorand/util/timers" -) - -func getTxnGroups(genesisHash crypto.Digest, genesisID string) []pooldata.SignedTxGroup { - return []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - GroupCounter: 0, - GroupTransactionID: transactions.Txid{1}, - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("2"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: basics.Address(crypto.Hash([]byte("4"))), - Amount: basics.MicroAlgos{Raw: 1000}, - }, - }, - Sig: crypto.Signature{1}, - }, - }, - }, - pooldata.SignedTxGroup{ - GroupCounter: 1, - GroupTransactionID: transactions.Txid{2}, - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - GenesisID: genesisID, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: basics.Address(crypto.Hash([]byte("2"))), - Amount: basics.MicroAlgos{Raw: 1000}, - }, - }, - Sig: crypto.Signature{2}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.KeyRegistrationTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - GenesisID: genesisID, - }, - }, - Sig: crypto.Signature{3}, - }, - }, - }, - pooldata.SignedTxGroup{ - GroupCounter: 2, - GroupTransactionID: transactions.Txid{3}, - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.AssetConfigTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - }, - }, - Sig: crypto.Signature{4}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.AssetFreezeTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - }, - }, - Sig: crypto.Signature{5}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.CompactCertTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - }, - }, - Msig: crypto.MultisigSig{Version: 1}, - }, - }, - }, - } -} - -func BenchmarkTxidToUint64(b *testing.B) { - txID := transactions.Txid{1, 2, 3, 4, 5} - for i := 0; i < b.N; i++ { - txidToUint64(txID) - } -} - -const testingGenesisID = "gID" - -var testingGenesisHash = crypto.Hash([]byte("gh")) - -func TestBloomFallback(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.node = &justRandomFakeNode{} - var encodingParams requestParams - - for encodingParams.Modulator = 1; encodingParams.Modulator < 3; encodingParams.Modulator++ { - txnGroups := getTxnGroups(testingGenesisHash, testingGenesisID) - bf := s.makeBloomFilter(encodingParams, txnGroups, nil, nil) - - switch bloomFilterType(bf.encoded.BloomFilterType) { - case multiHashBloomFilter: - t.Errorf("expected xorfilter but got classic bloom filter") - case xorBloomFilter32: - // ok - case xorBloomFilter8: - t.Errorf("expected xorBloomFilter32 but got xorBloomFilter8") - default: - t.Errorf("unknown internal bloom filter object : %d", bloomFilterType(bf.encoded.BloomFilterType)) - } - - // Duplicate first entry. xorfilter can't handle - // duplicates. We _probably_ never have duplicate txid - // prefixes when we grab the first 8 bytes of 32 bytes, but - // that's not 100%, maybe only 99.999999% - stg := txnGroups[1] - txnGroups = append(txnGroups, stg) - - bf = s.makeBloomFilter(encodingParams, txnGroups, nil, nil) - switch bloomFilterType(bf.encoded.BloomFilterType) { - case multiHashBloomFilter: - // ok - case xorBloomFilter32: - t.Errorf("expected bloom filter but got xor") - case xorBloomFilter8: - t.Errorf("expected bloom filter but got xor") - default: - t.Errorf("unknown internal bloom filter object : %d", bloomFilterType(bf.encoded.BloomFilterType)) - } - } -} - -// TestHint tests that the hint is used only when it should be used -func TestHint(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.node = &justRandomFakeNode{} - var encodingParams requestParams - defaultFilterType := xorBloomFilter32 - - for encodingParams.Modulator = 1; encodingParams.Modulator < 3; encodingParams.Modulator++ { - txnGroups := getTxnGroups(testingGenesisHash, testingGenesisID) - bf := s.makeBloomFilter(encodingParams, txnGroups, nil, nil) - - switch bloomFilterType(bf.encoded.BloomFilterType) { - case xorBloomFilter32: - // ok - default: - require.Fail(t, "expect xorBloomFilter32") - } - require.Equal(t, defaultFilterType, bloomFilterType(bf.encoded.BloomFilterType)) - - // Change the filter of bf to other than the default filter i.e. XorFilter8 - bf.encoded.BloomFilterType = byte(xorBloomFilter8) - - // Pass bf as a hint. - bf2 := s.makeBloomFilter(encodingParams, txnGroups, nil, &bf) - - // If the filter of bf2 is not defaultFilterType (i.e. is XorFilter8), then the hint was used. - // The hint must be used, and the filter should not be the default filter. - require.NotEqual(t, defaultFilterType, bf2.encoded.BloomFilterType) - switch bloomFilterType(bf2.encoded.BloomFilterType) { - case xorBloomFilter8: - // ok - default: - require.Fail(t, "expect xorBloomFilter8") - } - - // Now change txnGroups, so that the hint will not be used - for i := range txnGroups { - txnGroups[i].GroupCounter += uint64(len(txnGroups)) - } - bf2 = s.makeBloomFilter(encodingParams, txnGroups, nil, &bf) - - // If the filter of bf2 is XorFilter (i.e. defaultFilterType), then the hint was not used - switch bloomFilterType(bf2.encoded.BloomFilterType) { - case xorBloomFilter32: - // ok - default: - require.Fail(t, "expect xorBloomFilter32") - } - require.Equal(t, defaultFilterType, bloomFilterType(bf2.encoded.BloomFilterType)) - } -} - -// TestEncodingDecoding checks the encoding/decoding of the filters -func TestEncodingDecoding(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.node = &justRandomFakeNode{} - - filters := []func(int, *syncState) (filter bloom.GenericFilter, filterType bloomFilterType){ - filterFactoryXor8, filterFactoryXor32, filterFactoryBloom} - - var randomEntries [10]transactions.Txid - for i := range randomEntries { - crypto.RandBytes(randomEntries[i][:]) - } - var err error - var testableBf *testableBloomFilter - var remarshaled []byte - // For each filter type - for _, ff := range filters { - - filter, filterType := ff(len(randomEntries), &s) - for i := range randomEntries { - filter.Set(randomEntries[i][:]) - } - var enc encodedBloomFilter - enc.BloomFilterType = byte(filterType) - enc.BloomFilter, err = filter.MarshalBinary() - require.NoError(t, err) - - testableBf, err = decodeBloomFilter(enc) - require.NoError(t, err) - - remarshaled, err = testableBf.filter.MarshalBinary() - - require.NoError(t, err) - require.Equal(t, enc.BloomFilter, remarshaled) - } -} - -func TestDecodingErrors(t *testing.T) { - partitiontest.PartitionTest(t) - - bf, err := decodeBloomFilter(encodedBloomFilter{}) - require.Equal(t, errInvalidBloomFilterEncoding, err) - require.Equal(t, (*testableBloomFilter)(nil), bf) - - var ebf encodedBloomFilter - ebf.BloomFilterType = byte(multiHashBloomFilter) - _, err = decodeBloomFilter(ebf) - - require.Error(t, err) -} - -func TestBloomFilterTest(t *testing.T) { - partitiontest.PartitionTest(t) - - filters := []func(int, *syncState) (filter bloom.GenericFilter, filterType bloomFilterType){ - filterFactoryXor8, filterFactoryXor32, filterFactoryBloom} - - for _, ff := range filters { - - var s syncState - s.node = &justRandomFakeNode{} - var err error - txnGroups := getTxnGroups(testingGenesisHash, testingGenesisID) - - filter, filterType := ff(len(txnGroups), &s) - for _, txnGroup := range txnGroups { - filter.Set(txnGroup.GroupTransactionID[:]) - } - var enc encodedBloomFilter - enc.BloomFilterType = byte(filterType) - enc.BloomFilter, err = filter.MarshalBinary() - require.NoError(t, err) - - testableBf, err := decodeBloomFilter(enc) - require.NoError(t, err) - - for testableBf.encodingParams.Modulator = 0; testableBf.encodingParams.Modulator < 7; testableBf.encodingParams.Modulator++ { - for testableBf.encodingParams.Offset = 0; testableBf.encodingParams.Offset < testableBf.encodingParams.Modulator; testableBf.encodingParams.Offset++ { - for _, tx := range txnGroups { - ans := testableBf.test(tx.GroupTransactionID) - expected := true - if testableBf.encodingParams.Modulator > 1 { - if txidToUint64(tx.GroupTransactionID)%uint64(testableBf.encodingParams.Modulator) != uint64(testableBf.encodingParams.Offset) { - expected = false - } - } - require.Equal(t, expected, ans) - } - } - } - } - -} - -type justRandomFakeNode struct { -} - -func (fn *justRandomFakeNode) Events() <-chan Event { return nil } - -func (fn *justRandomFakeNode) GetCurrentRoundSettings() (out RoundSettings) { return } - -func (fn *justRandomFakeNode) Clock() (out timers.WallClock) { return } - -func (fn *justRandomFakeNode) Random(rng uint64) uint64 { - var xb [8]byte - rand.Read(xb[:]) - rv := binary.LittleEndian.Uint64(xb[:]) - return rv % rng -} - -func (fn *justRandomFakeNode) GetPeers() []PeerInfo { return nil } - -func (fn *justRandomFakeNode) GetPeer(interface{}) (out PeerInfo) { return } - -func (fn *justRandomFakeNode) UpdatePeers(txsyncPeers []*Peer, netPeers []interface{}, peersAverageDataExchangeRate uint64) { -} -func (fn *justRandomFakeNode) SendPeerMessage(netPeer interface{}, msg []byte, callback SendMessageCallback) { -} - -func (fn *justRandomFakeNode) GetPeerLatency(netPeer interface{}) time.Duration { - return 0 -} - -func (fn *justRandomFakeNode) GetPendingTransactionGroups() (txGroups []pooldata.SignedTxGroup, latestLocallyOriginatedGroupCounter uint64) { - return -} -func (fn *justRandomFakeNode) IncomingTransactionGroups(peer *Peer, messageSeq uint64, txGroups []pooldata.SignedTxGroup) (transactionPoolSize int) { - return 0 -} -func (fn *justRandomFakeNode) NotifyMonitor() chan struct{} { return nil } diff --git a/txnsync/emulatorCore_test.go b/txnsync/emulatorCore_test.go deleted file mode 100644 index 8145398279..0000000000 --- a/txnsync/emulatorCore_test.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "encoding/binary" - "sort" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/util/execpool" -) - -const roundDuration = 4 * time.Second - -type emulator struct { - scenario scenario - nodes []*emulatedNode - syncers []*Service - nodeCount int - log logging.Logger - currentRound basics.Round - clock *guidedClock - t *testing.T - totalDuplicateTransactions uint64 - totalDuplicateTransactionSize uint64 - lastRandom uint64 - totalInitialTransactions uint64 -} - -type nodeTransaction struct { - expirationRound basics.Round - transactionSize int -} - -type nodeTransactions []nodeTransaction - -type emulatorResult struct { - nodes []nodeTransactions -} - -func (a nodeTransactions) Len() int { return len(a) } -func (a nodeTransactions) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a nodeTransactions) Less(i, j int) bool { - if a[i].expirationRound < a[j].expirationRound { - return true - } - if a[i].expirationRound > a[j].expirationRound { - return false - } - return a[i].transactionSize < a[j].transactionSize -} - -func emulateScenario(t *testing.T, scenario scenario) { - e := &emulator{ - scenario: scenario, - nodeCount: len(scenario.netConfig.nodes), - log: logging.TestingLog(t), - t: t, - } - e.initNodes() - e.run() - - results := e.collectResult() - for n := range scenario.expectedResults.nodes { - sort.Stable(scenario.expectedResults.nodes[n]) - } - for n := range results.nodes { - sort.Stable(results.nodes[n]) - } - - t.Logf("Emulation Statistics:") - t.Logf("Total duplicate transaction count: %d", e.totalDuplicateTransactions) - t.Logf("Total duplicate transactions size: %d", e.totalDuplicateTransactionSize) - for n := 0; n < e.nodeCount; n++ { - t.Logf("%s transaction groups count : %d", e.nodes[n].name, len(results.nodes[n])) - } - for n := 0; n < e.nodeCount; n++ { - require.Equalf(t, len(scenario.expectedResults.nodes[n]), len(results.nodes[n]), "node %d", n) - } - - // calculating efficiency / overhead : - // how many transaction need to be received ? - // each node received all the transactions, minus the ones that it start up with. - totalNeededSentTransactions := e.totalInitialTransactions*uint64(len(e.nodes)) - e.totalInitialTransactions - actualReceivedTransactions := totalNeededSentTransactions + e.totalDuplicateTransactions - t.Logf("Total transaction overhead: %d%%", (actualReceivedTransactions-totalNeededSentTransactions)*100/totalNeededSentTransactions) - - require.Equal(t, scenario.expectedResults, results) - require.Equal(t, 1, 1) -} - -func (e *emulator) run() { - guidedClock := makeGuidedClock() - lastRoundStarted := guidedClock.Since() - e.clock = guidedClock - e.start() - // start the nodes - for e.clock.Since() < e.scenario.testDuration { - if guidedClock.Since() > lastRoundStarted+roundDuration { - e.nextRound() - lastRoundStarted = guidedClock.Since() - } - guidedClock.Advance(e.scenario.step) - e.unblockStep() - } - // stop the nodes - e.stop() -} -func (e *emulator) nextRound() { - e.currentRound++ - for _, node := range e.nodes { - node.onNewRound(e.currentRound, true) - } -} -func (e *emulator) unblockStep() { - for _, node := range e.nodes { - // let it run through the clock advancement. - node.unblock() - node.waitBlocked() - - // make step - node.step() - } -} -func (e *emulator) start() { - for i, node := range e.syncers { - node.Start() - e.nodes[i].waitBlocked() - } -} -func (e *emulator) stop() { - for i, node := range e.syncers { - e.nodes[i].disableBlocking() - node.Stop() - } -} - -func (e *emulator) initNodes() { - e.nodes = make([]*emulatedNode, e.nodeCount, e.nodeCount) - for i := 0; i < e.nodeCount; i++ { - e.nodes[i] = makeEmulatedNode(e, i) - syncer := MakeTransactionSyncService( - makeNodeLogger(e.log, e.nodes[i]), - e.nodes[i], - e.scenario.netConfig.nodes[i].isRelay, - "", - crypto.Digest{}, - config.GetDefaultLocal(), - e, - ) - e.syncers = append(e.syncers, syncer) - } - randCounter := uint64(0) - var randBuf [8]byte - // we want to place a sender on all transaction so that they would be *somewhat* compressible. - defaultSender := basics.Address{1, 2, 3, 4} - const senderEncodingSize = 35 - encodingBuf := protocol.GetEncodingBuf() - for _, initAlloc := range e.scenario.initialAlloc { - node := e.nodes[initAlloc.node] - for i := 0; i < initAlloc.transactionsCount; i++ { - var group = pooldata.SignedTxGroup{} - group.LocallyOriginated = true - group.GroupCounter = uint64(len(node.txpoolEntries)) - group.Transactions = []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Note: make([]byte, initAlloc.transactionSize-senderEncodingSize, initAlloc.transactionSize-senderEncodingSize), - LastValid: initAlloc.expirationRound, - Sender: defaultSender, - }, - }, - }, - } - // fill up the note field with pseudo-random data. - for i := 0; i < len(group.Transactions[0].Txn.Note); i += crypto.DigestSize { - binary.LittleEndian.PutUint64(randBuf[:], randCounter) - digest := crypto.Hash(randBuf[:]) - copy(group.Transactions[0].Txn.Note[i:], digest[:]) - randCounter++ - } - group.GroupTransactionID = group.Transactions.ID() - encodingBuf = encodingBuf[:0] - group.EncodedLength = len(group.Transactions[0].MarshalMsg(encodingBuf)) - node.txpoolIds[group.Transactions[0].ID()] = true - node.txpoolEntries = append(node.txpoolEntries, group) - } - node.latestLocallyOriginatedGroupCounter = uint64(len(node.txpoolEntries) - 1) - e.totalInitialTransactions += uint64(initAlloc.transactionsCount) - node.txpoolGroupCounter += uint64(initAlloc.transactionsCount) - node.onNewTransactionPoolEntry() - } - protocol.PutEncodingBuf(encodingBuf) -} - -func (e *emulator) collectResult() (result emulatorResult) { - result.nodes = make([]nodeTransactions, len(e.nodes)) - const senderEncodingSize = 35 - for i, node := range e.nodes { - var txns nodeTransactions - for _, txnGroup := range node.txpoolEntries { - size := len(txnGroup.Transactions[0].Txn.Note) - exp := txnGroup.Transactions[0].Txn.LastValid - txns = append(txns, nodeTransaction{expirationRound: exp, transactionSize: size + senderEncodingSize}) - } - for _, txnGroup := range node.expiredTx { - size := len(txnGroup.Transactions[0].Txn.Note) - exp := txnGroup.Transactions[0].Txn.LastValid - txns = append(txns, nodeTransaction{expirationRound: exp, transactionSize: size + senderEncodingSize}) - } - result.nodes[i] = txns - } - return result -} - -// Dummy implementation of execpool.BacklogPool -func (e *emulator) EnqueueBacklog(enqueueCtx context.Context, t execpool.ExecFunc, arg interface{}, out chan interface{}) error { - t(arg) - return nil -} - -// Dummy implementation of execpool.BacklogPool -func (e *emulator) Enqueue(enqueueCtx context.Context, t execpool.ExecFunc, arg interface{}, i execpool.Priority, out chan interface{}) error { - return nil -} - -// Dummy implementation of execpool.BacklogPool -func (e *emulator) GetOwner() interface{} { - return nil -} - -// Dummy implementation of execpool.BacklogPool -func (e *emulator) Shutdown() { - -} - -// Dummy implementation of execpool.BacklogPool -func (e *emulator) GetParallelism() int { - return 0 -} diff --git a/txnsync/emulatorLogger_test.go b/txnsync/emulatorLogger_test.go deleted file mode 100644 index 7020b7512a..0000000000 --- a/txnsync/emulatorLogger_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "fmt" - "strconv" - "strings" - "testing" - - "github.com/algorand/go-algorand/logging" -) - -// Foreground text colors -const ( - reset = 0 - black = 30 - red = 31 - green = 32 - yellow = 33 - blue = 34 - magenta = 35 - cyan = 36 - white = 37 - hiblack = 90 - hired = 91 - higreen = 92 - hiyellow = 93 - hiblue = 94 - himagenta = 95 - hicyan = 96 - hiwhite = 97 -) - -const escape = "\x1b" - -var colors = []int{red, green, yellow, blue, magenta, cyan, hired, higreen, hiyellow, hiblue, himagenta, hicyan} -var lowColors = []int{red, green, yellow, blue, magenta, cyan} - -type emulatorNodeLogger struct { - algodlogger - node *emulatedNode - longestName int -} - -func makeNodeLogger(l logging.Logger, node *emulatedNode) Logger { - return &emulatorNodeLogger{ - algodlogger: l, - node: node, - } -} - -type msgMode int - -const ( - modeZero msgMode = iota - modeIncoming - modeOutgoing -) - -// implement local interface Logger -func (e *emulatorNodeLogger) outgoingMessage(mstat msgStats) { - e.printMsgStats(mstat, modeOutgoing) -} - -// implement local interface Logger -func (e *emulatorNodeLogger) incomingMessage(mstat msgStats) { - e.printMsgStats(mstat, modeIncoming) -} - -func (e emulatorNodeLogger) printMsgStats(mstat msgStats, mode msgMode) { - seq := int(mstat.sequenceNumber) - round := mstat.round - transactions := mstat.transactions - offset := mstat.offsetModulator.Offset - modulator := mstat.offsetModulator.Modulator - bloom := mstat.bloomSize - nextTS := mstat.nextMsgMinDelay - // emulator peer addresses are just an int - destIndex, _ := strconv.Atoi(mstat.peerAddress) - - destName := e.node.emulator.nodes[destIndex].name - - if e.longestName == 0 { - for _, node := range e.node.emulator.nodes { - if len(node.name) > e.longestName { - e.longestName = len(node.name) + 1 - } - } - } - - elapsed := e.node.emulator.clock.Since().Milliseconds() - out := fmt.Sprintf("%3d.%03d ", elapsed/1000, elapsed%1000) - out += fmt.Sprintf("%"+fmt.Sprintf("%d", e.longestName)+"s", e.node.name) - - bfColor := hiblack - if bloom > 0 { - bfColor = higreen - } - nextTSColor := hiblack - if nextTS > 0 { - nextTSColor = higreen - } - mid := fmt.Sprintf("Round %s Txns %s Req [%3d/%3d] %s %s", - wrapRollingColor(int(round), fmt.Sprintf("%2d", round)), - wrapRollingColor(transactions, fmt.Sprintf("%3d", transactions)), - offset, - modulator, - wrapColor(bfColor, "BF"), - wrapColor(nextTSColor, "TS"), - ) - if mode == modeOutgoing { - out += wrapRollingLowColor(seq, " [ ") - out += mid + wrapRollingLowColor(seq, " --> ") + strings.Repeat(" ", 20) - out += wrapColor(hiblack, " ] ") - } else { - out += wrapColor(hiblack, " [ ") - out += strings.Repeat(" ", 20) + wrapRollingLowColor(seq, " <-- ") + mid - out += wrapRollingLowColor(seq, " ] ") - } - - out += fmt.Sprintf("%"+fmt.Sprintf("%d", e.longestName)+"s", destName) - if testing.Verbose() { - fmt.Printf("%s\n", out) - } -} - -func wrapRollingLowColor(color int, s string) (out string) { - return wrapColor(lowColors[color%len(lowColors)], s) -} - -func wrapRollingColor(color int, s string) (out string) { - return wrapColor(colors[color%len(colors)], s) -} -func wrapColor(color int, s string) (out string) { - return fmt.Sprintf("%s[1;%dm%s%s[1;%dm", escape, color, s, escape, reset) -} diff --git a/txnsync/emulatorNode_test.go b/txnsync/emulatorNode_test.go deleted file mode 100644 index 378f1622ff..0000000000 --- a/txnsync/emulatorNode_test.go +++ /dev/null @@ -1,397 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - "fmt" - "sort" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/util/timers" -) - -type queuedSentMessageCallback struct { - callback SendMessageCallback - seq uint64 -} -type queuedMessage struct { - bytes []byte - readyAt time.Duration -} -type networkPeer struct { - peer *Peer - uploadSpeed uint64 - downloadSpeed uint64 - isOutgoing bool - outSeq uint64 - inSeq uint64 - target int - - messageQ []queuedMessage // incoming message queue - - mu sync.Mutex `algofix:"allow sync.Mutex"` - - deferredSentMessages []queuedSentMessageCallback // outgoing messages callback queue -} - -// emulatedNode implements the NodeConnector interface -type emulatedNode struct { - externalEvents chan Event - emulator *emulator - peers map[int]*networkPeer - nodeIndex int - expiredTx []pooldata.SignedTxGroup - txpoolEntries []pooldata.SignedTxGroup - txpoolIds map[transactions.Txid]bool - latestLocallyOriginatedGroupCounter uint64 - name string - blocked chan struct{} - mu sync.Mutex `algofix:"allow sync.Mutex"` - txpoolGroupCounter uint64 - blockingEnabled bool - nodeBlocked chan struct{} // channel is closed when node is blocked. - nodeRunning chan struct{} // channel is closed when node is running. -} - -func makeEmulatedNode(emulator *emulator, nodeIdx int) *emulatedNode { - en := &emulatedNode{ - emulator: emulator, - peers: make(map[int]*networkPeer), - externalEvents: make(chan Event, 10000), - nodeIndex: nodeIdx, - txpoolIds: make(map[transactions.Txid]bool), - name: emulator.scenario.netConfig.nodes[nodeIdx].name, - blockingEnabled: true, - nodeBlocked: make(chan struct{}, 1), - nodeRunning: make(chan struct{}, 1), - } - close(en.nodeRunning) - - // add outgoing connections - for _, conn := range emulator.scenario.netConfig.nodes[nodeIdx].outgoingConnections { - en.peers[conn.target] = &networkPeer{ - uploadSpeed: conn.uploadSpeed, - downloadSpeed: conn.downloadSpeed, - isOutgoing: true, - target: conn.target, - } - } - // add incoming connections - for nodeID, nodeConfig := range emulator.scenario.netConfig.nodes { - if nodeID == nodeIdx { - continue - } - for _, conn := range nodeConfig.outgoingConnections { - if conn.target != nodeIdx { - continue - } - // the upload & download speeds are in reverse. This isn't a bug since we want the incoming - // connection to be the opposite side of the connection. - en.peers[nodeID] = &networkPeer{ - uploadSpeed: conn.downloadSpeed, - downloadSpeed: conn.uploadSpeed, - isOutgoing: false, - target: nodeID, - } - } - } - return en -} - -func (n *emulatedNode) Events() <-chan Event { - return n.externalEvents -} - -func (n *emulatedNode) NotifyMonitor() chan struct{} { - var c chan struct{} - n.mu.Lock() - if n.blockingEnabled { - c = make(chan struct{}) - n.blocked = c - close(n.nodeBlocked) - n.nodeRunning = make(chan struct{}, 1) - n.mu.Unlock() - <-c - n.mu.Lock() - close(n.nodeRunning) - n.nodeBlocked = make(chan struct{}, 1) - n.mu.Unlock() - // return a closed channel. - return c - } - n.mu.Unlock() - // return an open channel - return make(chan struct{}) -} -func (n *emulatedNode) disableBlocking() { - n.mu.Lock() - n.blockingEnabled = false - n.mu.Unlock() - n.unblock() -} -func (n *emulatedNode) unblock() { - n.mu.Lock() - // wait until the state changes to StateMachineRunning - select { - case <-n.nodeBlocked: - // we're blocked. - if n.blocked != nil { - close(n.blocked) - n.blocked = nil - } - runningCh := n.nodeRunning - n.mu.Unlock() - <-runningCh - return - default: - } - n.mu.Unlock() -} - -func (n *emulatedNode) waitBlocked() { - n.mu.Lock() - select { - case <-n.nodeRunning: - blockedCh := n.nodeBlocked - n.mu.Unlock() - <-blockedCh - return - default: - } - n.mu.Unlock() -} - -func (n *emulatedNode) GetCurrentRoundSettings() RoundSettings { - return RoundSettings{ - Round: n.emulator.currentRound, - FetchTransactions: true, - } - -} -func (n *emulatedNode) Clock() timers.WallClock { - return n.emulator.clock.Zero().(timers.WallClock) -} - -func (n *emulatedNode) Random(x uint64) (out uint64) { - limit := x - x += uint64(n.nodeIndex) * 997 - x += uint64(n.emulator.currentRound) * 797 - x += uint64(n.emulator.lastRandom) * 797 - bytes := make([]byte, 8) - for i := 0; i < 8; i++ { - bytes[i] = byte(x >> (i * 8)) - } - digest := crypto.Hash(bytes) - out = 0 - for i := 0; i < 8; i++ { - out = out << 8 - out += uint64(digest[i]) - } - out = out % limit - n.emulator.lastRandom ^= out - return out -} - -func (n *emulatedNode) orderedPeers() (out []*networkPeer) { - peerToIndex := make(map[*networkPeer]int) - for idx, peer := range n.peers { - out = append(out, peer) - peerToIndex[peer] = idx - } - // sort the peers, which we need in order to make the test deterministic. - sort.Slice(out, func(i, j int) bool { - netPeer1 := out[i] - netPeer2 := out[j] - return peerToIndex[netPeer1] < peerToIndex[netPeer2] - }) - return -} - -func (n *emulatedNode) GetPeers() (out []PeerInfo) { - for _, peer := range n.orderedPeers() { - out = append(out, PeerInfo{TxnSyncPeer: peer.peer, NetworkPeer: peer, IsOutgoing: peer.isOutgoing}) - } - return out -} - -func (n *emulatedNode) GetPeer(p interface{}) PeerInfo { - netPeer := p.(*networkPeer) - return PeerInfo{ - TxnSyncPeer: netPeer.peer, - IsOutgoing: netPeer.isOutgoing, - NetworkPeer: p, - } -} - -func (n *emulatedNode) UpdatePeers(txPeers []*Peer, netPeers []interface{}, _ uint64) { - for i, peer := range netPeers { - netPeer := peer.(*networkPeer) - netPeer.peer = txPeers[i] - } -} - -func (n *emulatedNode) enqueueMessage(from int, msg queuedMessage) { - n.peers[from].mu.Lock() - baseTime := n.emulator.clock.Since() - if len(n.peers[from].messageQ) > 0 { - if n.peers[from].messageQ[len(n.peers[from].messageQ)-1].readyAt > baseTime { - baseTime = n.peers[from].messageQ[len(n.peers[from].messageQ)-1].readyAt - } - } - // the message bytes need to be copied, so that the originating bytes could be safely deleted. - msgBytes := make([]byte, len(msg.bytes)) - copy(msgBytes[:], msg.bytes[:]) - n.peers[from].messageQ = append(n.peers[from].messageQ, queuedMessage{bytes: msgBytes, readyAt: baseTime + msg.readyAt}) - n.peers[from].mu.Unlock() -} - -func (n *emulatedNode) SendPeerMessage(netPeer interface{}, msg []byte, callback SendMessageCallback) { - peer := netPeer.(*networkPeer) - otherNode := n.emulator.nodes[peer.target] - sendTime := time.Duration(len(msg)) * time.Second / time.Duration(peer.uploadSpeed) - otherNode.enqueueMessage(n.nodeIndex, queuedMessage{bytes: msg, readyAt: sendTime}) - - peer.deferredSentMessages = append(peer.deferredSentMessages, queuedSentMessageCallback{callback: callback, seq: peer.outSeq}) - peer.outSeq++ -} - -func (n *emulatedNode) GetPeerLatency(netPeer interface{}) time.Duration { - return 0 -} - -func (n *emulatedNode) GetPendingTransactionGroups() ([]pooldata.SignedTxGroup, uint64) { - return n.txpoolEntries, n.latestLocallyOriginatedGroupCounter -} - -func (n *emulatedNode) IncomingTransactionGroups(peer *Peer, messageSeq uint64, txGroups []pooldata.SignedTxGroup) (transactionPoolSize int) { - // add to transaction pool. - duplicateMessage := 0 - duplicateMessageSize := 0 - encodingBuf := protocol.GetEncodingBuf() - transactionPoolSize = len(n.txpoolEntries) - for _, group := range txGroups { - if group.Transactions[0].Txn.LastValid < n.emulator.currentRound { - continue - } - txID := group.Transactions[0].ID() - if n.txpoolIds[txID] { - duplicateMessage++ - duplicateMessageSize += len(group.Transactions[0].Txn.Note) - continue - } - n.txpoolIds[txID] = true - group.GroupCounter = n.txpoolGroupCounter - n.txpoolGroupCounter++ - group.GroupTransactionID = group.Transactions.ID() - for _, txn := range group.Transactions { - encodingBuf = encodingBuf[:0] - group.EncodedLength += len(txn.MarshalMsg(encodingBuf)) - } - n.txpoolEntries = append(n.txpoolEntries, group) - } - protocol.PutEncodingBuf(encodingBuf) - if duplicateMessage > 0 && testing.Verbose() { - fmt.Printf("%s : %d duplicate messages recieved\n", n.name, duplicateMessage) - } - atomic.AddUint64(&n.emulator.totalDuplicateTransactions, uint64(duplicateMessage)) - atomic.AddUint64(&n.emulator.totalDuplicateTransactionSize, uint64(duplicateMessageSize)) - select { - case peer.GetTransactionPoolAckChannel() <- messageSeq: - default: - panic(errors.New("IncomingTransactionGroups was unable to write messageSeq to the ack channel")) - } - return -} - -func (n *emulatedNode) step() { - msgHandler := n.emulator.syncers[n.nodeIndex].GetIncomingMessageHandler() - now := n.emulator.clock.Since() - // check if we have any pending network messages and forward them. - - for _, peer := range n.orderedPeers() { - peer.mu.Lock() - - for i := len(peer.deferredSentMessages); i > 0; i-- { - dm := peer.deferredSentMessages[0] - peer.deferredSentMessages = peer.deferredSentMessages[1:] - peer.mu.Unlock() - err := dm.callback(true, dm.seq) - if err != nil { - panic(err) - } - n.unblock() - n.waitBlocked() - peer.mu.Lock() - } - - for i := len(peer.messageQ); i > 0; i-- { - if peer.messageQ[0].readyAt > now { - break - } - - msgBytes := peer.messageQ[0].bytes - msgInSeq := peer.inSeq - - peer.inSeq++ - peer.messageQ = peer.messageQ[1:] - - peer.mu.Unlock() - - msgHandler(peer, peer.peer, msgBytes, msgInSeq, 0) - n.unblock() - n.waitBlocked() - peer.mu.Lock() - - } - peer.mu.Unlock() - } - -} -func (n *emulatedNode) onNewRound(round basics.Round, hasParticipationKeys bool) { - // if this is a relay, then we always want to fetch transactions, regardless if we have participation keys. - fetchTransactions := hasParticipationKeys - if n.emulator.scenario.netConfig.nodes[n.nodeIndex].isRelay { - fetchTransactions = true - } - - for i := len(n.txpoolEntries) - 1; i >= 0; i-- { - if n.txpoolEntries[i].Transactions[0].Txn.LastValid < round { - delete(n.txpoolIds, n.txpoolEntries[i].Transactions[0].ID()) - n.expiredTx = append(n.expiredTx, n.txpoolEntries[i]) - n.txpoolEntries = append(n.txpoolEntries[0:i], n.txpoolEntries[i+1:]...) - } - } - - n.externalEvents <- MakeNewRoundEvent(round, fetchTransactions) -} - -func (n *emulatedNode) onNewTransactionPoolEntry() { - n.externalEvents <- MakeTransactionPoolChangeEvent(len(n.txpoolEntries), false) -} - -func (p *networkPeer) GetAddress() string { - return fmt.Sprintf("%d", p.target) -} diff --git a/txnsync/emulatorTimer_test.go b/txnsync/emulatorTimer_test.go deleted file mode 100644 index f6d0dc57b9..0000000000 --- a/txnsync/emulatorTimer_test.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "sort" - "sync" - "time" - - "github.com/algorand/go-algorand/util/timers" -) - -// guidedClock implements the WallClock interface -type guidedClock struct { - sync.Mutex `algofix:"allow sync.Mutex"` - zero time.Time - adv time.Duration - timers map[time.Duration]chan time.Time - children []*guidedClock -} - -func makeGuidedClock() *guidedClock { - return &guidedClock{ - zero: time.Now(), - } -} -func (g *guidedClock) Zero() timers.Clock { - // the real monotonic clock doesn't return the same clock object, which is fine.. but for our testing - // we want to keep the same clock object so that we can tweak with it. - child := &guidedClock{ - zero: g.zero.Add(g.adv), - } - g.Lock() - defer g.Unlock() - g.children = append(g.children, child) - return child -} - -func (g *guidedClock) TimeoutAt(delta time.Duration) <-chan time.Time { - if delta <= g.adv { - c := make(chan time.Time, 1) - close(c) - return c - } - g.Lock() - defer g.Unlock() - if g.timers == nil { - g.timers = make(map[time.Duration]chan time.Time) - } - c, has := g.timers[delta] - if has { - return c - } - c = make(chan time.Time, 1) - g.timers[delta] = c - return c -} - -func (g *guidedClock) Encode() []byte { - return []byte{} -} -func (g *guidedClock) Decode([]byte) (timers.Clock, error) { - return &guidedClock{}, nil -} - -func (g *guidedClock) Since() time.Duration { - return g.adv -} - -func (g *guidedClock) DeadlineMonitorAt(at time.Duration) timers.DeadlineMonitor { - return timers.MakeMonotonicDeadlineMonitor(g, at) -} - -func (g *guidedClock) Advance(adv time.Duration) { - g.adv += adv - - type entryStruct struct { - duration time.Duration - ch chan time.Time - } - expiredClocks := []entryStruct{} - g.Lock() - // find all the expired clocks. - for delta, ch := range g.timers { - if delta < g.adv { - expiredClocks = append(expiredClocks, entryStruct{delta, ch}) - } - } - sort.SliceStable(expiredClocks, func(i, j int) bool { - return expiredClocks[i].duration < expiredClocks[j].duration - }) - - // remove from map - for _, entry := range expiredClocks { - delete(g.timers, entry.duration) - } - g.Unlock() - // fire expired clocks - for _, entry := range expiredClocks { - entry.ch <- g.zero.Add(g.adv) - close(entry.ch) - } - g.Lock() - defer g.Unlock() - for _, child := range g.children { - child.Advance(adv) - } -} diff --git a/txnsync/emulator_test.go b/txnsync/emulator_test.go deleted file mode 100644 index 18a4633b47..0000000000 --- a/txnsync/emulator_test.go +++ /dev/null @@ -1,781 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "fmt" - "testing" - "time" - - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/test/partitiontest" -) - -type connectionSettings struct { - uploadSpeed uint64 // measured in bytes/second - downloadSpeed uint64 // measured in bytes/second - target int // node index in the networkConfiguration -} - -type nodeConfiguration struct { - outgoingConnections []connectionSettings - name string - isRelay bool -} - -// networkConfiguration defines the nodes setup and their connections. -type networkConfiguration struct { - nodes []nodeConfiguration -} - -// initialTransactionsAllocation defines how many transaction ( and what their sizes ) would be. -type initialTransactionsAllocation struct { - node int // node index in the networkConfiguration - transactionsCount int - transactionSize int - expirationRound basics.Round -} - -// scenario defines the emulator test scenario, which includes the network configuration, -// initial transaction distribution, test duration, dynamic transactions creation as well -// as expected test outcomes. -type scenario struct { - netConfig networkConfiguration - testDuration time.Duration - step time.Duration - initialAlloc []initialTransactionsAllocation - expectedResults emulatorResult -} - -func TestEmulatedTrivialTransactionsExchange(t *testing.T) { - partitiontest.PartitionTest(t) - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay", - isRelay: true, - }, - { - name: "node", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - }, - }, - testDuration: 500 * time.Millisecond, - initialAlloc: []initialTransactionsAllocation{ - { - node: 1, - transactionsCount: 1, - transactionSize: 250, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - }, - }, - step: 1 * time.Millisecond, - } - t.Run("NonRelay_To_Relay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - t.Run("Relay_To_NonRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) - t.Run("OutgoingRelay_To_IncomingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - t.Run("IncomingRelay_To_OutgoingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) -} - -func TestEmulatedTwoNodesToRelaysTransactionsExchange(t *testing.T) { - partitiontest.PartitionTest(t) - // this test creates the following network mode: - // - // relay1 ----------> relay2 - // ^ ^ - // | | - // node1 node2 - // - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay1", - isRelay: true, - }, - { - name: "relay2", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "node1", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "node2", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - }, - }, - }, - }, - testDuration: 1000 * time.Millisecond, - initialAlloc: []initialTransactionsAllocation{ - { - node: 2, - transactionsCount: 1, - transactionSize: 250, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - { - nodeTransaction{ - expirationRound: 5, - transactionSize: 250, - }, - }, - }, - }, - step: 1 * time.Millisecond, - } - emulateScenario(t, testScenario) -} - -func TestEmulatedLargeSetTransactionsExchange(t *testing.T) { - partitiontest.PartitionTest(t) - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay", - isRelay: true, - }, - { - name: "node", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - }, - }, - testDuration: 1000 * time.Millisecond, - initialAlloc: []initialTransactionsAllocation{ - { - node: 1, - transactionsCount: 100, - transactionSize: 800, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - {}, - {}, - }, - }, - step: 1 * time.Millisecond / 10, - } - // update the expected results to have the correct number of entries. - for i := 0; i < testScenario.initialAlloc[0].transactionsCount; i++ { - for n := range testScenario.expectedResults.nodes { - testScenario.expectedResults.nodes[n] = append(testScenario.expectedResults.nodes[n], nodeTransaction{expirationRound: testScenario.initialAlloc[0].expirationRound, transactionSize: testScenario.initialAlloc[0].transactionSize}) - } - } - - t.Run("NonRelay_To_Relay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - - t.Run("Relay_To_NonRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) - - t.Run("OutgoingRelay_To_IncomingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - - t.Run("OutgoingRelay_To_IncomingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) -} - -func TestEmulatedLargeSetTransactionsExchangeIntermixed(t *testing.T) { - partitiontest.PartitionTest(t) - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay", - isRelay: true, - }, - { - name: "node", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - }, - }, - initialAlloc: []initialTransactionsAllocation{ - { - node: 0, - transactionsCount: 200, - transactionSize: 400, - expirationRound: basics.Round(5), - }, - { - node: 1, - transactionsCount: 100, - transactionSize: 800, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - {}, - {}, - }, - }, - step: 1 * time.Millisecond / 10, - testDuration: 1200 * time.Millisecond, - } - // update the expected results to have the correct number of entries. - for j := range testScenario.initialAlloc { - for i := 0; i < testScenario.initialAlloc[j].transactionsCount; i++ { - for n := range testScenario.expectedResults.nodes { - testScenario.expectedResults.nodes[n] = append(testScenario.expectedResults.nodes[n], nodeTransaction{expirationRound: testScenario.initialAlloc[j].expirationRound, transactionSize: testScenario.initialAlloc[j].transactionSize}) - } - } - } - - t.Run("NonRelay_To_Relay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - - t.Run("Relay_To_NonRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "node" - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) - - t.Run("OutgoingRelay_To_IncomingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 1 - emulateScenario(t, testScenario) - }) - - t.Run("IncomingRelay_To_OutgoingRelay", func(t *testing.T) { - testScenario.netConfig.nodes[0].name = "incoming-relay" - testScenario.netConfig.nodes[0].isRelay = true - testScenario.netConfig.nodes[1].name = "outgoing-relay" - testScenario.netConfig.nodes[1].isRelay = true - testScenario.initialAlloc[0].node = 0 - emulateScenario(t, testScenario) - }) -} - -func TestEmulatedNonRelayToMultipleRelays(t *testing.T) { - partitiontest.PartitionTest(t) - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay-1", - isRelay: true, - }, - { - name: "relay-2", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "relay-3", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "node-1", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - }, - }, - { - name: "node-2", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - }, - }, - }, - }, - initialAlloc: []initialTransactionsAllocation{ - { - node: 4, // i.e. node-2 - transactionsCount: 1000, - transactionSize: 250, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - {}, - {}, - {}, - {}, - {}, - }, - }, - step: 1 * time.Millisecond / 10, - testDuration: 2000 * time.Millisecond, - } - // update the expected results to have the correct number of entries. - for j := range testScenario.initialAlloc { - for i := 0; i < testScenario.initialAlloc[j].transactionsCount; i++ { - for n := range testScenario.expectedResults.nodes { - testScenario.expectedResults.nodes[n] = append(testScenario.expectedResults.nodes[n], nodeTransaction{expirationRound: testScenario.initialAlloc[j].expirationRound, transactionSize: testScenario.initialAlloc[j].transactionSize}) - } - } - } - - emulateScenario(t, testScenario) -} - -func TestEmulatedTwoNodesFourRelays(t *testing.T) { - partitiontest.PartitionTest(t) - - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay-1", - isRelay: true, - }, - { - name: "relay-2", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 3, - }, - }, - }, - { - name: "relay-3", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "relay-4", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "node-1", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 3, - }, - }, - }, - { - name: "node-2", - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 3, - }, - }, - }, - }, - }, - initialAlloc: []initialTransactionsAllocation{ - { - node: 4, // i.e. node-1 - transactionsCount: 3000, - transactionSize: 270, - expirationRound: basics.Round(5), - }, - { - node: 5, // i.e. node-2 - transactionsCount: 1500, - transactionSize: 320, - expirationRound: basics.Round(5), - }, - }, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - {}, - {}, - {}, - {}, - {}, - {}, - }, - }, - step: 1 * time.Millisecond / 10, - testDuration: 2100 * time.Millisecond, - } - // update the expected results to have the correct number of entries. - for j := range testScenario.initialAlloc { - for i := 0; i < testScenario.initialAlloc[j].transactionsCount; i++ { - for n := range testScenario.expectedResults.nodes { - testScenario.expectedResults.nodes[n] = append(testScenario.expectedResults.nodes[n], nodeTransaction{expirationRound: testScenario.initialAlloc[j].expirationRound, transactionSize: testScenario.initialAlloc[j].transactionSize}) - } - } - } - - emulateScenario(t, testScenario) -} - -func TestEmulatedTwentyNodesFourRelays(t *testing.T) { - partitiontest.PartitionTest(t) - - if testing.Short() { - t.Skip("TestEmulatedTwentyNodesFourRelays is a long test and therefore was skipped") - } - testScenario := scenario{ - netConfig: networkConfiguration{ - nodes: []nodeConfiguration{ - { - name: "relay-1", - isRelay: true, - }, - { - name: "relay-2", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 3, - }, - }, - }, - { - name: "relay-3", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - { - name: "relay-4", - isRelay: true, - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - }, - }, - }, - }, - initialAlloc: []initialTransactionsAllocation{}, - expectedResults: emulatorResult{ - nodes: []nodeTransactions{ - {}, - {}, - {}, - {}, - }, - }, - step: 1 * time.Millisecond / 10, - testDuration: 2000 * time.Millisecond, - } - - // add nodes. - for i := 0; i < 20; i++ { - testScenario.netConfig.nodes = append(testScenario.netConfig.nodes, nodeConfiguration{ - name: fmt.Sprintf("node-%d", i+1), - outgoingConnections: []connectionSettings{ - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 0, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 1, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 2, - }, - { - uploadSpeed: 1000000, - downloadSpeed: 1000000, - target: 3, - }, - }, - }) - - testScenario.initialAlloc = append(testScenario.initialAlloc, initialTransactionsAllocation{ - node: 4 + i, // i.e. node-1 + i - transactionsCount: 250, - transactionSize: 270, - expirationRound: basics.Round(5), - }) - - testScenario.expectedResults.nodes = append(testScenario.expectedResults.nodes, nodeTransactions{}) - } - - // update the expected results to have the correct number of entries. - for j := range testScenario.initialAlloc { - for i := 0; i < testScenario.initialAlloc[j].transactionsCount; i++ { - for n := range testScenario.expectedResults.nodes { - testScenario.expectedResults.nodes[n] = append(testScenario.expectedResults.nodes[n], nodeTransaction{expirationRound: testScenario.initialAlloc[j].expirationRound, transactionSize: testScenario.initialAlloc[j].transactionSize}) - } - } - } - - emulateScenario(t, testScenario) -} diff --git a/txnsync/encodedgroups_test.go b/txnsync/encodedgroups_test.go deleted file mode 100644 index 87aa723964..0000000000 --- a/txnsync/encodedgroups_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "math" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestBadBitmask(t *testing.T) { - partitiontest.PartitionTest(t) - - txnGroups, genesisID, genesisHash, err := txnGroupsData(50) - require.NoError(t, err) - - var s syncState - ptg, err := badEncodeTransactionGroups(t, &s, txnGroups, 0) - require.NoError(t, err) - require.Equal(t, ptg.CompressionFormat, compressionFormatDeflate) - _, err = decodeTransactionGroups(ptg, genesisID, genesisHash) - require.Equal(t, errIndexNotFound, err) -} - -// corrupted bitmask may cause panic during decoding. This test is to make sure it is an error and not a panic -func badEncodeTransactionGroups(t *testing.T, s *syncState, inTxnGroups []pooldata.SignedTxGroup, dataExchangeRate uint64) (packedTransactionGroups, error) { - txnCount := 0 - for _, txGroup := range inTxnGroups { - txnCount += len(txGroup.Transactions) - } - stub := txGroupsEncodingStub{ - TotalTransactionsCount: uint64(txnCount), - TransactionGroupCount: uint64(len(inTxnGroups)), - TransactionGroupSizes: make([]byte, 0, len(inTxnGroups)), - } - - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - index := 0 - for _, txGroup := range inTxnGroups { - if len(txGroup.Transactions) > 1 { - for _, txn := range txGroup.Transactions { - err := stub.deconstructSignedTransaction(index, &txn) - require.NoError(t, err) - index++ - } - stub.TransactionGroupSizes = append(stub.TransactionGroupSizes, byte(len(txGroup.Transactions)-1)) - } - } - compactNibblesArray(&stub.TransactionGroupSizes) - for _, txGroup := range inTxnGroups { - if len(txGroup.Transactions) == 1 { - for _, txn := range txGroup.Transactions { - if !txn.Txn.Group.MsgIsZero() { - if len(stub.BitmaskGroup) == 0 { - stub.BitmaskGroup = make(bitmask, bitmaskLen) - } - stub.BitmaskGroup.setBit(index) - } - err := stub.deconstructSignedTransaction(index, &txn) - require.NoError(t, err) - index++ - } - } - } - - stub.BitmaskAuthAddr.trimBitmask(int(stub.TotalTransactionsCount)) - stub.finishDeconstructMsigs() - stub.finishDeconstructLsigs() - stub.BitmaskSig.trimBitmask(int(stub.TotalTransactionsCount)) - - stub.finishDeconstructTxType() - // corrupted bitmask - stub.BitmaskTxType = make(bitmask, bitmaskLen*10) - stub.BitmaskTxType.setBit(bitmaskLen*10 - 10) - - stub.finishDeconstructTxnHeader() - stub.finishDeconstructKeyregTxnFields() - stub.finishDeconstructPaymentTxnFields() - stub.finishDeconstructAssetConfigTxnFields() - stub.finishDeconstructAssetTransferTxnFields() - stub.finishDeconstructAssetFreezeTxnFields() - stub.finishDeconstructApplicationCallTxnFields() - stub.finishDeconstructCompactCertTxnFields() - - encoded := stub.MarshalMsg(getMessageBuffer()) - - // check if time saved by compression: estimatedDeflateCompressionGains * len(msg) / dataExchangeRate - // is greater than by time spent during compression: len(msg) / estimatedDeflateCompressionSpeed - if len(encoded) > minEncodedTransactionGroupsCompressionThreshold && float32(dataExchangeRate) < (estimatedDeflateCompressionGains*estimatedDeflateCompressionSpeed) { - compressedBytes, compressionFormat := s.compressTransactionGroupsBytes(encoded) - if compressionFormat != compressionFormatNone { - packedGroups := packedTransactionGroups{ - Bytes: compressedBytes, - CompressionFormat: compressionFormat, - LenDecompressedBytes: uint64(len(encoded)), - } - releaseMessageBuffer(encoded) - return packedGroups, nil - } - } - - return packedTransactionGroups{ - Bytes: encoded, - CompressionFormat: compressionFormatNone, - }, nil -} -func TestInvalidByteToTxType(t *testing.T) { - partitiontest.PartitionTest(t) - - for i := len(protocol.TxnTypes); i <= math.MaxUint8; i++ { - require.Equal(t, protocol.UnknownTx, ByteToTxType(byte(i))) - } -} diff --git a/txnsync/encodedgroupsmarshalers.go b/txnsync/encodedgroupsmarshalers.go deleted file mode 100644 index 583f9ede10..0000000000 --- a/txnsync/encodedgroupsmarshalers.go +++ /dev/null @@ -1,795 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "fmt" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/protocol" -) - -func compactNibblesArray(b *[]byte) { - if len(*b)%2 == 1 { - *b = append(*b, byte(0)) - } - for index := 0; index*2 < len(*b); index++ { - (*b)[index] = (*b)[index*2]*16 + (*b)[index*2+1] - } - *b = (*b)[0 : len(*b)/2] -} - -// deconstructs SignedTxn's into lists of fields and bitmasks -func (stub *txGroupsEncodingStub) deconstructSignedTransaction(i int, txn *transactions.SignedTxn) error { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Sig.MsgIsZero() { - if len(stub.BitmaskSig) == 0 { - stub.BitmaskSig = make(bitmask, bitmaskLen) - stub.Sig = make([]byte, 0, int(stub.TotalTransactionsCount)*len(crypto.Signature{})) - } - stub.BitmaskSig.setBit(i) - stub.Sig = append(stub.Sig, txn.Sig[:]...) - } - stub.deconstructMsigs(i, txn) - stub.deconstructLsigs(i, txn) - if !txn.AuthAddr.MsgIsZero() { - if len(stub.BitmaskAuthAddr) == 0 { - stub.BitmaskAuthAddr = make(bitmask, bitmaskLen) - stub.AuthAddr = make([]byte, 0, int(stub.TotalTransactionsCount)*crypto.DigestSize) - } - stub.BitmaskAuthAddr.setBit(i) - stub.AuthAddr = append(stub.AuthAddr, txn.AuthAddr[:]...) - } - return stub.deconstructTransactions(i, txn) -} - -func (stub *txGroupsEncodingStub) finishDeconstructSignedTransactions() { - stub.BitmaskAuthAddr.trimBitmask(int(stub.TotalTransactionsCount)) - stub.finishDeconstructMsigs() - stub.finishDeconstructLsigs() - stub.BitmaskSig.trimBitmask(int(stub.TotalTransactionsCount)) - stub.finishDeconstructTransactions() -} - -func (stub *txGroupsEncodingStub) deconstructMsigs(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if txn.Msig.Version != 0 { - if len(stub.BitmaskVersion) == 0 { - stub.BitmaskVersion = make(bitmask, bitmaskLen) - stub.Version = make([]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskVersion.setBit(i) - stub.Version = append(stub.Version, txn.Msig.Version) - } - if txn.Msig.Threshold != 0 { - if len(stub.BitmaskThreshold) == 0 { - stub.BitmaskThreshold = make(bitmask, bitmaskLen) - stub.Threshold = make([]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskThreshold.setBit(i) - stub.Threshold = append(stub.Threshold, txn.Msig.Threshold) - } - if txn.Msig.Subsigs != nil { - if len(stub.BitmaskSubsigs) == 0 { - stub.BitmaskSubsigs = make(bitmask, bitmaskLen) - stub.Subsigs = make([][]crypto.MultisigSubsig, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskSubsigs.setBit(i) - stub.Subsigs = append(stub.Subsigs, txn.Msig.Subsigs) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructMsigs() { - stub.BitmaskVersion.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskThreshold.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskSubsigs.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructLsigs(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if txn.Lsig.Logic != nil { - if len(stub.BitmaskLogic) == 0 { - stub.BitmaskLogic = make(bitmask, bitmaskLen) - stub.Logic = make([][]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskLogic.setBit(i) - stub.Logic = append(stub.Logic, txn.Lsig.Logic) - } - if txn.Lsig.Args != nil { - if len(stub.BitmaskLogicArgs) == 0 { - stub.BitmaskLogicArgs = make(bitmask, bitmaskLen) - stub.LogicArgs = make([][][]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskLogicArgs.setBit(i) - stub.LogicArgs = append(stub.LogicArgs, txn.Lsig.Args) - } - if !txn.Lsig.Sig.MsgIsZero() { - if len(stub.BitmaskSig) == 0 { - stub.BitmaskSig = make(bitmask, bitmaskLen) - stub.Sig = make([]byte, 0, int(stub.TotalTransactionsCount)*len(crypto.Signature{})) - } - stub.BitmaskSig.setBit(i) - stub.Sig = append(stub.Sig, txn.Lsig.Sig[:]...) - } - if txn.Lsig.Msig.Version != 0 { - if len(stub.BitmaskVersion) == 0 { - stub.BitmaskVersion = make(bitmask, bitmaskLen) - stub.Version = make([]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskVersion.setBit(i) - stub.Version = append(stub.Version, txn.Lsig.Msig.Version) - } - if txn.Lsig.Msig.Threshold != 0 { - if len(stub.BitmaskThreshold) == 0 { - stub.BitmaskThreshold = make(bitmask, bitmaskLen) - stub.Threshold = make([]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskThreshold.setBit(i) - stub.Threshold = append(stub.Threshold, txn.Lsig.Msig.Threshold) - } - if txn.Lsig.Msig.Subsigs != nil { - if len(stub.BitmaskSubsigs) == 0 { - stub.BitmaskSubsigs = make(bitmask, bitmaskLen) - stub.Subsigs = make([][]crypto.MultisigSubsig, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskSubsigs.setBit(i) - stub.Subsigs = append(stub.Subsigs, txn.Lsig.Msig.Subsigs) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructLsigs() { - stub.BitmaskLogic.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskLogicArgs.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructTransactions(i int, txn *transactions.SignedTxn) error { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - txTypeByte, err := TxTypeToByte(txn.Txn.Type) - if err != nil { - return fmt.Errorf("failed to deconstructTransactions: %w", err) - } - if len(stub.BitmaskTxType) == 0 { - stub.BitmaskTxType = make(bitmask, bitmaskLen) - stub.TxType = make([]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.TxType = append(stub.TxType, txTypeByte) - stub.deconstructTxnHeader(i, txn) - switch txTypeByte { - case paymentTx: - stub.deconstructPaymentTxnFields(i, txn) - case keyRegistrationTx: - stub.deconstructKeyregTxnFields(i, txn) - case assetConfigTx: - stub.deconstructAssetConfigTxnFields(i, txn) - case assetTransferTx: - stub.deconstructAssetTransferTxnFields(i, txn) - case assetFreezeTx: - stub.deconstructAssetFreezeTxnFields(i, txn) - case applicationCallTx: - stub.deconstructApplicationCallTxnFields(i, txn) - case compactCertTx: - stub.deconstructCompactCertTxnFields(i, txn) - } - return nil -} - -func (stub *txGroupsEncodingStub) finishDeconstructTransactions() { - stub.finishDeconstructTxType() - stub.finishDeconstructTxnHeader() - stub.finishDeconstructKeyregTxnFields() - stub.finishDeconstructPaymentTxnFields() - stub.finishDeconstructAssetConfigTxnFields() - stub.finishDeconstructAssetTransferTxnFields() - stub.finishDeconstructAssetFreezeTxnFields() - stub.finishDeconstructApplicationCallTxnFields() - stub.finishDeconstructCompactCertTxnFields() -} - -func (stub *txGroupsEncodingStub) finishDeconstructTxType() { - offset := byte(0) - count := make([]int, len(protocol.TxnTypes)) - maxcount := 0 - for _, t := range stub.TxType { - count[int(t)]++ - } - for i, c := range count { - if c > maxcount { - offset = byte(i) - maxcount = c - } - } - newTxTypes := make([]byte, 0, stub.TotalTransactionsCount) - for i := 0; i < int(stub.TotalTransactionsCount); i++ { - if stub.TxType[i] != offset { - stub.BitmaskTxType.setBit(i) - newTxTypes = append(newTxTypes, stub.TxType[i]) - } - } - stub.TxType = newTxTypes - stub.TxTypeOffset = offset - compactNibblesArray(&stub.TxType) - stub.BitmaskTxType.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructTxnHeader(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.Sender.MsgIsZero() { - if len(stub.BitmaskSender) == 0 { - stub.BitmaskSender = make(bitmask, bitmaskLen) - stub.Sender = make([]byte, 0, int(stub.TotalTransactionsCount)*crypto.DigestSize) - } - stub.BitmaskSender.setBit(i) - stub.Sender = append(stub.Sender, txn.Txn.Sender[:]...) - } - if !txn.Txn.Fee.MsgIsZero() { - if len(stub.BitmaskFee) == 0 { - stub.BitmaskFee = make(bitmask, bitmaskLen) - stub.Fee = make([]basics.MicroAlgos, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskFee.setBit(i) - stub.Fee = append(stub.Fee, txn.Txn.Fee) - } - if !txn.Txn.FirstValid.MsgIsZero() { - if len(stub.BitmaskFirstValid) == 0 { - stub.BitmaskFirstValid = make(bitmask, bitmaskLen) - stub.FirstValid = make([]basics.Round, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskFirstValid.setBit(i) - stub.FirstValid = append(stub.FirstValid, txn.Txn.FirstValid) - } - if !txn.Txn.LastValid.MsgIsZero() { - if len(stub.BitmaskLastValid) == 0 { - stub.BitmaskLastValid = make(bitmask, bitmaskLen) - stub.LastValid = make([]basics.Round, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskLastValid.setBit(i) - stub.LastValid = append(stub.LastValid, txn.Txn.LastValid) - } - if txn.Txn.Note != nil { - if len(stub.BitmaskNote) == 0 { - stub.BitmaskNote = make(bitmask, bitmaskLen) - stub.Note = make([][]byte, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskNote.setBit(i) - stub.Note = append(stub.Note, txn.Txn.Note) - } - if txn.Txn.GenesisID != "" { - if len(stub.BitmaskGenesisID) == 0 { - stub.BitmaskGenesisID = make(bitmask, bitmaskLen) - } - stub.BitmaskGenesisID.setBit(i) - } - if txn.Txn.Lease != ([32]byte{}) { - if len(stub.BitmaskLease) == 0 { - stub.BitmaskLease = make(bitmask, bitmaskLen) - stub.Lease = make([]byte, 0, int(stub.TotalTransactionsCount)*transactions.LeaseByteLength) - } - stub.BitmaskLease.setBit(i) - stub.Lease = append(stub.Lease, txn.Txn.Lease[:]...) - } - if !txn.Txn.RekeyTo.MsgIsZero() { - if len(stub.BitmaskRekeyTo) == 0 { - stub.BitmaskRekeyTo = make(bitmask, bitmaskLen) - stub.RekeyTo = make([]byte, 0, int(stub.TotalTransactionsCount)*crypto.DigestSize) - } - stub.BitmaskRekeyTo.setBit(i) - stub.RekeyTo = append(stub.RekeyTo, txn.Txn.RekeyTo[:]...) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructTxnHeader() { - stub.BitmaskSender.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskFee.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskFirstValid.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskLastValid.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskNote.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskGenesisID.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskGroup.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskLease.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskRekeyTo.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructKeyregTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.VotePK.MsgIsZero() || !txn.Txn.SelectionPK.MsgIsZero() || txn.Txn.VoteKeyDilution != 0 { - if len(stub.BitmaskKeys) == 0 { - stub.BitmaskKeys = make(bitmask, bitmaskLen) - stub.VotePK = make([]byte, 0, stub.TotalTransactionsCount*crypto.PublicKeyByteLength) - stub.SelectionPK = make([]byte, 0, stub.TotalTransactionsCount*crypto.VrfPubkeyByteLength) - stub.VoteKeyDilution = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskKeys.setBit(i) - stub.VotePK = append(stub.VotePK, txn.Txn.VotePK[:]...) - stub.SelectionPK = append(stub.SelectionPK, txn.Txn.SelectionPK[:]...) - stub.VoteKeyDilution = append(stub.VoteKeyDilution, txn.Txn.VoteKeyDilution) - } - if !txn.Txn.VoteFirst.MsgIsZero() { - if len(stub.BitmaskVoteFirst) == 0 { - stub.BitmaskVoteFirst = make(bitmask, bitmaskLen) - stub.VoteFirst = make([]basics.Round, 0, stub.TotalTransactionsCount) - } - stub.BitmaskVoteFirst.setBit(i) - stub.VoteFirst = append(stub.VoteFirst, txn.Txn.VoteFirst) - } - if !txn.Txn.VoteLast.MsgIsZero() { - if len(stub.BitmaskVoteLast) == 0 { - stub.BitmaskVoteLast = make(bitmask, bitmaskLen) - stub.VoteLast = make([]basics.Round, 0, stub.TotalTransactionsCount) - } - stub.BitmaskVoteLast.setBit(i) - stub.VoteLast = append(stub.VoteLast, txn.Txn.VoteLast) - } - if txn.Txn.Nonparticipation { - if len(stub.BitmaskNonparticipation) == 0 { - stub.BitmaskNonparticipation = make(bitmask, bitmaskLen) - } - stub.BitmaskNonparticipation.setBit(i) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructKeyregTxnFields() { - stub.BitmaskKeys.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskVoteFirst.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskVoteLast.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskNonparticipation.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructPaymentTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.Receiver.MsgIsZero() { - if len(stub.BitmaskReceiver) == 0 { - stub.BitmaskReceiver = make(bitmask, bitmaskLen) - stub.Receiver = make([]byte, 0, int(stub.TotalTransactionsCount)*crypto.DigestSize) - } - stub.BitmaskReceiver.setBit(i) - stub.Receiver = append(stub.Receiver, txn.Txn.Receiver[:]...) - } - if !txn.Txn.Amount.MsgIsZero() { - if len(stub.BitmaskAmount) == 0 { - stub.BitmaskAmount = make(bitmask, bitmaskLen) - stub.Amount = make([]basics.MicroAlgos, 0, int(stub.TotalTransactionsCount)) - } - stub.BitmaskAmount.setBit(i) - stub.Amount = append(stub.Amount, txn.Txn.Amount) - } - if !txn.Txn.CloseRemainderTo.MsgIsZero() { - if len(stub.BitmaskCloseRemainderTo) == 0 { - stub.BitmaskCloseRemainderTo = make(bitmask, bitmaskLen) - stub.CloseRemainderTo = make([]byte, 0, int(stub.TotalTransactionsCount)*crypto.DigestSize) - } - stub.BitmaskCloseRemainderTo.setBit(i) - stub.CloseRemainderTo = append(stub.CloseRemainderTo, txn.Txn.CloseRemainderTo[:]...) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructPaymentTxnFields() { - stub.BitmaskReceiver.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAmount.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskCloseRemainderTo.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructAssetConfigTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.ConfigAsset.MsgIsZero() { - if len(stub.BitmaskConfigAsset) == 0 { - stub.BitmaskConfigAsset = make(bitmask, bitmaskLen) - stub.ConfigAsset = make([]basics.AssetIndex, 0, stub.TotalTransactionsCount) - } - stub.BitmaskConfigAsset.setBit(i) - stub.ConfigAsset = append(stub.ConfigAsset, txn.Txn.ConfigAsset) - } - stub.deconstructAssetParams(i, txn) -} - -func (stub *txGroupsEncodingStub) finishDeconstructAssetConfigTxnFields() { - stub.BitmaskConfigAsset.trimBitmask(int(stub.TotalTransactionsCount)) - stub.finishDeconstructAssetParams() -} - -func (stub *txGroupsEncodingStub) deconstructAssetParams(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if txn.Txn.AssetParams.Total != 0 { - if len(stub.BitmaskTotal) == 0 { - stub.BitmaskTotal = make(bitmask, bitmaskLen) - stub.Total = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskTotal.setBit(i) - stub.Total = append(stub.Total, txn.Txn.AssetParams.Total) - } - if txn.Txn.AssetParams.Decimals != 0 { - if len(stub.BitmaskDecimals) == 0 { - stub.BitmaskDecimals = make(bitmask, bitmaskLen) - stub.Decimals = make([]uint32, 0, stub.TotalTransactionsCount) - } - stub.BitmaskDecimals.setBit(i) - stub.Decimals = append(stub.Decimals, txn.Txn.AssetParams.Decimals) - } - if txn.Txn.AssetParams.DefaultFrozen { - if len(stub.BitmaskDefaultFrozen) == 0 { - stub.BitmaskDefaultFrozen = make(bitmask, bitmaskLen) - } - stub.BitmaskDefaultFrozen.setBit(i) - } - if txn.Txn.AssetParams.UnitName != "" { - if len(stub.BitmaskUnitName) == 0 { - stub.BitmaskUnitName = make(bitmask, bitmaskLen) - stub.UnitName = make([]string, 0, stub.TotalTransactionsCount) - } - stub.BitmaskUnitName.setBit(i) - stub.UnitName = append(stub.UnitName, txn.Txn.AssetParams.UnitName) - } - if txn.Txn.AssetParams.AssetName != "" { - if len(stub.BitmaskAssetName) == 0 { - stub.BitmaskAssetName = make(bitmask, bitmaskLen) - stub.AssetName = make([]string, 0, stub.TotalTransactionsCount) - } - stub.BitmaskAssetName.setBit(i) - stub.AssetName = append(stub.AssetName, txn.Txn.AssetParams.AssetName) - } - if txn.Txn.AssetParams.URL != "" { - if len(stub.BitmaskURL) == 0 { - stub.BitmaskURL = make(bitmask, bitmaskLen) - stub.URL = make([]string, 0, stub.TotalTransactionsCount) - } - stub.BitmaskURL.setBit(i) - stub.URL = append(stub.URL, txn.Txn.AssetParams.URL) - } - if txn.Txn.AssetParams.MetadataHash != [32]byte{} { - if len(stub.BitmaskMetadataHash) == 0 { - stub.BitmaskMetadataHash = make(bitmask, bitmaskLen) - stub.MetadataHash = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskMetadataHash.setBit(i) - stub.MetadataHash = append(stub.MetadataHash, txn.Txn.AssetParams.MetadataHash[:]...) - } - if !txn.Txn.AssetParams.Manager.MsgIsZero() { - if len(stub.BitmaskManager) == 0 { - stub.BitmaskManager = make(bitmask, bitmaskLen) - stub.Manager = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskManager.setBit(i) - stub.Manager = append(stub.Manager, txn.Txn.AssetParams.Manager[:]...) - } - if !txn.Txn.AssetParams.Reserve.MsgIsZero() { - if len(stub.BitmaskReserve) == 0 { - stub.BitmaskReserve = make(bitmask, bitmaskLen) - stub.Reserve = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskReserve.setBit(i) - stub.Reserve = append(stub.Reserve, txn.Txn.AssetParams.Reserve[:]...) - } - if !txn.Txn.AssetParams.Freeze.MsgIsZero() { - if len(stub.BitmaskFreeze) == 0 { - stub.BitmaskFreeze = make(bitmask, bitmaskLen) - stub.Freeze = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskFreeze.setBit(i) - stub.Freeze = append(stub.Freeze, txn.Txn.AssetParams.Freeze[:]...) - } - if !txn.Txn.AssetParams.Clawback.MsgIsZero() { - if len(stub.BitmaskClawback) == 0 { - stub.BitmaskClawback = make(bitmask, bitmaskLen) - stub.Clawback = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskClawback.setBit(i) - stub.Clawback = append(stub.Clawback, txn.Txn.AssetParams.Clawback[:]...) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructAssetParams() { - stub.BitmaskTotal.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskDecimals.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskDefaultFrozen.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskUnitName.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetName.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskURL.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskMetadataHash.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskManager.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskReserve.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskFreeze.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskClawback.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructAssetTransferTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.XferAsset.MsgIsZero() { - if len(stub.BitmaskXferAsset) == 0 { - stub.BitmaskXferAsset = make(bitmask, bitmaskLen) - stub.XferAsset = make([]basics.AssetIndex, 0, stub.TotalTransactionsCount) - } - stub.BitmaskXferAsset.setBit(i) - stub.XferAsset = append(stub.XferAsset, txn.Txn.XferAsset) - } - if txn.Txn.AssetAmount != 0 { - if len(stub.BitmaskAssetAmount) == 0 { - stub.BitmaskAssetAmount = make(bitmask, bitmaskLen) - stub.AssetAmount = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskAssetAmount.setBit(i) - stub.AssetAmount = append(stub.AssetAmount, txn.Txn.AssetAmount) - } - if !txn.Txn.AssetSender.MsgIsZero() { - if len(stub.BitmaskAssetSender) == 0 { - stub.BitmaskAssetSender = make(bitmask, bitmaskLen) - stub.AssetSender = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskAssetSender.setBit(i) - stub.AssetSender = append(stub.AssetSender, txn.Txn.AssetSender[:]...) - } - if !txn.Txn.AssetReceiver.MsgIsZero() { - if len(stub.BitmaskAssetReceiver) == 0 { - stub.BitmaskAssetReceiver = make(bitmask, bitmaskLen) - stub.AssetReceiver = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskAssetReceiver.setBit(i) - stub.AssetReceiver = append(stub.AssetReceiver, txn.Txn.AssetReceiver[:]...) - } - if !txn.Txn.AssetCloseTo.MsgIsZero() { - if len(stub.BitmaskAssetCloseTo) == 0 { - stub.BitmaskAssetCloseTo = make(bitmask, bitmaskLen) - stub.AssetCloseTo = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskAssetCloseTo.setBit(i) - stub.AssetCloseTo = append(stub.AssetCloseTo, txn.Txn.AssetCloseTo[:]...) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructAssetTransferTxnFields() { - stub.BitmaskXferAsset.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetAmount.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetSender.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetReceiver.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetCloseTo.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructAssetFreezeTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.FreezeAccount.MsgIsZero() { - if len(stub.BitmaskFreezeAccount) == 0 { - stub.BitmaskFreezeAccount = make(bitmask, bitmaskLen) - stub.FreezeAccount = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskFreezeAccount.setBit(i) - stub.FreezeAccount = append(stub.FreezeAccount, txn.Txn.FreezeAccount[:]...) - } - if txn.Txn.FreezeAsset != 0 { - if len(stub.BitmaskFreezeAsset) == 0 { - stub.BitmaskFreezeAsset = make(bitmask, bitmaskLen) - stub.FreezeAsset = make([]basics.AssetIndex, 0, stub.TotalTransactionsCount) - } - stub.BitmaskFreezeAsset.setBit(i) - stub.FreezeAsset = append(stub.FreezeAsset, txn.Txn.FreezeAsset) - } - if txn.Txn.AssetFrozen { - if len(stub.BitmaskAssetFrozen) == 0 { - stub.BitmaskAssetFrozen = make(bitmask, bitmaskLen) - } - stub.BitmaskAssetFrozen.setBit(i) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructAssetFreezeTxnFields() { - stub.BitmaskFreezeAccount.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskFreezeAsset.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAssetFrozen.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructApplicationCallTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.ApplicationID.MsgIsZero() { - if len(stub.BitmaskApplicationID) == 0 { - stub.BitmaskApplicationID = make(bitmask, bitmaskLen) - stub.ApplicationID = make([]basics.AppIndex, 0, stub.TotalTransactionsCount) - } - stub.BitmaskApplicationID.setBit(i) - stub.ApplicationID = append(stub.ApplicationID, txn.Txn.ApplicationID) - } - if txn.Txn.OnCompletion != 0 { - if len(stub.BitmaskOnCompletion) == 0 { - stub.BitmaskOnCompletion = make(bitmask, bitmaskLen) - stub.OnCompletion = make([]byte, 0, stub.TotalTransactionsCount) - } - stub.BitmaskOnCompletion.setBit(i) - stub.OnCompletion = append(stub.OnCompletion, byte(txn.Txn.OnCompletion)) - } - if txn.Txn.ApplicationArgs != nil { - if len(stub.BitmaskApplicationArgs) == 0 { - stub.BitmaskApplicationArgs = make(bitmask, bitmaskLen) - stub.ApplicationArgs = make([]applicationArgs, 0, stub.TotalTransactionsCount) - } - stub.BitmaskApplicationArgs.setBit(i) - stub.ApplicationArgs = append(stub.ApplicationArgs, txn.Txn.ApplicationArgs) - } - if txn.Txn.Accounts != nil { - if len(stub.BitmaskAccounts) == 0 { - stub.BitmaskAccounts = make(bitmask, bitmaskLen) - stub.Accounts = make([]addresses, 0, stub.TotalTransactionsCount) - } - stub.BitmaskAccounts.setBit(i) - stub.Accounts = append(stub.Accounts, txn.Txn.Accounts) - } - if txn.Txn.ForeignApps != nil { - if len(stub.BitmaskForeignApps) == 0 { - stub.BitmaskForeignApps = make(bitmask, bitmaskLen) - stub.ForeignApps = make([]appIndices, 0, stub.TotalTransactionsCount) - } - stub.BitmaskForeignApps.setBit(i) - stub.ForeignApps = append(stub.ForeignApps, txn.Txn.ForeignApps) - } - if txn.Txn.ForeignAssets != nil { - if len(stub.BitmaskForeignAssets) == 0 { - stub.BitmaskForeignAssets = make(bitmask, bitmaskLen) - stub.ForeignAssets = make([]assetIndices, 0, stub.TotalTransactionsCount) - } - stub.BitmaskForeignAssets.setBit(i) - stub.ForeignAssets = append(stub.ForeignAssets, txn.Txn.ForeignAssets) - } - if txn.Txn.LocalStateSchema.NumUint != 0 { - if len(stub.BitmaskLocalNumUint) == 0 { - stub.BitmaskLocalNumUint = make(bitmask, bitmaskLen) - stub.LocalNumUint = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskLocalNumUint.setBit(i) - stub.LocalNumUint = append(stub.LocalNumUint, txn.Txn.LocalStateSchema.NumUint) - } - if txn.Txn.LocalStateSchema.NumByteSlice != 0 { - if len(stub.BitmaskLocalNumByteSlice) == 0 { - stub.BitmaskLocalNumByteSlice = make(bitmask, bitmaskLen) - stub.LocalNumByteSlice = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskLocalNumByteSlice.setBit(i) - stub.LocalNumByteSlice = append(stub.LocalNumByteSlice, txn.Txn.LocalStateSchema.NumByteSlice) - } - if txn.Txn.GlobalStateSchema.NumUint != 0 { - if len(stub.BitmaskGlobalNumUint) == 0 { - stub.BitmaskGlobalNumUint = make(bitmask, bitmaskLen) - stub.GlobalNumUint = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskGlobalNumUint.setBit(i) - stub.GlobalNumUint = append(stub.GlobalNumUint, txn.Txn.GlobalStateSchema.NumUint) - } - if txn.Txn.GlobalStateSchema.NumByteSlice != 0 { - if len(stub.BitmaskGlobalNumByteSlice) == 0 { - stub.BitmaskGlobalNumByteSlice = make(bitmask, bitmaskLen) - stub.GlobalNumByteSlice = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskGlobalNumByteSlice.setBit(i) - stub.GlobalNumByteSlice = append(stub.GlobalNumByteSlice, txn.Txn.GlobalStateSchema.NumByteSlice) - } - if txn.Txn.ApprovalProgram != nil { - if len(stub.BitmaskApprovalProgram) == 0 { - stub.BitmaskApprovalProgram = make(bitmask, bitmaskLen) - stub.ApprovalProgram = make([]program, 0, stub.TotalTransactionsCount) - } - stub.BitmaskApprovalProgram.setBit(i) - stub.ApprovalProgram = append(stub.ApprovalProgram, txn.Txn.ApprovalProgram) - } - if txn.Txn.ClearStateProgram != nil { - if len(stub.BitmaskClearStateProgram) == 0 { - stub.BitmaskClearStateProgram = make(bitmask, bitmaskLen) - stub.ClearStateProgram = make([]program, 0, stub.TotalTransactionsCount) - } - stub.BitmaskClearStateProgram.setBit(i) - stub.ClearStateProgram = append(stub.ClearStateProgram, txn.Txn.ClearStateProgram) - } - if txn.Txn.ExtraProgramPages != 0 { - if len(stub.BitmaskExtraProgramPages) == 0 { - stub.BitmaskExtraProgramPages = make(bitmask, bitmaskLen) - stub.ExtraProgramPages = make([]uint32, 0, stub.TotalTransactionsCount) - } - stub.BitmaskExtraProgramPages.setBit(i) - stub.ExtraProgramPages = append(stub.ExtraProgramPages, txn.Txn.ExtraProgramPages) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructApplicationCallTxnFields() { - compactNibblesArray(&stub.OnCompletion) - stub.BitmaskApplicationID.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskOnCompletion.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskApplicationArgs.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskAccounts.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskForeignApps.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskForeignAssets.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskLocalNumUint.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskLocalNumByteSlice.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskGlobalNumUint.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskGlobalNumByteSlice.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskApprovalProgram.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskClearStateProgram.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskExtraProgramPages.trimBitmask(int(stub.TotalTransactionsCount)) -} - -func (stub *txGroupsEncodingStub) deconstructCompactCertTxnFields(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.CertRound.MsgIsZero() { - if len(stub.BitmaskCertRound) == 0 { - stub.BitmaskCertRound = make(bitmask, bitmaskLen) - stub.CertRound = make([]basics.Round, 0, stub.TotalTransactionsCount) - } - stub.BitmaskCertRound.setBit(i) - stub.CertRound = append(stub.CertRound, txn.Txn.CertRound) - } - if txn.Txn.CertType != 0 { - if len(stub.BitmaskCertType) == 0 { - stub.BitmaskCertType = make(bitmask, bitmaskLen) - stub.CertType = make([]protocol.CompactCertType, 0, stub.TotalTransactionsCount) - } - stub.BitmaskCertType.setBit(i) - stub.CertType = append(stub.CertType, txn.Txn.CertType) - } - stub.deconstructCert(i, txn) -} - -func (stub *txGroupsEncodingStub) finishDeconstructCompactCertTxnFields() { - stub.BitmaskCertRound.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskCertType.trimBitmask(int(stub.TotalTransactionsCount)) - stub.finishDeconstructCert() -} - -func (stub *txGroupsEncodingStub) deconstructCert(i int, txn *transactions.SignedTxn) { - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - if !txn.Txn.Cert.SigCommit.MsgIsZero() { - if len(stub.BitmaskSigCommit) == 0 { - stub.BitmaskSigCommit = make(bitmask, bitmaskLen) - stub.SigCommit = make([]byte, 0, stub.TotalTransactionsCount*crypto.DigestSize) - } - stub.BitmaskSigCommit.setBit(i) - stub.SigCommit = append(stub.SigCommit, txn.Txn.Cert.SigCommit[:]...) - } - if txn.Txn.Cert.SignedWeight != 0 { - if len(stub.BitmaskSignedWeight) == 0 { - stub.BitmaskSignedWeight = make(bitmask, bitmaskLen) - stub.SignedWeight = make([]uint64, 0, stub.TotalTransactionsCount) - } - stub.BitmaskSignedWeight.setBit(i) - stub.SignedWeight = append(stub.SignedWeight, txn.Txn.Cert.SignedWeight) - } - if txn.Txn.Cert.SigProofs != nil { - if len(stub.BitmaskSigProofs) == 0 { - stub.BitmaskSigProofs = make(bitmask, bitmaskLen) - stub.SigProofs = make([]certProofs, 0, stub.TotalTransactionsCount) - } - stub.BitmaskSigProofs.setBit(i) - stub.SigProofs = append(stub.SigProofs, txn.Txn.Cert.SigProofs) - } - if txn.Txn.Cert.PartProofs != nil { - if len(stub.BitmaskPartProofs) == 0 { - stub.BitmaskPartProofs = make(bitmask, bitmaskLen) - stub.PartProofs = make([]certProofs, 0, stub.TotalTransactionsCount) - } - stub.BitmaskPartProofs.setBit(i) - stub.PartProofs = append(stub.PartProofs, txn.Txn.Cert.PartProofs) - } - if txn.Txn.Cert.Reveals != nil { - if len(stub.BitmaskReveals) == 0 { - stub.BitmaskReveals = make(bitmask, bitmaskLen) - stub.Reveals = make([]revealMap, 0, stub.TotalTransactionsCount) - } - stub.BitmaskReveals.setBit(i) - stub.Reveals = append(stub.Reveals, txn.Txn.Cert.Reveals) - } -} - -func (stub *txGroupsEncodingStub) finishDeconstructCert() { - stub.BitmaskSigCommit.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskSignedWeight.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskSigProofs.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskPartProofs.trimBitmask(int(stub.TotalTransactionsCount)) - stub.BitmaskReveals.trimBitmask(int(stub.TotalTransactionsCount)) -} diff --git a/txnsync/encodedgroupstypes.go b/txnsync/encodedgroupstypes.go deleted file mode 100644 index e8163ab767..0000000000 --- a/txnsync/encodedgroupstypes.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/crypto/compactcert" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/protocol" -) - -// set in init() in service.go -var maxEncodedTransactionGroups int -var maxEncodedTransactionGroupEntries int -var maxBitmaskSize int -var maxSignatureBytes int -var maxAddressBytes int - -var errInvalidTxType = errors.New("invalid txtype") - -//msgp:allocbound txnGroups maxEncodedTransactionGroupEntries -type txnGroups pooldata.SignedTxnSlice //nolint:unused - -// old data structure for encoding (only used for testing) -type txGroupsEncodingStubOld struct { //nolint:unused - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - TxnGroups []txnGroups `codec:"t,allocbound=maxEncodedTransactionGroups"` -} - -type txGroupsEncodingStub struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - TotalTransactionsCount uint64 `codec:"ttc"` - TransactionGroupCount uint64 `codec:"tgc"` - TransactionGroupSizes []byte `codec:"tgs,allocbound=maxEncodedTransactionGroups"` - - encodedSignedTxns -} - -type encodedSignedTxns struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Sig []byte `codec:"sig,allocbound=maxSignatureBytes"` - BitmaskSig bitmask `codec:"sigbm"` - - encodedMsigs - encodedLsigs - - AuthAddr []byte `codec:"sgnr,allocbound=maxAddressBytes"` - BitmaskAuthAddr bitmask `codec:"sgnrbm"` - - encodedTxns -} - -type encodedMsigs struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Version []byte `codec:"msigv,allocbound=maxEncodedTransactionGroups"` - BitmaskVersion bitmask `codec:"msigvbm"` - Threshold []byte `codec:"msigthr,allocbound=maxEncodedTransactionGroups"` - BitmaskThreshold bitmask `codec:"msigthrbm"` - // splitting subsigs further make the code much more complicated / does not give gains - Subsigs [][]crypto.MultisigSubsig `codec:"subsig,allocbound=maxEncodedTransactionGroups,allocbound=crypto.MaxMultisig"` - BitmaskSubsigs bitmask `codec:"subsigsbm"` -} - -type encodedLsigs struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Logic [][]byte `codec:"lsigl,allocbound=maxEncodedTransactionGroups,allocbound=config.MaxLogicSigMaxSize"` - BitmaskLogic bitmask `codec:"lsiglbm"` - LogicArgs [][][]byte `codec:"lsigarg,allocbound=maxEncodedTransactionGroups,allocbound=transactions.EvalMaxArgs,allocbound=config.MaxLogicSigMaxSize"` - BitmaskLogicArgs bitmask `codec:"lsigargbm"` -} - -type encodedTxns struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - TxType []byte `codec:"type,allocbound=maxEncodedTransactionGroups"` - BitmaskTxType bitmask `codec:"typebm"` - TxTypeOffset byte `codec:"typeo"` - - encodedTxnHeaders - encodedKeyregTxnFields - encodedPaymentTxnFields - encodedAssetConfigTxnFields - encodedAssetTransferTxnFields - encodedAssetFreezeTxnFields - encodedApplicationCallTxnFields - encodedCompactCertTxnFields -} - -type encodedTxnHeaders struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Sender []byte `codec:"snd,allocbound=maxAddressBytes"` - BitmaskSender bitmask `codec:"sndbm"` - Fee []basics.MicroAlgos `codec:"fee,allocbound=maxEncodedTransactionGroups"` - BitmaskFee bitmask `codec:"feebm"` - FirstValid []basics.Round `codec:"fv,allocbound=maxEncodedTransactionGroups"` - BitmaskFirstValid bitmask `codec:"fvbm"` - LastValid []basics.Round `codec:"lv,allocbound=maxEncodedTransactionGroups"` - BitmaskLastValid bitmask `codec:"lvbm"` - Note [][]byte `codec:"note,allocbound=maxEncodedTransactionGroups,allocbound=config.MaxTxnNoteBytes"` - BitmaskNote bitmask `codec:"notebm"` - BitmaskGenesisID bitmask `codec:"genbm"` - - BitmaskGroup bitmask `codec:"grpbm"` - - Lease []byte `codec:"lx,allocbound=maxAddressBytes"` - BitmaskLease bitmask `codec:"lxbm"` - - RekeyTo []byte `codec:"rekey,allocbound=maxAddressBytes"` - BitmaskRekeyTo bitmask `codec:"rekeybm"` -} - -type encodedKeyregTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - VotePK []byte `codec:"votekey,allocbound=maxAddressBytes"` - SelectionPK []byte `codec:"selkey,allocbound=maxAddressBytes"` - VoteFirst []basics.Round `codec:"votefst,allocbound=maxEncodedTransactionGroups"` - BitmaskVoteFirst bitmask `codec:"votefstbm"` - VoteLast []basics.Round `codec:"votelst,allocbound=maxEncodedTransactionGroups"` - BitmaskVoteLast bitmask `codec:"votelstbm"` - VoteKeyDilution []uint64 `codec:"votekd,allocbound=maxEncodedTransactionGroups"` - BitmaskKeys bitmask `codec:"votekbm"` - BitmaskNonparticipation bitmask `codec:"nonpartbm"` -} - -type encodedPaymentTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Receiver []byte `codec:"rcv,allocbound=maxAddressBytes"` - BitmaskReceiver bitmask `codec:"rcvbm"` - Amount []basics.MicroAlgos `codec:"amt,allocbound=maxEncodedTransactionGroups"` - BitmaskAmount bitmask `codec:"amtbm"` - - CloseRemainderTo []byte `codec:"close,allocbound=maxAddressBytes"` - BitmaskCloseRemainderTo bitmask `codec:"closebm"` -} - -type encodedAssetConfigTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - ConfigAsset []basics.AssetIndex `codec:"caid,allocbound=maxEncodedTransactionGroups"` - BitmaskConfigAsset bitmask `codec:"caidbm"` - - encodedAssetParams -} - -type encodedAssetParams struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Total []uint64 `codec:"t,allocbound=maxEncodedTransactionGroups"` - BitmaskTotal bitmask `codec:"tbm"` - - Decimals []uint32 `codec:"dc,allocbound=maxEncodedTransactionGroups"` - BitmaskDecimals bitmask `codec:"dcbm"` - - BitmaskDefaultFrozen bitmask `codec:"dfbm"` - - UnitName []string `codec:"un,allocbound=maxEncodedTransactionGroups"` - BitmaskUnitName bitmask `codec:"unbm"` - - AssetName []string `codec:"an,allocbound=maxEncodedTransactionGroups"` - BitmaskAssetName bitmask `codec:"anbm"` - - URL []string `codec:"au,allocbound=maxEncodedTransactionGroups"` - BitmaskURL bitmask `codec:"aubm"` - - MetadataHash []byte `codec:"am,allocbound=maxAddressBytes"` - BitmaskMetadataHash bitmask `codec:"ambm"` - - Manager []byte `codec:"m,allocbound=maxAddressBytes"` - BitmaskManager bitmask `codec:"mbm"` - - Reserve []byte `codec:"r,allocbound=maxAddressBytes"` - BitmaskReserve bitmask `codec:"rbm"` - - Freeze []byte `codec:"f,allocbound=maxAddressBytes"` - BitmaskFreeze bitmask `codec:"fbm"` - - Clawback []byte `codec:"c,allocbound=maxAddressBytes"` - BitmaskClawback bitmask `codec:"cbm"` -} - -type encodedAssetTransferTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - XferAsset []basics.AssetIndex `codec:"xaid,allocbound=maxEncodedTransactionGroups"` - BitmaskXferAsset bitmask `codec:"xaidbm"` - - AssetAmount []uint64 `codec:"aamt,allocbound=maxEncodedTransactionGroups"` - BitmaskAssetAmount bitmask `codec:"aamtbm"` - - AssetSender []byte `codec:"asnd,allocbound=maxAddressBytes"` - BitmaskAssetSender bitmask `codec:"asndbm"` - - AssetReceiver []byte `codec:"arcv,allocbound=maxAddressBytes"` - BitmaskAssetReceiver bitmask `codec:"arcvbm"` - - AssetCloseTo []byte `codec:"aclose,allocbound=maxAddressBytes"` - BitmaskAssetCloseTo bitmask `codec:"aclosebm"` -} - -type encodedAssetFreezeTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - FreezeAccount []byte `codec:"fadd,allocbound=maxAddressBytes"` - BitmaskFreezeAccount bitmask `codec:"faddbm"` - - FreezeAsset []basics.AssetIndex `codec:"faid,allocbound=maxEncodedTransactionGroups"` - BitmaskFreezeAsset bitmask `codec:"faidbm"` - - BitmaskAssetFrozen bitmask `codec:"afrzbm"` -} - -//msgp:allocbound applicationArgs transactions.EncodedMaxApplicationArgs -type applicationArgs [][]byte - -//msgp:allocbound addresses transactions.EncodedMaxAccounts -type addresses []basics.Address - -//msgp:allocbound appIndices transactions.EncodedMaxForeignApps -type appIndices []basics.AppIndex - -//msgp:allocbound assetIndices transactions.EncodedMaxForeignAssets -type assetIndices []basics.AssetIndex - -//msgp:allocbound program config.MaxAvailableAppProgramLen -type program []byte - -type encodedApplicationCallTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - ApplicationID []basics.AppIndex `codec:"apid,allocbound=maxEncodedTransactionGroups"` - BitmaskApplicationID bitmask `codec:"apidbm"` - - OnCompletion []byte `codec:"apan,allocbound=maxEncodedTransactionGroups"` - BitmaskOnCompletion bitmask `codec:"apanbm"` - - ApplicationArgs []applicationArgs `codec:"apaa,allocbound=maxEncodedTransactionGroups"` - BitmaskApplicationArgs bitmask `codec:"apaabm"` - - Accounts []addresses `codec:"apat,allocbound=maxEncodedTransactionGroups"` - BitmaskAccounts bitmask `codec:"apatbm"` - - ForeignApps []appIndices `codec:"apfa,allocbound=maxEncodedTransactionGroups"` - BitmaskForeignApps bitmask `codec:"apfabm"` - - ForeignAssets []assetIndices `codec:"apas,allocbound=maxEncodedTransactionGroups"` - BitmaskForeignAssets bitmask `codec:"apasbm"` - - LocalNumUint []uint64 `codec:"lnui,allocbound=maxEncodedTransactionGroups"` - BitmaskLocalNumUint bitmask `codec:"lnuibm"` - LocalNumByteSlice []uint64 `codec:"lnbs,allocbound=maxEncodedTransactionGroups"` - BitmaskLocalNumByteSlice bitmask `codec:"lnbsbm"` - - GlobalNumUint []uint64 `codec:"gnui,allocbound=maxEncodedTransactionGroups"` - BitmaskGlobalNumUint bitmask `codec:"gnuibm"` - GlobalNumByteSlice []uint64 `codec:"gnbs,allocbound=maxEncodedTransactionGroups"` - BitmaskGlobalNumByteSlice bitmask `codec:"gnbsbm"` - - ApprovalProgram []program `codec:"apap,allocbound=maxEncodedTransactionGroups"` - BitmaskApprovalProgram bitmask `codec:"apapbm"` - - ClearStateProgram []program `codec:"apsu,allocbound=maxEncodedTransactionGroups"` - BitmaskClearStateProgram bitmask `codec:"apsubm"` - - ExtraProgramPages []uint32 `codec:"apep,allocbound=maxEncodedTransactionGroups"` - BitmaskExtraProgramPages bitmask `codec:"apepbm"` -} - -type encodedCompactCertTxnFields struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - CertRound []basics.Round `codec:"certrnd,allocbound=maxEncodedTransactionGroups"` - BitmaskCertRound bitmask `codec:"certrndbm"` - - CertType []protocol.CompactCertType `codec:"certtype,allocbound=maxEncodedTransactionGroups"` - BitmaskCertType bitmask `codec:"certtypebm"` - - encodedCert -} - -//msgp:allocbound certProofs compactcert.MaxProofDigests -type certProofs []crypto.Digest - -//msgp:allocbound revealMap compactcert.MaxReveals -type revealMap map[uint64]compactcert.Reveal - -// SortUint64 implements sorting by uint64 keys for -// canonical encoding of maps in msgpack format. -type SortUint64 = compactcert.SortUint64 - -type encodedCert struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - SigCommit []byte `codec:"certc,allocbound=maxAddressBytes"` - BitmaskSigCommit bitmask `codec:"certcbm"` - - SignedWeight []uint64 `codec:"certw,allocbound=maxEncodedTransactionGroups"` - BitmaskSignedWeight bitmask `codec:"certwbm"` - - SigProofs []certProofs `codec:"certS,allocbound=maxEncodedTransactionGroups"` - BitmaskSigProofs bitmask `codec:"certSbm"` - - PartProofs []certProofs `codec:"certP,allocbound=maxEncodedTransactionGroups"` - BitmaskPartProofs bitmask `codec:"certPbm"` - - Reveals []revealMap `codec:"certr,allocbound=maxEncodedTransactionGroups"` - BitmaskReveals bitmask `codec:"certrbm"` -} - -const ( - paymentTx = iota - keyRegistrationTx - assetConfigTx - assetTransferTx - assetFreezeTx - applicationCallTx - compactCertTx - unknownTx -) - -// TxTypeToByte converts a TxType to byte encoding -func TxTypeToByte(t protocol.TxType) (byte, error) { - switch t { - case protocol.PaymentTx: - return paymentTx, nil - case protocol.KeyRegistrationTx: - return keyRegistrationTx, nil - case protocol.AssetConfigTx: - return assetConfigTx, nil - case protocol.AssetTransferTx: - return assetTransferTx, nil - case protocol.AssetFreezeTx: - return assetFreezeTx, nil - case protocol.ApplicationCallTx: - return applicationCallTx, nil - case protocol.CompactCertTx: - return compactCertTx, nil - default: - return unknownTx, errInvalidTxType - } -} - -// ByteToTxType converts a byte encoding to TxType -func ByteToTxType(b byte) protocol.TxType { - if int(b) >= len(protocol.TxnTypes) { - return protocol.UnknownTx - } - return protocol.TxnTypes[b] -} diff --git a/txnsync/encodedgroupsunmarshalers.go b/txnsync/encodedgroupsunmarshalers.go deleted file mode 100644 index 750bb08712..0000000000 --- a/txnsync/encodedgroupsunmarshalers.go +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - "fmt" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" -) - -var errDataMissing = errors.New("failed to decode: data missing") - -// the nextSlice definition - copy the next slice and slide the src window. -func nextSlice(src *[]byte, dst []byte, size int) error { - if len(*src) < size { - return errDataMissing - } - copy(dst[:], (*src)[:size]) - // slice the src window so next call would get the next entry. - *src = (*src)[size:] - return nil -} - -// getNibble returns the nibble at the given index from the provided -// byte array. A errDataMissing is returned if index is beyond the size -// of the array. -func getNibble(b []byte, index int) (byte, error) { - if index >= len(b)*2 { - return 0, errDataMissing - } - if index%2 == 0 { - return b[index/2] / 16, nil - } - return b[index/2] % 16, nil -} - -func addGroupHashes(txnGroups []pooldata.SignedTxGroup, txnCount int, b bitmask) (err error) { - index := 0 - txGroupHashes := make([]crypto.Digest, 16) - tStart := 0 - - // addGroupHashesFunc adds hashes to transactions in groups of more than 1 transaction, - // or to transactions with one transaction and bitmask set for that index. - // It stops at index nextSetBitIndex, or stops when all in txnGroups are visited. - addGroupHashesFunc := func(nextSetBitIndex int, count int) error { - remainingTxnGroups := txnGroups[tStart:] - for t, txns := range remainingTxnGroups { - if len(txns.Transactions) == 1 && index != nextSetBitIndex { - index++ - continue - } - var txGroup transactions.TxGroup - txGroup.TxGroupHashes = txGroupHashes[:len(txns.Transactions)] - for i, tx := range txns.Transactions { - txGroup.TxGroupHashes[i] = crypto.HashObj(tx.Txn) - } - groupHash := crypto.HashObj(txGroup) - for i := range txns.Transactions { - txns.Transactions[i].Txn.Group = groupHash - index++ - } - if index > nextSetBitIndex { - tStart += t + 1 - return nil - } - } - tStart = len(txnGroups) - return nil - } - // addGroupHashesFunc will be called for each set bit. Between set bits, all transactions - // in groups of more than 1 transactions will have the hashes added. - err = b.iterate(txnCount, txnCount, addGroupHashesFunc) - - if err == nil { - // One more call to addGroupHashesFunc to cover all the remaining transactions in groups of - // more than 1 transaction that were not added because no groups with one transaction are left. - err = addGroupHashesFunc(txnCount+1, -1) - } - return -} - -func (stub *txGroupsEncodingStub) reconstructSignedTransactions(signedTxns []transactions.SignedTxn, genesisID string, genesisHash crypto.Digest) error { - err := stub.BitmaskSig.iterate(int(stub.TotalTransactionsCount), len(stub.Sig)/len(crypto.Signature{}), func(i int, _ int) error { - return nextSlice(&stub.Sig, signedTxns[i].Sig[:], len(crypto.Signature{})) - }) - if err != nil { - return err - } - - if err = stub.reconstructMsigs(signedTxns); err != nil { - return fmt.Errorf("failed to msigs: %w", err) - } - if err = stub.reconstructLsigs(signedTxns); err != nil { - return fmt.Errorf("failed to lsigs: %w", err) - } - err = stub.BitmaskAuthAddr.iterate(int(stub.TotalTransactionsCount), len(stub.AuthAddr)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.AuthAddr, signedTxns[i].AuthAddr[:], crypto.DigestSize) - }) - if err != nil { - return err - } - - return stub.reconstructTransactions(signedTxns, genesisID, genesisHash) -} - -func (stub *txGroupsEncodingStub) reconstructMsigs(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskVersion.iterate(int(stub.TotalTransactionsCount), len(stub.Version), func(i int, index int) error { - signedTxns[i].Msig.Version = stub.Version[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskThreshold.iterate(int(stub.TotalTransactionsCount), len(stub.Threshold), func(i int, index int) error { - signedTxns[i].Msig.Threshold = stub.Threshold[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskSubsigs.iterate(int(stub.TotalTransactionsCount), len(stub.Subsigs), func(i int, index int) error { - signedTxns[i].Msig.Subsigs = stub.Subsigs[index] - return nil - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructLsigs(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskLogic.iterate(int(stub.TotalTransactionsCount), len(stub.Logic), func(i int, index int) error { - signedTxns[i].Lsig.Logic = stub.Logic[index] - // fetch sig/msig - signedTxns[i].Lsig.Sig = signedTxns[i].Sig - signedTxns[i].Sig = crypto.Signature{} - signedTxns[i].Lsig.Msig = signedTxns[i].Msig - signedTxns[i].Msig = crypto.MultisigSig{} - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskLogicArgs.iterate(int(stub.TotalTransactionsCount), len(stub.LogicArgs), func(i int, index int) error { - signedTxns[i].Lsig.Args = stub.LogicArgs[index] - return nil - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructTransactions(signedTxns []transactions.SignedTxn, genesisID string, genesisHash crypto.Digest) (err error) { - err = stub.BitmaskTxType.iterate(int(stub.TotalTransactionsCount), len(stub.TxType)*2, func(i int, index int) error { - b, err := getNibble(stub.TxType, index) - if err != nil { - return err - } - signedTxns[i].Txn.Type = ByteToTxType(b) - return nil - }) - for i := range signedTxns { - if signedTxns[i].Txn.Type == "" { - signedTxns[i].Txn.Type = ByteToTxType(stub.TxTypeOffset) - } - } - if err != nil { - return err - } - - if err := stub.reconstructTxnHeader(signedTxns, genesisID, genesisHash); err != nil { - return fmt.Errorf("failed to reconstructTxnHeader: %w", err) - } - if err := stub.reconstructKeyregTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructKeyregTxnFields: %w", err) - } - if err := stub.reconstructPaymentTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructPaymentTxnFields: %w", err) - } - if err := stub.reconstructAssetConfigTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructAssetConfigTxnFields: %w", err) - } - if err := stub.reconstructAssetTransferTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructAssetTransferTxnFields: %w", err) - } - if err := stub.reconstructAssetFreezeTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructAssetFreezeTxnFields: %w", err) - } - if err := stub.reconstructApplicationCallTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructApplicationCallTxnFields: %w", err) - } - if err := stub.reconstructCompactCertTxnFields(signedTxns); err != nil { - return fmt.Errorf("failed to reconstructCompactCertTxnFields: %w", err) - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructTxnHeader(signedTxns []transactions.SignedTxn, genesisID string, genesisHash crypto.Digest) (err error) { - err = stub.BitmaskSender.iterate(int(stub.TotalTransactionsCount), len(stub.Sender)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Sender, signedTxns[i].Txn.Sender[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskFee.iterate(int(stub.TotalTransactionsCount), len(stub.Fee), func(i int, index int) error { - signedTxns[i].Txn.Fee = stub.Fee[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskFirstValid.iterate(int(stub.TotalTransactionsCount), len(stub.FirstValid), func(i int, index int) error { - signedTxns[i].Txn.FirstValid = stub.FirstValid[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskLastValid.iterate(int(stub.TotalTransactionsCount), len(stub.LastValid), func(i int, index int) error { - signedTxns[i].Txn.LastValid = stub.LastValid[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskNote.iterate(int(stub.TotalTransactionsCount), len(stub.Note), func(i int, index int) error { - signedTxns[i].Txn.Note = stub.Note[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskGenesisID.iterate(int(stub.TotalTransactionsCount), int(stub.TotalTransactionsCount), func(i int, index int) error { - signedTxns[i].Txn.GenesisID = genesisID - return nil - }) - if err != nil { - return err - } - for i := range signedTxns { - signedTxns[i].Txn.GenesisHash = genesisHash - } - err = stub.BitmaskLease.iterate(int(stub.TotalTransactionsCount), len(stub.Lease)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Lease, signedTxns[i].Txn.Lease[:], transactions.LeaseByteLength) - }) - if err != nil { - return err - } - err = stub.BitmaskRekeyTo.iterate(int(stub.TotalTransactionsCount), len(stub.RekeyTo)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.RekeyTo, signedTxns[i].Txn.RekeyTo[:], crypto.DigestSize) - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructKeyregTxnFields(signedTxns []transactions.SignedTxn) (err error) { - // should all have same number of elements - if len(stub.VotePK)/len(crypto.OneTimeSignatureVerifier{}) != len(stub.VoteKeyDilution) || len(stub.SelectionPK)/len(crypto.VRFVerifier{}) != len(stub.VoteKeyDilution) { - return errDataMissing - } - err = stub.BitmaskKeys.iterate(int(stub.TotalTransactionsCount), len(stub.VoteKeyDilution), func(i int, index int) error { - signedTxns[i].Txn.VoteKeyDilution = stub.VoteKeyDilution[index] - err := nextSlice(&stub.VotePK, signedTxns[i].Txn.VotePK[:], len(crypto.OneTimeSignatureVerifier{})) - if err != nil { - return err - } - return nextSlice(&stub.SelectionPK, signedTxns[i].Txn.SelectionPK[:], len(crypto.VRFVerifier{})) - }) - if err != nil { - return err - } - err = stub.BitmaskVoteFirst.iterate(int(stub.TotalTransactionsCount), len(stub.VoteFirst), func(i int, index int) error { - if index >= len(stub.VoteFirst) { - return errDataMissing - } - signedTxns[i].Txn.VoteFirst = stub.VoteFirst[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskVoteLast.iterate(int(stub.TotalTransactionsCount), len(stub.VoteLast), func(i int, index int) error { - if index >= len(stub.VoteLast) { - return errDataMissing - } - signedTxns[i].Txn.VoteLast = stub.VoteLast[index] - return nil - }) - if err != nil { - return err - } - - err = stub.BitmaskNonparticipation.iterate(int(stub.TotalTransactionsCount), int(stub.TotalTransactionsCount), func(i int, index int) error { - signedTxns[i].Txn.Nonparticipation = true - return nil - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructPaymentTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskReceiver.iterate(int(stub.TotalTransactionsCount), len(stub.Receiver)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Receiver, signedTxns[i].Txn.Receiver[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskAmount.iterate(int(stub.TotalTransactionsCount), len(stub.Amount), func(i int, index int) error { - signedTxns[i].Txn.Amount = stub.Amount[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskCloseRemainderTo.iterate(int(stub.TotalTransactionsCount), len(stub.CloseRemainderTo)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.CloseRemainderTo, signedTxns[i].Txn.CloseRemainderTo[:], crypto.DigestSize) - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructAssetConfigTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskConfigAsset.iterate(int(stub.TotalTransactionsCount), len(stub.ConfigAsset), func(i int, index int) error { - signedTxns[i].Txn.ConfigAsset = stub.ConfigAsset[index] - return nil - }) - if err != nil { - return err - } - return stub.reconstructAssetParams(signedTxns) -} - -func (stub *txGroupsEncodingStub) reconstructAssetParams(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskTotal.iterate(int(stub.TotalTransactionsCount), len(stub.Total), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.Total = stub.Total[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskDecimals.iterate(int(stub.TotalTransactionsCount), len(stub.Decimals), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.Decimals = stub.Decimals[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskDefaultFrozen.iterate(int(stub.TotalTransactionsCount), int(stub.TotalTransactionsCount), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.DefaultFrozen = true - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskUnitName.iterate(int(stub.TotalTransactionsCount), len(stub.UnitName), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.UnitName = stub.UnitName[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskAssetName.iterate(int(stub.TotalTransactionsCount), len(stub.AssetName), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.AssetName = stub.AssetName[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskURL.iterate(int(stub.TotalTransactionsCount), len(stub.URL), func(i int, index int) error { - signedTxns[i].Txn.AssetParams.URL = stub.URL[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskMetadataHash.iterate(int(stub.TotalTransactionsCount), len(stub.MetadataHash)/basics.MetadataHashLength, func(i int, index int) error { - return nextSlice(&stub.MetadataHash, signedTxns[i].Txn.AssetParams.MetadataHash[:], basics.MetadataHashLength) - }) - if err != nil { - return err - } - err = stub.BitmaskManager.iterate(int(stub.TotalTransactionsCount), len(stub.Manager)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Manager, signedTxns[i].Txn.AssetParams.Manager[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskReserve.iterate(int(stub.TotalTransactionsCount), len(stub.Reserve)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Reserve, signedTxns[i].Txn.AssetParams.Reserve[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskFreeze.iterate(int(stub.TotalTransactionsCount), len(stub.Freeze)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Freeze, signedTxns[i].Txn.AssetParams.Freeze[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskClawback.iterate(int(stub.TotalTransactionsCount), len(stub.Clawback)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.Clawback, signedTxns[i].Txn.AssetParams.Clawback[:], crypto.DigestSize) - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructAssetTransferTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskXferAsset.iterate(int(stub.TotalTransactionsCount), len(stub.XferAsset), func(i int, index int) error { - signedTxns[i].Txn.XferAsset = stub.XferAsset[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskAssetAmount.iterate(int(stub.TotalTransactionsCount), len(stub.AssetAmount), func(i int, index int) error { - signedTxns[i].Txn.AssetAmount = stub.AssetAmount[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskAssetSender.iterate(int(stub.TotalTransactionsCount), len(stub.AssetSender)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.AssetSender, signedTxns[i].Txn.AssetSender[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskAssetReceiver.iterate(int(stub.TotalTransactionsCount), len(stub.AssetReceiver)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.AssetReceiver, signedTxns[i].Txn.AssetReceiver[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskAssetCloseTo.iterate(int(stub.TotalTransactionsCount), len(stub.AssetCloseTo)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.AssetCloseTo, signedTxns[i].Txn.AssetCloseTo[:], crypto.DigestSize) - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructAssetFreezeTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskFreezeAccount.iterate(int(stub.TotalTransactionsCount), len(stub.FreezeAccount)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.FreezeAccount, signedTxns[i].Txn.FreezeAccount[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskFreezeAsset.iterate(int(stub.TotalTransactionsCount), len(stub.FreezeAsset), func(i int, index int) error { - signedTxns[i].Txn.FreezeAsset = stub.FreezeAsset[index] - return nil - }) - if err != nil { - return err - } - - err = stub.BitmaskAssetFrozen.iterate(int(stub.TotalTransactionsCount), int(stub.TotalTransactionsCount), func(i int, index int) error { - signedTxns[i].Txn.AssetFrozen = true - return nil - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructApplicationCallTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskApplicationID.iterate(int(stub.TotalTransactionsCount), len(stub.ApplicationID), func(i int, index int) error { - signedTxns[i].Txn.ApplicationID = stub.ApplicationID[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskOnCompletion.iterate(int(stub.TotalTransactionsCount), len(stub.OnCompletion)*2, func(i int, index int) error { - b, err := getNibble(stub.OnCompletion, index) - if err != nil { - return err - } - signedTxns[i].Txn.OnCompletion = transactions.OnCompletion(b) - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskApplicationArgs.iterate(int(stub.TotalTransactionsCount), len(stub.ApplicationArgs), func(i int, index int) error { - signedTxns[i].Txn.ApplicationArgs = stub.ApplicationArgs[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskAccounts.iterate(int(stub.TotalTransactionsCount), len(stub.Accounts), func(i int, index int) error { - signedTxns[i].Txn.Accounts = stub.Accounts[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskForeignApps.iterate(int(stub.TotalTransactionsCount), len(stub.ForeignApps), func(i int, index int) error { - signedTxns[i].Txn.ForeignApps = stub.ForeignApps[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskForeignAssets.iterate(int(stub.TotalTransactionsCount), len(stub.ForeignAssets), func(i int, index int) error { - signedTxns[i].Txn.ForeignAssets = stub.ForeignAssets[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskLocalNumUint.iterate(int(stub.TotalTransactionsCount), len(stub.LocalNumUint), func(i int, index int) error { - signedTxns[i].Txn.LocalStateSchema.NumUint = stub.LocalNumUint[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskLocalNumByteSlice.iterate(int(stub.TotalTransactionsCount), len(stub.LocalNumByteSlice), func(i int, index int) error { - signedTxns[i].Txn.LocalStateSchema.NumByteSlice = stub.LocalNumByteSlice[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskGlobalNumUint.iterate(int(stub.TotalTransactionsCount), len(stub.GlobalNumUint), func(i int, index int) error { - signedTxns[i].Txn.GlobalStateSchema.NumUint = stub.GlobalNumUint[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskGlobalNumByteSlice.iterate(int(stub.TotalTransactionsCount), len(stub.GlobalNumByteSlice), func(i int, index int) error { - signedTxns[i].Txn.GlobalStateSchema.NumByteSlice = stub.GlobalNumByteSlice[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskApprovalProgram.iterate(int(stub.TotalTransactionsCount), len(stub.ApprovalProgram), func(i int, index int) error { - signedTxns[i].Txn.ApprovalProgram = stub.ApprovalProgram[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskClearStateProgram.iterate(int(stub.TotalTransactionsCount), len(stub.ClearStateProgram), func(i int, index int) error { - signedTxns[i].Txn.ClearStateProgram = stub.ClearStateProgram[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskExtraProgramPages.iterate(int(stub.TotalTransactionsCount), len(stub.ExtraProgramPages), func(i int, index int) error { - signedTxns[i].Txn.ExtraProgramPages = stub.ExtraProgramPages[index] - return nil - }) - if err != nil { - return err - } - return nil -} - -func (stub *txGroupsEncodingStub) reconstructCompactCertTxnFields(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskCertRound.iterate(int(stub.TotalTransactionsCount), len(stub.CertRound), func(i int, index int) error { - signedTxns[i].Txn.CertRound = stub.CertRound[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskCertType.iterate(int(stub.TotalTransactionsCount), len(stub.CertType), func(i int, index int) error { - signedTxns[i].Txn.CertType = stub.CertType[index] - return nil - }) - if err != nil { - return err - } - return stub.reconstructCert(signedTxns) -} - -func (stub *txGroupsEncodingStub) reconstructCert(signedTxns []transactions.SignedTxn) (err error) { - err = stub.BitmaskSigCommit.iterate(int(stub.TotalTransactionsCount), len(stub.SigCommit)/crypto.DigestSize, func(i int, index int) error { - return nextSlice(&stub.SigCommit, signedTxns[i].Txn.Cert.SigCommit[:], crypto.DigestSize) - }) - if err != nil { - return err - } - err = stub.BitmaskSignedWeight.iterate(int(stub.TotalTransactionsCount), len(stub.SignedWeight), func(i int, index int) error { - signedTxns[i].Txn.Cert.SignedWeight = stub.SignedWeight[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskSigProofs.iterate(int(stub.TotalTransactionsCount), len(stub.SigProofs), func(i int, index int) error { - signedTxns[i].Txn.Cert.SigProofs = stub.SigProofs[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskPartProofs.iterate(int(stub.TotalTransactionsCount), len(stub.PartProofs), func(i int, index int) error { - signedTxns[i].Txn.Cert.PartProofs = stub.PartProofs[index] - return nil - }) - if err != nil { - return err - } - err = stub.BitmaskReveals.iterate(int(stub.TotalTransactionsCount), len(stub.Reveals), func(i int, index int) error { - signedTxns[i].Txn.Cert.Reveals = stub.Reveals[index] - return nil - }) - if err != nil { - return err - } - return nil -} diff --git a/txnsync/exchange.go b/txnsync/exchange.go deleted file mode 100644 index 38c232b4db..0000000000 --- a/txnsync/exchange.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" -) - -const txnBlockMessageVersion = 1 -const maxAcceptedMsgSeq = 64 - -// set in init() in service.go -var maxBloomFilterSize int -var maxEncodedTransactionGroupBytes int - -var maxProposalSize = 350000 - -type transactionBlockMessage struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Version int32 `codec:"v"` - Round basics.Round `codec:"r"` - TxnBloomFilter encodedBloomFilter `codec:"b"` - UpdatedRequestParams requestParams `codec:"p"` - TransactionGroups packedTransactionGroups `codec:"g"` - MsgSync timingParams `codec:"t"` - RelayedProposal relayedProposal `codec:"rp"` -} - -type encodedBloomFilter struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - BloomFilterType byte `codec:"t"` - EncodingParams requestParams `codec:"p"` - BloomFilter []byte `codec:"f,allocbound=maxBloomFilterSize"` - ClearPrevious byte `codec:"c"` -} - -type requestParams struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Offset byte `codec:"o"` - Modulator byte `codec:"m"` -} - -const ( - compressionFormatNone byte = iota - compressionFormatDeflate -) - -type packedTransactionGroups struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - Bytes []byte `codec:"g,allocbound=maxEncodedTransactionGroupBytes"` - CompressionFormat byte `codec:"c"` - LenDecompressedBytes uint64 `codec:"l"` -} - -type timingParams struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` //nolint:structcheck,unused - - RefTxnBlockMsgSeq uint64 `codec:"s"` - ResponseElapsedTime uint64 `codec:"r"` - AcceptedMsgSeq []uint64 `codec:"a,allocbound=maxAcceptedMsgSeq"` - NextMsgMinDelay uint64 `codec:"m"` -} - -const ( - noProposal byte = iota //nolint:deadcode,unused,varcheck - transactionsForProposal //nolint:deadcode,unused,varcheck -) - -type relayedProposal struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` - - RawBytes []byte `codec:"b,allocbound=maxProposalSize"` - ExcludeProposal crypto.Digest `codec:"e"` - Content byte `codec:"c"` -} diff --git a/txnsync/incoming.go b/txnsync/incoming.go deleted file mode 100644 index ce88e1a82b..0000000000 --- a/txnsync/incoming.go +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - "time" - - "github.com/algorand/go-algorand/data/pooldata" -) - -var ( - errUnsupportedTransactionSyncMessageVersion = errors.New("unsupported transaction sync message version") - errTransactionSyncIncomingMessageQueueFull = errors.New("transaction sync incoming message queue is full") - errInvalidBloomFilter = errors.New("invalid bloom filter") - errDecodingReceivedTransactionGroupsFailed = errors.New("failed to decode incoming transaction groups") -) - -type incomingMessage struct { - networkPeer interface{} - message transactionBlockMessage - sequenceNumber uint64 - peer *Peer - encodedSize int // the byte length of the incoming network message - bloomFilter *testableBloomFilter - transactionGroups []pooldata.SignedTxGroup - timeReceived int64 -} - -// incomingMessageHandler -// note - this message is called by the network go-routine dispatch pool, and is not synchronized with the rest of the transaction synchronizer -func (s *syncState) asyncIncomingMessageHandler(networkPeer interface{}, peer *Peer, message []byte, sequenceNumber uint64, receivedTimestamp int64) (err error) { - // increase number of incoming messages metric. - txsyncIncomingMessagesTotal.Inc(nil) - - // check the return value when we exit this function. if we fail, we increase the metric. - defer func() { - if err != nil { - // increase number of unprocessed incoming messages metric. - txsyncUnprocessedIncomingMessagesTotal.Inc(nil) - } - }() - - incomingMessage := incomingMessage{networkPeer: networkPeer, sequenceNumber: sequenceNumber, encodedSize: len(message), peer: peer, timeReceived: receivedTimestamp} - _, err = incomingMessage.message.UnmarshalMsg(message) - if err != nil { - // if we received a message that we cannot parse, disconnect. - s.log.Infof("received unparsable transaction sync message from peer. disconnecting from peer: %v, bytes: %d", err, len(message)) - s.incomingMessagesQ.erase(peer, networkPeer) - return err - } - - if incomingMessage.message.Version != txnBlockMessageVersion { - // we receive a message from a version that we don't support, disconnect. - s.log.Infof("received unsupported transaction sync message version from peer (%d). disconnecting from peer.", incomingMessage.message.Version) - s.incomingMessagesQ.erase(peer, networkPeer) - return errUnsupportedTransactionSyncMessageVersion - } - - // if the peer sent us a bloom filter, decode it - if !incomingMessage.message.TxnBloomFilter.MsgIsZero() { - bloomFilter, err := decodeBloomFilter(incomingMessage.message.TxnBloomFilter) - if err != nil { - s.log.Infof("Invalid bloom filter received from peer : %v", err) - s.incomingMessagesQ.erase(peer, networkPeer) - return errInvalidBloomFilter - } - incomingMessage.bloomFilter = bloomFilter - // increase number of decoded bloom filters. - txsyncDecodedBloomFiltersTotal.Inc(nil) - } - - // if the peer sent us any transactions, decode these. - incomingMessage.transactionGroups, err = decodeTransactionGroups(incomingMessage.message.TransactionGroups, s.genesisID, s.genesisHash) - if err != nil { - s.log.Infof("failed to decode received transactions groups: %v\n", err) - s.incomingMessagesQ.erase(peer, networkPeer) - return errDecodingReceivedTransactionGroupsFailed - } - - if peer == nil { - // if we don't have a peer, then we need to enqueue this task to be handled by the main loop since we want to ensure that - // all the peer objects are created synchronously. - enqueued := s.incomingMessagesQ.enqueue(incomingMessage) - if !enqueued { - // if we failed to enqueue, it means that the queue is full. Try to remove disconnected - // peers from the queue before re-attempting. - peers := s.node.GetPeers() - if s.incomingMessagesQ.prunePeers(peers) { - // if we were successful in removing at least a single peer, then try to add the entry again. - enqueued = s.incomingMessagesQ.enqueue(incomingMessage) - } - if !enqueued { - // if we can't enqueue that, return an error, which would disconnect the peer. - // ( we have to disconnect, since otherwise, we would have no way to synchronize the sequence number) - s.log.Infof("unable to enqueue incoming message from a peer without txsync allocated data; incoming messages queue is full. disconnecting from peer.") - s.incomingMessagesQ.erase(peer, networkPeer) - return errTransactionSyncIncomingMessageQueueFull - } - - } - return nil - } - // place the incoming message on the *peer* heap, allowing us to dequeue it in the order by which it was received by the network library. - err = peer.incomingMessages.enqueue(incomingMessage) - if err != nil { - // if the incoming message queue for this peer is full, disconnect from this peer. - s.log.Infof("unable to enqueue incoming message into peer incoming message backlog. disconnecting from peer.") - s.incomingMessagesQ.erase(peer, networkPeer) - return err - } - - // (maybe) place the peer message on the main queue. This would get skipped if the peer is already on the queue. - enqueued := s.incomingMessagesQ.enqueue(incomingMessage) - if !enqueued { - // if we failed to enqueue, it means that the queue is full. Try to remove disconnected - // peers from the queue before re-attempting. - peers := s.node.GetPeers() - if s.incomingMessagesQ.prunePeers(peers) { - // if we were successful in removing at least a single peer, then try to add the entry again. - enqueued = s.incomingMessagesQ.enqueue(incomingMessage) - } - if !enqueued { - // if we can't enqueue that, return an error, which would disconnect the peer. - s.log.Infof("unable to enqueue incoming message from a peer with txsync allocated data; incoming messages queue is full. disconnecting from peer.") - s.incomingMessagesQ.erase(peer, networkPeer) - return errTransactionSyncIncomingMessageQueueFull - } - } - return nil -} - -func (s *syncState) evaluateIncomingMessage(message incomingMessage) { - peer := message.peer - if peer == nil { - // check if a peer was created already for this network peer object. - peerInfo := s.node.GetPeer(message.networkPeer) - if peerInfo.NetworkPeer == nil { - // the message.networkPeer isn't a valid unicast peer, so we can exit right here. - return - } - if peerInfo.TxnSyncPeer == nil { - // we couldn't really do much about this message previously, since we didn't have the peer. - peer = makePeer(message.networkPeer, peerInfo.IsOutgoing, s.isRelay, &s.config, s.log, s.node.GetPeerLatency(message.networkPeer)) - // let the network peer object know about our peer - s.node.UpdatePeers([]*Peer{peer}, []interface{}{message.networkPeer}, 0) - } else { - peer = peerInfo.TxnSyncPeer - } - message.peer = peer - err := peer.incomingMessages.enqueue(message) - if err != nil { - // this is not really likely, since we won't saturate the peer heap right after creating it.. - return - } - } - - messageProcessed := false - transactionPoolSize := 0 - totalAccumulatedTransactionsCount := 0 // the number of transactions that were added during the execution of this method - transactionHandlerBacklogFull := false -incomingMessageLoop: - for { - incomingMsg, seq, err := peer.incomingMessages.popSequence(peer.nextReceivedMessageSeq) - switch err { - case errHeapEmpty: - // this is very likely, once we run out of consecutive messages. - break incomingMessageLoop - case errSequenceNumberMismatch: - // if we receive a message which wasn't in-order, just let it go. - s.log.Debugf("received message out of order; seq = %d, expecting seq = %d\n", seq, peer.nextReceivedMessageSeq) - break incomingMessageLoop - } - - // increase the message sequence number, since we're processing this message. - peer.nextReceivedMessageSeq++ - - // skip txnsync messages with proposalData for now - if !incomingMsg.message.RelayedProposal.MsgIsZero() { - continue - } - - // update the round number if needed. - if incomingMsg.message.Round > peer.lastRound { - peer.lastRound = incomingMsg.message.Round - } else if incomingMsg.message.Round < peer.lastRound { - // peer sent us message for an older round, *after* a new round ?! - continue - } - - // if the peer sent us a bloom filter, store this. - if incomingMsg.bloomFilter != nil { - peer.addIncomingBloomFilter(incomingMsg.message.Round, incomingMsg.bloomFilter, s.round) - } - - peer.updateRequestParams(incomingMsg.message.UpdatedRequestParams.Modulator, incomingMsg.message.UpdatedRequestParams.Offset) - timeInQueue := time.Duration(0) - if incomingMsg.timeReceived > 0 { - timeInQueue = time.Since(time.Unix(0, incomingMsg.timeReceived)) - } - peer.updateIncomingMessageTiming(incomingMsg.message.MsgSync, s.round, s.clock.Since(), timeInQueue, peer.cachedLatency, incomingMsg.encodedSize) - - // if the peer's round is more than a single round behind the local node, then we don't want to - // try and load the transactions. The other peer should first catch up before getting transactions. - if (peer.lastRound + 1) < s.round { - if s.config.EnableVerbosedTransactionSyncLogging { - s.log.Infof("Incoming Txsync #%d late round %d", seq, peer.lastRound) - } - continue - } - - // add the received transaction groups to the peer's recentSentTransactions so that we won't be sending these back to the peer. - peer.updateIncomingTransactionGroups(incomingMsg.transactionGroups) - - // before enqueuing more data to the transaction pool, make sure we flush the ack channel - peer.dequeuePendingTransactionPoolAckMessages() - - // if we received at least a single transaction group, then forward it to the transaction handler. - if len(incomingMsg.transactionGroups) > 0 { - // get the number of transactions ( not transaction groups !! ) from the transaction groups slice. - // this code is using the fact the we allocate all the transactions as a single array, and then slice - // them for the different transaction groups. The transaction handler would re-allocate the transactions that - // would be stored in the transaction pool. - totalTransactionCount := cap(incomingMsg.transactionGroups[0].Transactions) - - // send the incoming transaction group to the node last, so that the txhandler could modify the underlaying array if needed. - currentTransactionPoolSize := s.node.IncomingTransactionGroups(peer, peer.nextReceivedMessageSeq-1, incomingMsg.transactionGroups) - // was the call reached the transaction handler queue ? - if currentTransactionPoolSize >= 0 { - // we want to store in transactionPoolSize only the first call to IncomingTransactionGroups: - // when multiple IncomingTransactionGroups calls are made within this for-loop, we want to get the current transaction pool size, - // plus an estimate for the optimistic size after all the transaction groups would get added. For that purpose, it would be sufficient - // to get the transaction pool size once. The precise size of the transaction pool here is not critical - we use it only for the purpose - // of calculating the beta number as well as figure if the transaction pool is full or not ( both of them are range-based ). - if transactionPoolSize == 0 { - transactionPoolSize = currentTransactionPoolSize - } - // add the transactions count to the accumulated count. - totalAccumulatedTransactionsCount += totalTransactionCount - } else { - // no - we couldn't add this group since the transaction handler buffer backlog exceeded it's capacity. - transactionHandlerBacklogFull = true - } - } - - s.log.incomingMessage(msgStats{seq, incomingMsg.message.Round, len(incomingMsg.transactionGroups), incomingMsg.message.UpdatedRequestParams, len(incomingMsg.message.TxnBloomFilter.BloomFilter), incomingMsg.message.MsgSync.NextMsgMinDelay, peer.networkAddress()}) - messageProcessed = true - } - - // if we're a relay, this is an outgoing peer and we've processed a valid message, - // then we want to respond right away as well as schedule bloom message. - if messageProcessed && peer.isOutgoing && s.isRelay && peer.lastReceivedMessageNextMsgMinDelay != time.Duration(0) { - peer.state = peerStateStartup - // if we had another message coming from this peer previously, we need to ensure there are not scheduled tasks. - s.scheduler.peerDuration(peer) - - s.scheduler.schedulePeer(peer, s.clock.Since()) - } - if transactionPoolSize > 0 || transactionHandlerBacklogFull { - s.onTransactionPoolChangedEvent(MakeTransactionPoolChangeEvent(transactionPoolSize+totalAccumulatedTransactionsCount, transactionHandlerBacklogFull)) - } -} diff --git a/txnsync/incomingMsgQ.go b/txnsync/incomingMsgQ.go deleted file mode 100644 index aecb673bdd..0000000000 --- a/txnsync/incomingMsgQ.go +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "sync" - - "github.com/algorand/go-deadlock" -) - -// queuedMsgEntry used as a helper struct to manage the manipulation of incoming -// message queue. -type queuedMsgEntry struct { - msg incomingMessage - next *queuedMsgEntry - prev *queuedMsgEntry -} - -type queuedMsgList struct { - head *queuedMsgEntry -} - -// incomingMessageQueue manages the global incoming message queue across all the incoming peers. -type incomingMessageQueue struct { - outboundPeerCh chan incomingMessage - enqueuedPeersMap map[*Peer]*queuedMsgEntry - messages queuedMsgList - freelist queuedMsgList - enqueuedPeersMu deadlock.Mutex - enqueuedPeersCond *sync.Cond - shutdownRequest chan struct{} - shutdownConfirmed chan struct{} - deletePeersCh chan interface{} - peerlessCount int -} - -// maxPeersCount defines the maximum number of supported peers that can have their messages waiting -// in the incoming message queue at the same time. This number can be lower then the actual number of -// connected peers, as it's used only for pending messages. -const maxPeersCount = 2048 - -// maxPeerlessCount is the number of messages that we've received that doesn't have a Peer object allocated -// for them ( yet ) -const maxPeerlessCount = 512 - -// makeIncomingMessageQueue creates an incomingMessageQueue object and initializes all the internal variables. -func makeIncomingMessageQueue() *incomingMessageQueue { - imq := &incomingMessageQueue{ - outboundPeerCh: make(chan incomingMessage), - enqueuedPeersMap: make(map[*Peer]*queuedMsgEntry, maxPeersCount), - shutdownRequest: make(chan struct{}, 1), - shutdownConfirmed: make(chan struct{}, 1), - deletePeersCh: make(chan interface{}), - } - imq.enqueuedPeersCond = sync.NewCond(&imq.enqueuedPeersMu) - imq.freelist.initialize(maxPeersCount) - go imq.messagePump() - return imq -} - -// dequeueHead removes the first head message from the linked list. -func (ml *queuedMsgList) dequeueHead() (out *queuedMsgEntry) { - if ml.head == nil { - return nil - } - entry := ml.head - out = entry - if entry.next == entry { - ml.head = nil - return - } - entry.next.prev = entry.prev - entry.prev.next = entry.next - ml.head = entry.next - out.next = out - out.prev = out - return -} - -// initialize initializes a list to have msgCount entries. -func (ml *queuedMsgList) initialize(msgCount int) { - msgs := make([]queuedMsgEntry, msgCount) - for i := 0; i < msgCount; i++ { - msgs[i].next = &msgs[(i+1)%msgCount] - msgs[i].prev = &msgs[(i+msgCount-1)%msgCount] - } - ml.head = &msgs[0] -} - -// empty methods tests to see if the linked list is empty -func (ml *queuedMsgList) empty() bool { - return ml.head == nil -} - -// remove removes the given msg from the linked list. The method -// is written with the assumption that the given msg is known to be -// part of the linked list. -func (ml *queuedMsgList) remove(msg *queuedMsgEntry) { - if msg.next == msg { - ml.head = nil - return - } - msg.prev.next = msg.next - msg.next.prev = msg.prev - if ml.head == msg { - ml.head = msg.next - } - msg.prev = msg - msg.next = msg -} - -// filterRemove removes zero or more messages from the linked list, for which the given -// removeFunc returns true. The removed linked list entries are returned as a linked list. -func (ml *queuedMsgList) filterRemove(removeFunc func(*queuedMsgEntry) bool) *queuedMsgEntry { - if ml.empty() { - return nil - } - // do we have a single item ? - if ml.head.next == ml.head { - if removeFunc(ml.head) { - out := ml.head - ml.head = nil - return out - } - return nil - } - current := ml.head - last := ml.head.prev - var letGo queuedMsgList - for { - next := current.next - if removeFunc(current) { - ml.remove(current) - letGo.enqueueTail(current) - } - if current == last { - break - } - current = next - } - return letGo.head -} - -// enqueueTail adds to the current linked list another linked list whose head is msg. -func (ml *queuedMsgList) enqueueTail(msg *queuedMsgEntry) { - if ml.head == nil { - ml.head = msg - return - } else if msg == nil { - return - } - lastEntryOld := ml.head.prev - lastEntryNew := msg.prev - lastEntryOld.next = msg - ml.head.prev = lastEntryNew - msg.prev = lastEntryOld - lastEntryNew.next = ml.head -} - -// shutdown signals to the message pump to shut down and waits until the message pump goroutine -// aborts. -func (imq *incomingMessageQueue) shutdown() { - imq.enqueuedPeersMu.Lock() - close(imq.shutdownRequest) - imq.enqueuedPeersCond.Signal() - imq.enqueuedPeersMu.Unlock() - <-imq.shutdownConfirmed -} - -// messagePump is the incoming message queue message pump. It takes messages from the messages list -// and attempt to write these to the outboundPeerCh. -func (imq *incomingMessageQueue) messagePump() { - defer close(imq.shutdownConfirmed) - imq.enqueuedPeersMu.Lock() - defer imq.enqueuedPeersMu.Unlock() - - for { - // check if we need to shutdown. - select { - case <-imq.shutdownRequest: - return - default: - } - - // do we have any item to enqueue ? - if !imq.messages.empty() { - msgEntry := imq.messages.dequeueHead() - msg := msgEntry.msg - imq.freelist.enqueueTail(msgEntry) - if msg.peer != nil { - delete(imq.enqueuedPeersMap, msg.peer) - } else { - imq.peerlessCount-- - } - imq.enqueuedPeersMu.Unlock() - writeOutboundMessage: - select { - case imq.outboundPeerCh <- msg: - imq.enqueuedPeersMu.Lock() - continue - case <-imq.shutdownRequest: - imq.enqueuedPeersMu.Lock() - return - // see if this msg need to be delivered or not. - case droppedPeer := <-imq.deletePeersCh: - if msg.networkPeer == droppedPeer { - // we want to skip this message. - imq.enqueuedPeersMu.Lock() - continue - } - goto writeOutboundMessage - } - } - imq.enqueuedPeersCond.Wait() - } -} - -// getIncomingMessageChannel returns the incoming messages channel, which would contain entries once -// we have one ( or more ) pending incoming messages. -func (imq *incomingMessageQueue) getIncomingMessageChannel() <-chan incomingMessage { - return imq.outboundPeerCh -} - -// enqueue places the given message on the queue, if and only if it's associated peer doesn't -// appear on the incoming message queue already. In the case there is no peer, the message -// would be placed on the queue as is. -// The method returns false if the incoming message doesn't have it's peer on the queue and -// the method has failed to place the message on the queue. True is returned otherwise. -func (imq *incomingMessageQueue) enqueue(m incomingMessage) bool { - imq.enqueuedPeersMu.Lock() - defer imq.enqueuedPeersMu.Unlock() - if m.peer != nil { - if _, has := imq.enqueuedPeersMap[m.peer]; has { - return true - } - } else { - // do we have enough "room" for peerless messages ? - if imq.peerlessCount >= maxPeerlessCount { - return false - } - } - // do we have enough room in the message queue for the new message ? - if imq.freelist.empty() { - // no - we don't have enough room in the circular buffer. - return false - } - freeMsgEntry := imq.freelist.dequeueHead() - freeMsgEntry.msg = m - imq.messages.enqueueTail(freeMsgEntry) - // if we successfully enqueued the message, set the enqueuedPeersMap so that we won't enqueue the same peer twice. - if m.peer != nil { - imq.enqueuedPeersMap[m.peer] = freeMsgEntry - } else { - imq.peerlessCount++ - } - imq.enqueuedPeersCond.Signal() - return true -} - -// erase removes all the entries associated with the given network peer. -// this method isn't very efficient, and should be used only in cases where -// we disconnect from a peer and want to cleanup all the pending tasks associated -// with that peer. -func (imq *incomingMessageQueue) erase(peer *Peer, networkPeer interface{}) { - imq.enqueuedPeersMu.Lock() - - var peerMsgEntry *queuedMsgEntry - if peer == nil { - // lookup for a Peer object. - for peer, peerMsgEntry = range imq.enqueuedPeersMap { - if peer.networkPeer != networkPeer { - continue - } - break - } - } else { - var has bool - if peerMsgEntry, has = imq.enqueuedPeersMap[peer]; !has { - // the peer object is not in the map. - peer = nil - } - } - - if peer != nil { - delete(imq.enqueuedPeersMap, peer) - imq.messages.remove(peerMsgEntry) - imq.freelist.enqueueTail(peerMsgEntry) - imq.enqueuedPeersMu.Unlock() - select { - case imq.deletePeersCh <- networkPeer: - default: - } - return - } - - imq.removeMessageByNetworkPeer(networkPeer) - imq.enqueuedPeersMu.Unlock() - select { - case imq.deletePeersCh <- networkPeer: - default: - } -} - -// removeMessageByNetworkPeer removes the messages associated with the given network peer from the -// queue. -// note : the method expect that the enqueuedPeersMu lock would be taken. -func (imq *incomingMessageQueue) removeMessageByNetworkPeer(networkPeer interface{}) { - peerlessCount := 0 - removeByNetworkPeer := func(msg *queuedMsgEntry) bool { - if msg.msg.networkPeer == networkPeer { - if msg.msg.peer == nil { - peerlessCount++ - } - return true - } - return false - } - removeList := imq.messages.filterRemove(removeByNetworkPeer) - imq.freelist.enqueueTail(removeList) - imq.peerlessCount -= peerlessCount -} - -// prunePeers removes from the enqueuedMessages queue all the entries that are not provided in the -// given activePeers slice. -func (imq *incomingMessageQueue) prunePeers(activePeers []PeerInfo) (peerRemoved bool) { - activePeersMap := make(map[*Peer]bool) - activeNetworkPeersMap := make(map[interface{}]bool) - for _, activePeer := range activePeers { - if activePeer.TxnSyncPeer != nil { - activePeersMap[activePeer.TxnSyncPeer] = true - } - if activePeer.NetworkPeer != nil { - activeNetworkPeersMap[activePeer.NetworkPeer] = true - } - } - imq.enqueuedPeersMu.Lock() - defer imq.enqueuedPeersMu.Unlock() - peerlessCount := 0 - isPeerMissing := func(msg *queuedMsgEntry) bool { - if msg.msg.peer != nil { - if !activePeersMap[msg.msg.peer] { - return true - } - } - if !activeNetworkPeersMap[msg.msg.networkPeer] { - if msg.msg.peer == nil { - peerlessCount++ - } - return true - } - return false - } - removeList := imq.messages.filterRemove(isPeerMissing) - peerRemoved = removeList != nil - imq.freelist.enqueueTail(removeList) - imq.peerlessCount -= peerlessCount - return -} diff --git a/txnsync/incomingMsgQ_test.go b/txnsync/incomingMsgQ_test.go deleted file mode 100644 index 9ff1adf4b4..0000000000 --- a/txnsync/incomingMsgQ_test.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/test/partitiontest" -) - -// fillMessageQueue fills the message queue with the given message. -func (imq *incomingMessageQueue) fillMessageQueue(msg incomingMessage) { - imq.enqueuedPeersMu.Lock() - for i := 0; i < maxPeersCount; i++ { - msgEntry := imq.freelist.dequeueHead() - msgEntry.msg = msg - imq.messages.enqueueTail(msgEntry) - } - if msg.peer == nil { - imq.peerlessCount += maxPeersCount - } - imq.enqueuedPeersCond.Signal() - imq.enqueuedPeersMu.Unlock() - - // wait for a single message to be consumed by the message pump. - for { - imq.enqueuedPeersMu.Lock() - if !imq.freelist.empty() { - break - } - imq.enqueuedPeersMu.Unlock() - time.Sleep(time.Millisecond) - } - for !imq.freelist.empty() { - msgEntry := imq.freelist.dequeueHead() - msgEntry.msg = msg - imq.messages.enqueueTail(msgEntry) - } - imq.enqueuedPeersCond.Signal() - imq.enqueuedPeersMu.Unlock() -} - -// count counts teh number of messages in the list -func (ml *queuedMsgList) count() int { - first := ml.head - cur := first - count := 0 - for cur != nil { - next := cur.next - if next == first { - next = nil - } - count++ - cur = next - } - return count -} - -// validateLinking test to see the the entries in the list are correctly connected. -func (ml *queuedMsgList) validateLinking(t *testing.T) { - cur := ml.head - if cur == nil { - return - } - seen := make(map[*queuedMsgEntry]bool) - list := make([]*queuedMsgEntry, 0) - for { - if seen[cur] { - break - } - seen[cur] = true - require.NotNil(t, cur.prev) - require.NotNil(t, cur.next) - list = append(list, cur) - cur = cur.next - } - for i := range list { - require.Equal(t, list[i], list[(i+len(list)-1)%len(list)].next) - require.Equal(t, list[i], list[(i+1)%len(list)].prev) - } -} - -// TestMsgQCounts tests the message queue add/remove manipulations -func TestMsgQCounts(t *testing.T) { - partitiontest.PartitionTest(t) - - var list queuedMsgList - list.initialize(7) - list.validateLinking(t) - require.Equal(t, 7, list.count()) - list.dequeueHead() - list.validateLinking(t) - require.Equal(t, 6, list.count()) - var anotherList queuedMsgList - anotherList.initialize(4) - require.Equal(t, 4, anotherList.count()) - list.enqueueTail(anotherList.head) - list.validateLinking(t) - require.Equal(t, 10, list.count()) -} - -// TestMsgQFiltering tests the message queue filtering -func TestMsgQFiltering(t *testing.T) { - partitiontest.PartitionTest(t) - - item1 := &queuedMsgEntry{} - item2 := &queuedMsgEntry{} - item3 := &queuedMsgEntry{} - item1.next = item1 - item1.prev = item1 - item2.next = item2 - item2.prev = item2 - item3.next = item3 - item3.prev = item3 - - var list queuedMsgList - list.enqueueTail(item1) - list.enqueueTail(item2) - list.enqueueTail(item3) - - // test removing head. - removedItem1 := list.filterRemove(func(msg *queuedMsgEntry) bool { - return msg == item1 - }) - require.Equal(t, item1, removedItem1) - require.Equal(t, 2, list.count()) - - // test removing tail - removedItem3 := list.filterRemove(func(msg *queuedMsgEntry) bool { - return msg == item3 - }) - require.Equal(t, item3, removedItem3) - require.Equal(t, 1, list.count()) - - // test removing last item - removedItem2 := list.filterRemove(func(msg *queuedMsgEntry) bool { - return msg == item2 - }) - require.Equal(t, item2, removedItem2) - require.True(t, list.empty()) -} diff --git a/txnsync/incoming_test.go b/txnsync/incoming_test.go deleted file mode 100644 index 978a1c4cae..0000000000 --- a/txnsync/incoming_test.go +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/msgp/msgp" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/test/partitiontest" -) - -type incomingLogger struct { - logging.Logger - lastLogged string -} - -func (ml *incomingLogger) Debugf(format string, args ...interface{}) { - ml.lastLogged = fmt.Sprintf(format, args...) -} - -func (ml *incomingLogger) Infof(format string, args ...interface{}) { - ml.lastLogged = fmt.Sprintf(format, args...) -} - -func TestAsyncIncomingMessageHandlerAndErrors(t *testing.T) { - partitiontest.PartitionTest(t) - - message := transactionBlockMessage{Version: 1} - messageBytes := message.MarshalMsg(nil) - sequenceNumber := uint64(1) - incLogger := incomingLogger{} - - cfg := config.GetDefaultLocal() - mNodeConnector := &mockNodeConnector{transactionPoolSize: 3} - s := syncState{ - log: wrapLogger(&incLogger, &cfg), - node: mNodeConnector, - clock: mNodeConnector.Clock(), - incomingMessagesQ: makeIncomingMessageQueue(), - } - - // expect UnmarshalMsg error - messageBytes[0] = 0 - err := s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - msgpe := msgp.TypeError{} - require.True(t, errors.As(err, &msgpe)) - - // expect wrong version error - message = transactionBlockMessage{Version: -3} - messageBytes = message.MarshalMsg(nil) - err = s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - require.Equal(t, errUnsupportedTransactionSyncMessageVersion, err) - - // expect error decoding bloomFilter - message.Version = 1 - message.TxnBloomFilter.BloomFilterType = byte(multiHashBloomFilter) - messageBytes = message.MarshalMsg(nil) - err = s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - require.Equal(t, errInvalidBloomFilter, err) - - // error decoding transaction groups - message.TxnBloomFilter.BloomFilterType = byte(xorBloomFilter32) - bf, _ := filterFactoryXor32(1, &s) - bf.Set([]byte("aoeu1234aoeu1234")) - message.TxnBloomFilter.BloomFilter, err = bf.MarshalBinary() - require.NoError(t, err) - message.TransactionGroups = packedTransactionGroups{Bytes: []byte{1}} - messageBytes = message.MarshalMsg(nil) - err = s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - require.Equal(t, errDecodingReceivedTransactionGroupsFailed, err) - s.incomingMessagesQ.shutdown() - - peer := Peer{networkPeer: &s} - - // error queue full - message.TransactionGroups = packedTransactionGroups{} - messageBytes = message.MarshalMsg(nil) - s.incomingMessagesQ = makeIncomingMessageQueue() - s.incomingMessagesQ.fillMessageQueue(incomingMessage{peer: &peer, networkPeer: &s.incomingMessagesQ}) - mNodeConnector.peers = append(mNodeConnector.peers, PeerInfo{TxnSyncPeer: &peer, NetworkPeer: &s.incomingMessagesQ}) - err = s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - require.Equal(t, errTransactionSyncIncomingMessageQueueFull, err) - s.incomingMessagesQ.shutdown() - - // Success where peer == nil - s.incomingMessagesQ = makeIncomingMessageQueue() - err = s.asyncIncomingMessageHandler(nil, nil, messageBytes, sequenceNumber, 0) - require.NoError(t, err) - s.incomingMessagesQ.shutdown() - - // error when placing the peer message on the main queue (incomingMessages cannot accept messages) - s.incomingMessagesQ = makeIncomingMessageQueue() - s.incomingMessagesQ.fillMessageQueue(incomingMessage{peer: nil, networkPeer: &s}) - mNodeConnector.peers = append(mNodeConnector.peers, PeerInfo{NetworkPeer: &s}) - - err = s.asyncIncomingMessageHandler(nil, &peer, messageBytes, sequenceNumber, 0) - require.Equal(t, errTransactionSyncIncomingMessageQueueFull, err) - s.incomingMessagesQ.shutdown() - - s.incomingMessagesQ = makeIncomingMessageQueue() - err = nil - // fill up the incoming message queue (one was already added) - for x := 1; x <= messageOrderingHeapLimit; x++ { - require.NoError(t, err) - err = s.asyncIncomingMessageHandler(nil, &peer, messageBytes, sequenceNumber, 0) - } - require.Equal(t, errHeapReachedCapacity, err) - s.incomingMessagesQ.shutdown() -} - -func TestEvaluateIncomingMessagePart1(t *testing.T) { - partitiontest.PartitionTest(t) - - message := incomingMessage{} - cfg := config.GetDefaultLocal() - peer := &Peer{} - - incLogger := incomingLogger{} - - mNodeConnector := &mockNodeConnector{} - mNodeConnector.peerInfo = PeerInfo{} - s := syncState{ - node: mNodeConnector, - log: wrapLogger(&incLogger, &cfg), - clock: mNodeConnector.Clock()} - - // Test the cases inside the peer == nil condition - - // the message.networkPeer isn't a valid unicast peer - s.evaluateIncomingMessage(message) - - // peer was already created - mNodeConnector.peerInfo.NetworkPeer = peer - - s.evaluateIncomingMessage(message) - // no TxnSyncPeer in peerInfo - require.True(t, mNodeConnector.updatingPeers) - mNodeConnector.updatingPeers = false - - s.incomingMessagesQ = makeIncomingMessageQueue() - defer s.incomingMessagesQ.shutdown() - message.peer = peer - require.True(t, s.incomingMessagesQ.enqueue(message)) - mNodeConnector.peerInfo.TxnSyncPeer = peer - peer.incomingMessages = messageOrderingHeap{} - // TxnSyncPeer in peerInfo - s.evaluateIncomingMessage(message) - require.False(t, mNodeConnector.updatingPeers) - <-s.incomingMessagesQ.getIncomingMessageChannel() - _, found := s.incomingMessagesQ.enqueuedPeersMap[peer] - require.False(t, found) - - // fill the heap with messageOrderingHeapLimit elements so that the incomingMessages enqueue fails - message.networkPeer = &s - message.peer = nil - for x := 0; x < messageOrderingHeapLimit; x++ { - err := peer.incomingMessages.enqueue(message) - require.NoError(t, err) - } - mNodeConnector.peers = []PeerInfo{{TxnSyncPeer: peer, NetworkPeer: &s}} - // TxnSyncPeer in peerInfo - s.evaluateIncomingMessage(message) - require.False(t, mNodeConnector.updatingPeers) -} - -func TestEvaluateIncomingMessagePart2(t *testing.T) { - partitiontest.PartitionTest(t) - - cfg := config.GetDefaultLocal() - cfg.EnableVerbosedTransactionSyncLogging = true - peer := &Peer{} - - incLogger := incomingLogger{} - - mNodeConnector := &mockNodeConnector{transactionPoolSize: 3} - mNodeConnector.peerInfo = PeerInfo{NetworkPeer: peer} - - s := syncState{ - node: mNodeConnector, - log: wrapLogger(&incLogger, &cfg), - clock: mNodeConnector.Clock()} - - // Test the branches in the for loop - - mNodeConnector.peerInfo.TxnSyncPeer = peer - peer.incomingMessages = messageOrderingHeap{} - - // txnsync messages with proposalData - err := peer.incomingMessages.enqueue( - incomingMessage{ - sequenceNumber: 0, - message: transactionBlockMessage{ - RelayedProposal: relayedProposal{Content: 10}}}) - require.NoError(t, err) - - // update the round number - err = peer.incomingMessages.enqueue( - incomingMessage{ - sequenceNumber: 1, - message: transactionBlockMessage{Round: 4}}) - require.NoError(t, err) - - // peer sent a message for an older round, *after* a new round - err = peer.incomingMessages.enqueue( - incomingMessage{ - sequenceNumber: 2, - message: transactionBlockMessage{Round: 2}}) - require.NoError(t, err) - - // peer sends a bloom filter - err = peer.incomingMessages.enqueue( - incomingMessage{ - sequenceNumber: 3, - bloomFilter: &testableBloomFilter{encodingParams: requestParams{Offset: 8}}, - message: transactionBlockMessage{Round: 4}}) - require.NoError(t, err) - - // message with a transaction group - err = peer.incomingMessages.enqueue( - incomingMessage{ - sequenceNumber: 4, - transactionGroups: []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - transactions.SignedTxn{}}}}, - message: transactionBlockMessage{Round: 4}}) - require.NoError(t, err) - peer.recentSentTransactions = makeTransactionCache(5, 10, 20) - - // receive a message not in order - s.evaluateIncomingMessage(incomingMessage{sequenceNumber: 11}) - require.Equal(t, "received message out of order; seq = 11, expecting seq = 5\n", incLogger.lastLogged) - require.Equal(t, uint8(8), peer.recentIncomingBloomFilters[0].filter.encodingParams.Offset) - - // currentTransactionPoolSize is -1 - peer.incomingMessages = messageOrderingHeap{} - mNodeConnector.transactionPoolSize = -1 - s.evaluateIncomingMessage(incomingMessage{ - sequenceNumber: 5, - message: transactionBlockMessage{Round: 5}, - transactionGroups: []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - transactions.SignedTxn{}}}}, - }) - require.Equal(t, "Incoming Txsync #5 round 5 transactions 1 request [0/0] bloom 0 nextTS 0 from ''", incLogger.lastLogged) - -} - -func TestEvaluateIncomingMessagePart3(t *testing.T) { - partitiontest.PartitionTest(t) - - cfg := config.GetDefaultLocal() - cfg.EnableVerbosedTransactionSyncLogging = true - peer := &Peer{isOutgoing: true, lastReceivedMessageNextMsgMinDelay: time.Duration(3)} - - incLogger := incomingLogger{} - - mNodeConnector := &mockNodeConnector{} - mNodeConnector.peerInfo = PeerInfo{NetworkPeer: peer} - mNodeConnector.peerInfo.TxnSyncPeer = peer - - s := syncState{ - node: mNodeConnector, - log: wrapLogger(&incLogger, &cfg), - clock: mNodeConnector.Clock(), - round: 1, - config: cfg, - isRelay: true, - scheduler: makePeerScheduler(), - } - - // the peer will be added to s.scheduler - s.evaluateIncomingMessage(incomingMessage{ - sequenceNumber: 0, - message: transactionBlockMessage{ - MsgSync: timingParams{ - NextMsgMinDelay: 3}}}) - require.Equal(t, 1, len(s.scheduler.peers)) - - s.round = 3 - s.evaluateIncomingMessage(incomingMessage{ - sequenceNumber: 1, - message: transactionBlockMessage{ - MsgSync: timingParams{ - NextMsgMinDelay: 3}}}) - - require.Equal(t, "Incoming Txsync #1 late round 0", incLogger.lastLogged) -} - -func TestEvaluateIncomingMessageAccumulatedTransactionsCount(t *testing.T) { - partitiontest.PartitionTest(t) - - cfg := config.GetDefaultLocal() - cfg.EnableVerbosedTransactionSyncLogging = true - peer := &Peer{} - peer.recentSentTransactions = makeTransactionCache(5, 10, 20) - incLogger := incomingLogger{} - - mNodeConnector := &mockNodeConnector{transactionPoolSize: 3} - mNodeConnector.peerInfo = PeerInfo{NetworkPeer: peer} - - s := syncState{ - node: mNodeConnector, - log: wrapLogger(&incLogger, &cfg), - clock: mNodeConnector.Clock()} - - mNodeConnector.peerInfo.TxnSyncPeer = peer - peer.incomingMessages = messageOrderingHeap{} - - genesisID := "gID" - genesisHash := crypto.Hash([]byte("gh")) - txnGroups := getTxnGroups(genesisHash, genesisID) - - // test with more than 200 transactions in the txnGroups - for x := 0; x < 100; x++ { - t := getTxnGroups(genesisHash, genesisID) - txnGroups = append(txnGroups, t...) - } - - ptg, err := s.encodeTransactionGroups(txnGroups, 1000000000) - require.NoError(t, err) - txGroups, err := decodeTransactionGroups(ptg, genesisID, genesisHash) - require.NoError(t, err) - - s.evaluateIncomingMessage(incomingMessage{ - sequenceNumber: 0, - message: transactionBlockMessage{Round: 5}, - transactionGroups: txGroups, - }) - require.Equal(t, time.Duration(115586426), s.lastBeta) -} diff --git a/txnsync/interfaces.go b/txnsync/interfaces.go deleted file mode 100644 index 77ac07163f..0000000000 --- a/txnsync/interfaces.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "time" - - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/util/timers" -) - -//msgp:ignore eventType -type eventType int - -const ( - transactionPoolChangedEvent eventType = 1 - newRoundEvent eventType = 2 -) - -// RoundSettings is used to communicate the transaction syncer setting for a specific round -type RoundSettings struct { - Round basics.Round - FetchTransactions bool // for non-relays that has no participation keys, there is no need to request transactions -} - -// Event is an external triggering event -type Event struct { - eventType - - transactionPoolSize int - roundSettings RoundSettings - transactionHandlerBacklogFull bool -} - -// IncomingMessageHandler is the signature of the incoming message handler used by the transaction sync to receive network messages -type IncomingMessageHandler func(networkPeer interface{}, peer *Peer, message []byte, sequenceNumber uint64, receivedTimestamp int64) error - -// SendMessageCallback define a message sent feedback for performing message tracking -type SendMessageCallback func(enqueued bool, sequenceNumber uint64) error - -// PeerInfo describes a single peer returned by GetPeers or GetPeer -type PeerInfo struct { - TxnSyncPeer *Peer - NetworkPeer interface{} - IsOutgoing bool -} - -// networkPeerAddress is a subset of the network package HTTPPeer and UnicastPeer interface that -// provides feedback for the destination address. It's used for logging out packet's destination addresses. -type networkPeerAddress interface { - GetAddress() string -} - -// NodeConnector is used by the transaction sync for communicating with components external to the txnsync package. -type NodeConnector interface { - Events() <-chan Event - GetCurrentRoundSettings() RoundSettings // return the current round settings from the node - Clock() timers.WallClock - Random(uint64) uint64 - GetPeers() []PeerInfo - GetPeer(interface{}) PeerInfo // get a single peer given a network peer opaque interface - // UpdatePeers call is being made to inform the node that either a link need to be established - // between the set of the txsyncPeers peers and the set of netPeers, or that the peersAverageDataExchangeRate - // was recalculated and could potentially be updated. - // The peersAverageDataExchangeRate passed in here is the average communication rate ( measured in bytes per second ) - // across all the connected peers. - UpdatePeers(txsyncPeers []*Peer, netPeers []interface{}, peersAverageDataExchangeRate uint64) - SendPeerMessage(netPeer interface{}, msg []byte, callback SendMessageCallback) - GetPeerLatency(netPeer interface{}) time.Duration - // GetPendingTransactionGroups is called by the transaction sync when it needs to look into the transaction - // pool and get the updated set of pending transactions. The second returned argument is the latest locally originated - // group counter within the given transaction groups list. If there is no group that is locally originated, the expected - // value is InvalidSignedTxGroupCounter. - GetPendingTransactionGroups() (txGroups []pooldata.SignedTxGroup, latestLocallyOriginatedGroupCounter uint64) - // IncomingTransactionGroups is called by the transaction sync when transactions have been received and need - // to be stored in the transaction pool. The method returns the number of transactions in the transaction - // pool before the txGroups is applied. A negative value is returned if the provided txGroups could not be applied - // to the transaction pool. - IncomingTransactionGroups(peer *Peer, messageSeq uint64, txGroups []pooldata.SignedTxGroup) (transactionPoolSize int) - NotifyMonitor() chan struct{} -} - -// MakeTransactionPoolChangeEvent creates an event for when a txn pool size has changed. -func MakeTransactionPoolChangeEvent(transactionPoolSize int, transactionHandlerBacklogFull bool) Event { - return Event{ - eventType: transactionPoolChangedEvent, - transactionPoolSize: transactionPoolSize, - transactionHandlerBacklogFull: transactionHandlerBacklogFull, - } -} - -// MakeNewRoundEvent creates an event for when a new round starts -func MakeNewRoundEvent(roundNumber basics.Round, fetchTransactions bool) Event { - return Event{ - eventType: newRoundEvent, - roundSettings: RoundSettings{ - Round: roundNumber, - FetchTransactions: fetchTransactions, - }, - } -} diff --git a/txnsync/logger.go b/txnsync/logger.go deleted file mode 100644 index 8023871684..0000000000 --- a/txnsync/logger.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/logging" -) - -// make a local alias of the type so that we can refer to it without '.' -type algodlogger = logging.Logger - -type msgStats struct { - sequenceNumber uint64 - round basics.Round - transactions int - offsetModulator requestParams - bloomSize int - nextMsgMinDelay uint64 - peerAddress string -} - -type msgLogger interface { - outgoingMessage(mstat msgStats) - incomingMessage(mstat msgStats) -} - -// Logger is go-algorand/logging.Logger with some private additions for txnsync -type Logger interface { - logging.Logger - msgLogger -} - -type basicMsgLogger struct { - algodlogger - config *config.Local -} - -func wrapLogger(l logging.Logger, config *config.Local) Logger { - if ll, ok := l.(Logger); ok { - return ll - } - out := &basicMsgLogger{ - algodlogger: l, - config: config, - } - return out -} - -func (l *basicMsgLogger) logMessage(mstat msgStats, mode, tofrom string) { - if !l.config.EnableVerbosedTransactionSyncLogging { - return - } - l.Infof( - "%s Txsync #%d round %d transactions %d request [%d/%d] bloom %d nextTS %d %s '%s'", - mode, - mstat.sequenceNumber, - mstat.round, - mstat.transactions, - mstat.offsetModulator.Offset, - mstat.offsetModulator.Modulator, - mstat.bloomSize, - mstat.nextMsgMinDelay, - tofrom, - mstat.peerAddress, - ) -} -func (l *basicMsgLogger) outgoingMessage(mstat msgStats) { - l.logMessage(mstat, "Outgoing", "to") -} -func (l *basicMsgLogger) incomingMessage(mstat msgStats) { - l.logMessage(mstat, "Incoming", "from") -} diff --git a/txnsync/mainloop.go b/txnsync/mainloop.go deleted file mode 100644 index 138206be0f..0000000000 --- a/txnsync/mainloop.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "math" - "sync" - "time" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/util/bloom" - "github.com/algorand/go-algorand/util/execpool" - "github.com/algorand/go-algorand/util/timers" -) - -const ( - kickoffTime = 200 * time.Millisecond - randomRange = 100 * time.Millisecond - sendMessagesTime = 10 * time.Millisecond - - // transactionPoolLowWatermark is the low watermark for the transaction pool, relative - // to the transaction pool size. When the number of transactions in the transaction pool - // drops below this value, the transactionPoolFull flag would get cleared. - transactionPoolLowWatermark = float32(0.8) - - // transactionPoolHighWatermark is the low watermark for the transaction pool, relative - // to the transaction pool size. When the number of transactions in the transaction pool - // grows beyond this value, the transactionPoolFull flag would get set. - transactionPoolHighWatermark = float32(0.9) - - // betaGranularChangeThreshold defined the difference threshold for changing the beta value. - // Changes to the beta value only takes effect once the difference is sufficiently big enough - // comared to the current beta value. - betaGranularChangeThreshold = 0.1 -) - -type syncState struct { - service *Service - log Logger - node NodeConnector - isRelay bool - clock timers.WallClock - config config.Local - threadpool execpool.BacklogPool - - genesisID string - genesisHash crypto.Digest - - // lastBeta is the last beta value that was calculated for this node - lastBeta time.Duration - round basics.Round - fetchTransactions bool - scheduler peerScheduler - interruptablePeers []*Peer - interruptablePeersMap map[*Peer]int // map a peer into the index of interruptablePeers - incomingMessagesQ *incomingMessageQueue - outgoingMessagesCallbackCh chan sentMessageMetadata - nextOffsetRollingCh <-chan time.Time - requestsOffset uint64 - - // The lastBloomFilter allows us to share the same bloom filter across multiples messages, - // and compute it only once. Since this bloom filter could contain many hashes ( especially on relays ) - // it's important to avoid recomputing it needlessly. - lastBloomFilter bloomFilter - - // The profiler helps us monitor the transaction sync components execution time. When enabled, it would report these - // to the telemetry. - profiler *profiler - - // transactionPoolFull indicates whether the transaction pool is currently in "full" state or not. While the transaction - // pool is full, a node would not ask any of the other peers for additional transactions. - transactionPoolFull bool - - // messageSendWaitGroup coordinates the messages that are being sent to the network. Before aborting the mainloop, we want to make - // sure there are no outbound messages that are waiting to be sent to the network ( i.e. that all the tasks that we enqueued to the - // execution pool were completed ). This does not include the time where the message spent while waiting on the network queue itself. - messageSendWaitGroup sync.WaitGroup - - xorBuilder bloom.XorBuilder -} - -func (s *syncState) mainloop(serviceCtx context.Context, wg *sync.WaitGroup) { - defer wg.Done() - defer s.messageSendWaitGroup.Wait() - - // The following would allow the emulator to start the service in a "stopped" mode. - s.node.NotifyMonitor() - - s.clock = s.node.Clock() - s.incomingMessagesQ = makeIncomingMessageQueue() - defer s.incomingMessagesQ.shutdown() - s.outgoingMessagesCallbackCh = make(chan sentMessageMetadata, 1024) - s.interruptablePeersMap = make(map[*Peer]int) - s.scheduler.node = s.node - s.lastBeta = beta(0) - roundSettings := s.node.GetCurrentRoundSettings() - s.onNewRoundEvent(MakeNewRoundEvent(roundSettings.Round, roundSettings.FetchTransactions)) - - // create a profiler, and its profiling elements. - s.profiler = makeProfiler(200*time.Millisecond, s.clock, s.log, 2000*time.Millisecond) // todo : make the time configurable. - profIdle := s.profiler.getElement(profElementIdle) - profTxChange := s.profiler.getElement(profElementTxChange) - profNewRounnd := s.profiler.getElement(profElementNewRound) - profPeerState := s.profiler.getElement(profElementPeerState) - profIncomingMsg := s.profiler.getElement(profElementIncomingMsg) - profOutgoingMsg := s.profiler.getElement(profElementOutgoingMsg) - profNextOffset := s.profiler.getElement(profElementNextOffset) - - externalEvents := s.node.Events() - var nextPeerStateCh <-chan time.Time - for { - nextPeerStateTime := s.scheduler.nextDuration() - if nextPeerStateTime != time.Duration(0) { - nextPeerStateCh = s.clock.TimeoutAt(nextPeerStateTime) - } else { - nextPeerStateCh = nil - } - - select { - case ent := <-externalEvents: - switch ent.eventType { - case transactionPoolChangedEvent: - profTxChange.start() - s.onTransactionPoolChangedEvent(ent) - profTxChange.end() - case newRoundEvent: - profNewRounnd.start() - s.onNewRoundEvent(ent) - profNewRounnd.end() - } - continue - case <-nextPeerStateCh: - profPeerState.start() - s.evaluatePeerStateChanges(nextPeerStateTime) - profPeerState.end() - continue - case incomingMsg := <-s.incomingMessagesQ.getIncomingMessageChannel(): - profIncomingMsg.start() - s.evaluateIncomingMessage(incomingMsg) - profIncomingMsg.end() - continue - case msgSent := <-s.outgoingMessagesCallbackCh: - profOutgoingMsg.start() - s.evaluateOutgoingMessage(msgSent) - profOutgoingMsg.end() - continue - case <-s.nextOffsetRollingCh: - profNextOffset.start() - s.rollOffsets() - profNextOffset.end() - continue - case <-serviceCtx.Done(): - return - default: - } - - profIdle.start() - select { - case ent := <-externalEvents: - profIdle.end() - switch ent.eventType { - case transactionPoolChangedEvent: - profTxChange.start() - s.onTransactionPoolChangedEvent(ent) - profTxChange.end() - case newRoundEvent: - profNewRounnd.start() - s.onNewRoundEvent(ent) - profNewRounnd.end() - } - case <-nextPeerStateCh: - profIdle.end() - profPeerState.start() - s.evaluatePeerStateChanges(nextPeerStateTime) - profPeerState.end() - case incomingMsg := <-s.incomingMessagesQ.getIncomingMessageChannel(): - profIdle.end() - profIncomingMsg.start() - s.evaluateIncomingMessage(incomingMsg) - profIncomingMsg.end() - case msgSent := <-s.outgoingMessagesCallbackCh: - profIdle.end() - profOutgoingMsg.start() - s.evaluateOutgoingMessage(msgSent) - profOutgoingMsg.end() - case <-s.nextOffsetRollingCh: - profIdle.end() - profNextOffset.start() - s.rollOffsets() - profNextOffset.end() - case <-serviceCtx.Done(): - profIdle.end() - return - case <-s.node.NotifyMonitor(): - profIdle.end() - } - } -} - -func (s *syncState) onTransactionPoolChangedEvent(ent Event) { - if ent.transactionHandlerBacklogFull { - // if the transaction handler backlog is full, we don't want to receive any more transactions. - // setting the transactionPoolFull here would notify other nodes that we don't want any more messages. - s.transactionPoolFull = true - } else if s.transactionPoolFull { - // the transaction pool is currently full. - if float32(ent.transactionPoolSize) < float32(s.config.TxPoolSize)*transactionPoolLowWatermark { - s.transactionPoolFull = false - } - } else { - if float32(ent.transactionPoolSize) > float32(s.config.TxPoolSize)*transactionPoolHighWatermark { - s.transactionPoolFull = true - } - } - - newBeta := beta(ent.transactionPoolSize) - - // check if beta should be updated - if !shouldUpdateBeta(s.lastBeta, newBeta, betaGranularChangeThreshold) { - // no changes - return - } - // yes, change beta as the number of transactions in the pool have changed dramatically since the last time. - s.lastBeta = newBeta - - peers := make([]*Peer, 0, len(s.interruptablePeers)) - for _, peer := range s.interruptablePeers { - if peer == nil { - continue - } - peers = append(peers, peer) - peer.state = peerStateHoldsoff - } - - // reset the interruptablePeers array, since all it's members were made into holdsoff - s.interruptablePeers = nil - s.interruptablePeersMap = make(map[*Peer]int) - deadlineMonitor := s.clock.DeadlineMonitorAt(s.clock.Since() + sendMessagesTime) - s.sendMessageLoop(s.clock.Since(), deadlineMonitor, peers) - - currentTimeout := s.clock.Since() - for _, peer := range peers { - peerNext := s.scheduler.peerDuration(peer) - if peerNext < currentTimeout { - // shouldn't be, but let's reschedule it if this is the case. - s.scheduler.schedulePeer(peer, currentTimeout+s.lastBeta) - continue - } - // given that peerNext is after currentTimeout, find out what's the difference, and divide by the beta. - betaCount := (peerNext - currentTimeout) / s.lastBeta - peerNext = currentTimeout + s.lastBeta*betaCount - s.scheduler.schedulePeer(peer, peerNext) - } -} - -// calculate the beta parameter, based on the transaction pool size. -func beta(txPoolSize int) time.Duration { - if txPoolSize < 200 { - txPoolSize = 200 - } else if txPoolSize > 10000 { - txPoolSize = 10000 - } - beta := 1.0 / (2 * 3.6923 * math.Exp(float64(txPoolSize)*0.00026)) - return time.Duration(float64(time.Second) * beta) - -} - -func shouldUpdateBeta(currentBeta, newBeta time.Duration, betaGranularChangeThreshold float32) bool { - // see if the newBeta is at least threshold percent smaller or bigger than the current one - if float32(newBeta) >= (float32(currentBeta) * (1.0 + betaGranularChangeThreshold)) { - return true - } - if float32(newBeta) <= (float32(currentBeta) * (1.0 - betaGranularChangeThreshold)) { - return true - } - // no, it's not. - return false -} - -func (s *syncState) onNewRoundEvent(ent Event) { - s.clock = s.clock.Zero().(timers.WallClock) - peers := s.getPeers() - newRoundPeers := peers - if s.isRelay { - // on relays, outgoing peers have a difference scheduling, which is based on the incoming message timing - // rather then a periodic message transmission. - newRoundPeers = incomingPeersOnly(newRoundPeers) - } - s.scheduler.scheduleNewRound(newRoundPeers) - s.round = ent.roundSettings.Round - s.fetchTransactions = ent.roundSettings.FetchTransactions - if !s.isRelay { - s.nextOffsetRollingCh = s.clock.TimeoutAt(kickoffTime + 2*s.lastBeta) - } - s.updatePeersLatency(peers) - s.updatePeersRequestParams(peers) -} - -func (s *syncState) evaluatePeerStateChanges(currentTimeout time.Duration) { - peers := s.scheduler.getNextPeers() - if len(peers) == 0 { - return - } - - sendMessagePeers := 0 - for _, peer := range peers { - ops := peer.advancePeerState(currentTimeout, s.isRelay) - if (ops & peerOpsSendMessage) == peerOpsSendMessage { - peers[sendMessagePeers] = peer - sendMessagePeers++ - } - if (ops & peerOpsSetInterruptible) == peerOpsSetInterruptible { - if _, has := s.interruptablePeersMap[peer]; !has { - s.interruptablePeers = append(s.interruptablePeers, peer) - s.interruptablePeersMap[peer] = len(s.interruptablePeers) - 1 - } - } - if (ops & peerOpsClearInterruptible) == peerOpsClearInterruptible { - if idx, has := s.interruptablePeersMap[peer]; has { - delete(s.interruptablePeersMap, peer) - s.interruptablePeers[idx] = nil - } - } - if (ops & peerOpsReschedule) == peerOpsReschedule { - s.scheduler.schedulePeer(peer, currentTimeout+s.lastBeta) - } - } - - peers = peers[:sendMessagePeers] - deadlineMonitor := s.clock.DeadlineMonitorAt(currentTimeout + sendMessagesTime) - s.sendMessageLoop(currentTimeout, deadlineMonitor, peers) -} - -// rollOffsets rolls the "base" offset for the peers offset selection. This method is only called -// for non-relays. -func (s *syncState) rollOffsets() { - s.nextOffsetRollingCh = s.clock.TimeoutAt(s.clock.Since() + 2*s.lastBeta) - s.requestsOffset++ - - if !s.fetchTransactions { - return - } - - // iterate on the outgoing peers and see if we want to send them an update as needed. - // note that because this function is only called for non-relays, then all the connections - // are outgoing. - peers := s.getPeers() - s.updatePeersRequestParams(peers) - - // check when each of these peers is expected to send a message. we might want to promote a message to be sent earlier. - currentTimeOffset := s.clock.Since() - deadlineMonitor := s.clock.DeadlineMonitorAt(currentTimeOffset + sendMessagesTime) - - for _, peer := range peers { - nextSchedule := s.scheduler.peerDuration(peer) - if nextSchedule == 0 { - // a new peer - ignore for now. This peer would get scheduled on the next new round. - continue - } - if currentTimeOffset+sendMessagesTime > nextSchedule { - // there was a message scheduled already in less than 20ms, so keep that one. - s.scheduler.schedulePeer(peer, nextSchedule) - continue - } - - // otherwise, send a message to that peer. Note that we're passing the `nextSchedule-s.lastBeta` as the currentTime, - // so that the time offset would be based on that one. ( i.e. effectively, it would retain the existing timing, and prevent - // the peers from getting aligned ) - s.sendMessageLoop(nextSchedule-s.lastBeta, deadlineMonitor, []*Peer{peer}) - } -} - -func (s *syncState) getPeers() (result []*Peer) { - peersInfo := s.node.GetPeers() - updatedNetworkPeers := []interface{}{} - updatedNetworkPeersSync := []*Peer{} - - var averageDataExchangeRate uint64 - - // some of the network peers might not have a sync peer, so we need to create one for these. - for _, peerInfo := range peersInfo { - if peerInfo.TxnSyncPeer == nil { - syncPeer := makePeer(peerInfo.NetworkPeer, peerInfo.IsOutgoing, s.isRelay, &s.config, s.log, s.node.GetPeerLatency(peerInfo.NetworkPeer)) - peerInfo.TxnSyncPeer = syncPeer - updatedNetworkPeers = append(updatedNetworkPeers, peerInfo.NetworkPeer) - updatedNetworkPeersSync = append(updatedNetworkPeersSync, syncPeer) - } - result = append(result, peerInfo.TxnSyncPeer) - averageDataExchangeRate += peerInfo.TxnSyncPeer.dataExchangeRate - } - if len(peersInfo) > 0 { - averageDataExchangeRate /= uint64(len(peersInfo)) - } - - // if we have any update for the transaction sync connector, the send them via - // a UpdatePeers call. - if len(updatedNetworkPeers) > 0 || len(peersInfo) > 0 { - s.node.UpdatePeers(updatedNetworkPeersSync, updatedNetworkPeers, averageDataExchangeRate) - } - return result -} - -func (s *syncState) updatePeersRequestParams(peers []*Peer) { - if s.transactionPoolFull { - for _, peer := range peers { - peer.setLocalRequestParams(0, 0) - } - return - } - if s.isRelay { - for _, peer := range peers { - peer.setLocalRequestParams(0, 1) - } - } else { - if s.fetchTransactions { - for i, peer := range peers { - // on non-relay, ask for offset/modulator - peer.setLocalRequestParams(uint64(i)+s.requestsOffset, uint64(len(peers))) - } - } - } -} - -func (s *syncState) updatePeersLatency(peers []*Peer) { - for _, peer := range peers { - peer.cachedLatency = s.node.GetPeerLatency(peer.networkPeer) - } -} diff --git a/txnsync/mainloop_test.go b/txnsync/mainloop_test.go deleted file mode 100644 index 5622636d8b..0000000000 --- a/txnsync/mainloop_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestBeta(t *testing.T) { - partitiontest.PartitionTest(t) - - beta0 := beta(0) - beta10000 := beta(10000) - require.GreaterOrEqual(t, int64(beta0), int64(100*time.Millisecond)) - require.LessOrEqual(t, int64(beta10000), int64(20*time.Millisecond)) - for i := 50; i < 20000; i += 50 { - prev := beta(i - 50) - cur := beta(i) - require.LessOrEqualf(t, int64(cur), int64(prev), fmt.Sprintf("beta(%d) < beta(%d)", i, i-50)) - } - -} - -func TestShouldUpdateBeta(t *testing.T) { - partitiontest.PartitionTest(t) - - beta0 := beta(0) - beta100 := beta(100) - beta5000 := beta(5000) - beta5100 := beta(5100) - beta5900 := beta(5900) - beta6000 := beta(6000) - beta10000 := beta(10000) - beta15000 := beta(15000) - - // new beta greater than betaGranularChangeThreshold times previous beta - require.True(t, shouldUpdateBeta(beta0, beta10000, betaGranularChangeThreshold)) - require.True(t, shouldUpdateBeta(beta5000, beta6000, betaGranularChangeThreshold)) - - //same beta values - require.False(t, shouldUpdateBeta(beta0, beta100, betaGranularChangeThreshold)) - require.False(t, shouldUpdateBeta(beta10000, beta15000, betaGranularChangeThreshold)) - - // new beta lesser than betaGranularChangeThreshold times previous beta - require.True(t, shouldUpdateBeta(beta15000, beta0, betaGranularChangeThreshold)) - require.True(t, shouldUpdateBeta(beta6000, beta100, betaGranularChangeThreshold)) - - // no change in beta is expected - require.False(t, shouldUpdateBeta(beta5000, beta5100, betaGranularChangeThreshold)) - require.False(t, shouldUpdateBeta(beta6000, beta5900, betaGranularChangeThreshold)) -} diff --git a/txnsync/metrics.go b/txnsync/metrics.go deleted file mode 100644 index d2bcbdd9b7..0000000000 --- a/txnsync/metrics.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "github.com/algorand/go-algorand/util/metrics" -) - -var txsyncIncomingMessagesTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_incoming_messages_total", Description: "total number of incoming transaction sync messages"}) -var txsyncUnprocessedIncomingMessagesTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_unprocessed_incoming_messages_total", Description: "total number of incoming transaction sync messages that were not processed"}) -var txsyncDecodedBloomFiltersTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_decoded_bloom_filters_total", Description: "total number of decoded bloom filters"}) -var txsyncCreatedPeersTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_created_peers_total", Description: "total number of created peers"}) -var txsyncOutgoingMessagesTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_outgoing_messages_total", Description: "total number of outgoing transaction sync messages"}) -var txsyncEncodedBloomFiltersTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_txsync_encoded_bloom_filters_total", Description: "total number of bloom filters encoded"}) diff --git a/txnsync/msgbuffers.go b/txnsync/msgbuffers.go deleted file mode 100644 index a531f6da2f..0000000000 --- a/txnsync/msgbuffers.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "sync" - - "github.com/algorand/go-algorand/data/transactions" -) - -const messageBufferDefaultInitialSize = 10240 - -// msgBuffersPool holds temporary byte slice buffers used for encoding messages. -var msgBuffersPool = sync.Pool{ - New: func() interface{} { - return make([]byte, 0, messageBufferDefaultInitialSize) - }, -} - -// GetEncodingBuf returns a byte slice that can be used for encoding a -// temporary message. The byte slice has zero length but potentially -// non-zero capacity. The caller gets full ownership of the byte slice, -// but is encouraged to return it using releaseMessageBuffer(). -func getMessageBuffer() []byte { - return msgBuffersPool.Get().([]byte)[:0] -} - -// releaseMessageBuffer places a byte slice into the pool of temporary buffers -// for encoding. The caller gives up ownership of the byte slice when -// passing it to releaseMessageBuffer(). -func releaseMessageBuffer(s []byte) { - msgBuffersPool.Put(s) //nolint:staticcheck -} - -// txidSlicePool holds temporary byte slice buffers used for encoding messages. -var txidSlicePool = sync.Pool{} - -// getTxIDSliceBuffer returns a slice that can be used for storing a -// list of transaction IDs. The slice has zero length but potentially -// non-zero capacity. The caller gets full ownership of the slice, -// but is encouraged to return it using releaseTxIDSliceBuffer(). -func getTxIDSliceBuffer(minSize int) []transactions.Txid { - alloc := txidSlicePool.Get() - if alloc == nil { - return make([]transactions.Txid, 0, minSize) - } - buf := alloc.([]transactions.Txid)[:0] - if cap(buf) >= minSize { - return buf - } - txidSlicePool.Put(alloc) - return make([]transactions.Txid, 0, minSize) -} - -// releaseTxIDSliceBuffer places a slice into the pool of buffers -// for storage. The caller gives up ownership of the byte slice when -// passing it to releaseMessageBuffer(). -func releaseTxIDSliceBuffer(s []transactions.Txid) { - if cap(s) > 0 { - txidSlicePool.Put(s) //nolint:staticcheck - } -} diff --git a/txnsync/msgbuffers_test.go b/txnsync/msgbuffers_test.go deleted file mode 100644 index f53a4bd0d2..0000000000 --- a/txnsync/msgbuffers_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/test/partitiontest" -) - -// A unique length that we can use to identify non-default allocated buffers -var uniqueLength int = messageBufferDefaultInitialSize + 482 -var uniqueIdentifier int = 50 - -// Stamp a byte buffer with a unique identifier, assumes a capacity of at least unique_length -func stampBuffer(i int, buf *[]byte) { - if cap(*buf) < uniqueLength { - return - } - - *buf = (*buf)[:cap(*buf)] - - for j := 0; j < i; j++ { - (*buf)[uniqueLength-1-j] = byte(j) - } - -} - -func validBuffer(i int, buf *[]byte) bool { - - if cap(*buf) != uniqueLength { - return false - } - - *buf = (*buf)[:cap(*buf)] - - for j := 0; j < i; j++ { - if (*buf)[uniqueLength-1-j] != byte(j) { - return false - } - } - - return true -} - -// TestMessageBuffersPool tests that a buffer pool can be retrieved and has proper length/capacity properties -func TestMessageBuffersPool(t *testing.T) { - - partitiontest.PartitionTest(t) - - foundBuffer := false - - for retryCount := 0; retryCount < 10; retryCount++ { - - // Let's put a bunch of uniquely identifiable buffers in the global pool - for i := 0; i < 10; i++ { - - bytes := make([]byte, 0, uniqueLength) - stampBuffer(uniqueIdentifier, &bytes) - - releaseMessageBuffer(bytes) - } - - collector := [][]byte{} - - // Let's try to get at least one buffer that is uniquely identifiable over a period of time - for i := 0; i < 10000; i++ { - byte := getMessageBuffer() - - collector = append(collector, byte) - - if validBuffer(uniqueIdentifier, &byte) { - foundBuffer = true - break - } - - time.Sleep(500 * time.Microsecond) - } - - for _, b := range collector { - releaseMessageBuffer(b) - } - - if foundBuffer { - // If we found a buffer, we passed the test - break - } - - // Otherwise, let's start all over again - } - - require.True(t, foundBuffer) - -} - -// TestTxIDSlicePool tests that the transaction id pool can be retrieved and has proper length/capacity properties -func TestTxIDSlicePool(t *testing.T) { - partitiontest.PartitionTest(t) - maxTestCount := 200 - for testCount := 0; testCount < maxTestCount; testCount++ { - for i := 10; i < 100; i += 10 { - txIDs := getTxIDSliceBuffer(i) - require.Equal(t, 0, len(txIDs)) - require.GreaterOrEqual(t, cap(txIDs), i) - releaseTxIDSliceBuffer(txIDs) - } - - // Test that one of the previous buffers can be reused - // We can assess this because all the previous buffers created - // had a capacity greater than 10, so if one of these buffers - // has a buffer size of at least 10 (when we asked for 5), we can - // be assured that we have reused a previous buffer - txIDs := getTxIDSliceBuffer(5) - require.Equal(t, 0, len(txIDs)) - require.GreaterOrEqual(t, cap(txIDs), 5) - if cap(txIDs) < 10 { - // repeat this test again. it looks like the GC collected all the content - // of the pool and forced us to allocate a new buffer. - time.Sleep(10 * time.Millisecond) - continue - } - releaseTxIDSliceBuffer(txIDs) - return - } - require.FailNow(t, "failed to get a 5 entries buffer from slice pool") -} diff --git a/txnsync/msgorderingheap.go b/txnsync/msgorderingheap.go deleted file mode 100644 index 69758216bb..0000000000 --- a/txnsync/msgorderingheap.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "container/heap" - "errors" - - "github.com/algorand/go-deadlock" -) - -var errHeapEmpty = errors.New("message ordering heap is empty") -var errHeapReachedCapacity = errors.New("message ordering heap reached capacity") -var errSequenceNumberMismatch = errors.New("sequence number mismatch") - -const messageOrderingHeapLimit = 128 - -type messageHeapItem incomingMessage - -type messageOrderingHeap struct { - mu deadlock.Mutex - messages []messageHeapItem -} - -// Push implements heap.Interface -func (p *messageOrderingHeap) Push(x interface{}) { - entry := x.(messageHeapItem) - p.messages = append(p.messages, entry) -} - -// Pop implements heap.Interface -func (p *messageOrderingHeap) Pop() interface{} { - end := len(p.messages) - 1 - res := p.messages[end] - p.messages[end] = messageHeapItem{} - p.messages = p.messages[0:end] - return res -} - -// Len implements heap.Interface -func (p *messageOrderingHeap) Len() int { - return len(p.messages) -} - -// Swap implements heap.Interface -func (p *messageOrderingHeap) Swap(i, j int) { - p.messages[i], p.messages[j] = p.messages[j], p.messages[i] -} - -// Less implements heap.Interface -func (p *messageOrderingHeap) Less(i, j int) bool { - return p.messages[i].sequenceNumber < p.messages[j].sequenceNumber -} - -func (p *messageOrderingHeap) enqueue(msg incomingMessage) error { - p.mu.Lock() - defer p.mu.Unlock() - if len(p.messages) >= messageOrderingHeapLimit { - return errHeapReachedCapacity - } - heap.Push(p, messageHeapItem(msg)) - return nil -} - -func (p *messageOrderingHeap) popSequence(sequenceNumber uint64) (msg incomingMessage, heapSequenceNumber uint64, err error) { - p.mu.Lock() - defer p.mu.Unlock() - if len(p.messages) == 0 { - return incomingMessage{}, 0, errHeapEmpty - } - if p.messages[0].sequenceNumber != sequenceNumber { - return incomingMessage{}, p.messages[0].sequenceNumber, errSequenceNumberMismatch - } - entry := heap.Pop(p).(messageHeapItem) - return incomingMessage(entry), sequenceNumber, nil -} - -func (p *messageOrderingHeap) pop() (msg incomingMessage, err error) { - p.mu.Lock() - defer p.mu.Unlock() - if len(p.messages) == 0 { - return incomingMessage{}, errHeapEmpty - } - entry := heap.Pop(p).(messageHeapItem) - return incomingMessage(entry), nil -} diff --git a/txnsync/msgorderingheap_test.go b/txnsync/msgorderingheap_test.go deleted file mode 100644 index 2b64b947ad..0000000000 --- a/txnsync/msgorderingheap_test.go +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "math/rand" - "reflect" - "sort" - "sync" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-deadlock" - - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestMessageOrderingHeap_PushPopSwapLess(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - heap := messageOrderingHeap{} - - msg1 := messageHeapItem{sequenceNumber: 1} - msg2 := messageHeapItem{sequenceNumber: 2} - msg3 := messageHeapItem{sequenceNumber: 3} - - a.Equal(len(heap.messages), 0) - heap.Push(msg1) - heap.Push(msg2) - a.Equal(len(heap.messages), int(2)) - a.Equal(heap.Len(), int(2)) - - a.True(heap.Less(0, 1)) - - res := heap.Pop().(messageHeapItem) - a.Equal(res.sequenceNumber, uint64(2)) - a.Equal(len(heap.messages), int(1)) - a.Equal(heap.Len(), int(1)) - a.Equal(heap.messages[0].sequenceNumber, uint64(1)) - heap.Push(msg2) - heap.Push(msg3) - heap.Swap(0, 1) - a.Equal(heap.messages[0].sequenceNumber, uint64(2)) - a.Equal(heap.messages[1].sequenceNumber, uint64(1)) - - a.False(heap.Less(0, 1)) -} - -func TestEnqueueHeapPop(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - heap := messageOrderingHeap{} - - for i := messageOrderingHeapLimit - 1; i >= 0; i-- { - a.Nil(heap.enqueue(incomingMessage{sequenceNumber: uint64(i)})) - } - - a.Equal(heap.Len(), int(messageOrderingHeapLimit)) - a.Equal(heap.enqueue(incomingMessage{}), errHeapReachedCapacity) - a.Equal(heap.Len(), int(messageOrderingHeapLimit)) - - for i := 0; i < messageOrderingHeapLimit; i++ { - msg, err := heap.pop() - a.Nil(err) - a.Equal(msg.sequenceNumber, uint64(i)) - } - - _, err := heap.pop() - - a.Equal(heap.Len(), int(0)) - a.Equal(err, errHeapEmpty) - -} - -func TestPopSequence(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - heap := messageOrderingHeap{} - - _, _, err := heap.popSequence(0) - - a.Equal(err, errHeapEmpty) - for i := messageOrderingHeapLimit - 1; i >= 0; i-- { - a.Nil(heap.enqueue(incomingMessage{sequenceNumber: uint64(i)})) - } - a.Equal(heap.Len(), messageOrderingHeapLimit) - _, heapSeqNum, err := heap.popSequence(3) - a.Equal(heap.Len(), messageOrderingHeapLimit) - a.Equal(heapSeqNum, uint64(0), errSequenceNumberMismatch) - a.Error(err, errSequenceNumberMismatch) - - msg, heapSeqNum, err := heap.popSequence(0) - - a.NotNil(msg) - a.Equal(heap.Len(), messageOrderingHeapLimit-1) - a.Equal(msg.sequenceNumber, uint64(0)) - a.Equal(heapSeqNum, uint64(0)) - a.NoError(err) - -} - -func TestMultiThreaded(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - loopTime := 5 * time.Second - numThreads := 100 - itemsPerThread := 10 - - totalItems := numThreads * itemsPerThread - - var ( - heap messageOrderingHeap - startChan chan struct{} - wg sync.WaitGroup - ) - - peers := []Peer{ - {}, - {}, - {}, - {}, - {}, - } - - genTxnGrp := func(value int) []pooldata.SignedTxGroup { - - if value%2 == 0 { - return []pooldata.SignedTxGroup{ - { - GroupTransactionID: transactions.Txid{byte(value % 255)}, - }, - } - } - - return []pooldata.SignedTxGroup{ - { - GroupTransactionID: transactions.Txid{byte(value % 255)}, - }, - { - GroupTransactionID: transactions.Txid{byte(value + 1%255)}, - }, - } - } - - encodeMsg := func(value int, peers []Peer) incomingMessage { - - rval := incomingMessage{ - sequenceNumber: uint64(value), - peer: &peers[value%len(peers)], - encodedSize: value + 874, - transactionGroups: genTxnGrp(value), - } - - return rval - } - - validateMsg := func(message incomingMessage) bool { - val := int(message.sequenceNumber) - - if message.peer != &peers[val%len(peers)] { - return false - } - - if message.encodedSize != val+874 { - return false - } - - if !reflect.DeepEqual(message.transactionGroups, genTxnGrp(val)) { - return false - } - - return true - - } - - fxn := func(values []int, heap *messageOrderingHeap, start chan struct{}, wg *sync.WaitGroup, - enqueuedMtx *deadlock.Mutex, enqueuedList *[]int) { - defer wg.Done() - // Wait for the start - <-start - - for _, value := range values { - msg := encodeMsg(value, peers) - err := heap.enqueue(msg) - - if err == nil { - enqueuedMtx.Lock() - *enqueuedList = append(*enqueuedList, value) - enqueuedMtx.Unlock() - } - } - - } - - startTime := time.Now() - for time.Since(startTime) < loopTime { - - var enqueuedList []int - var enqueuedMtx deadlock.Mutex - - var masterList []int - - for j := 0; j < totalItems; j++ { - masterList = append(masterList, j) - } - - rand.Seed(time.Now().UnixNano()) - rand.Shuffle(len(masterList), func(i, j int) { masterList[i], masterList[j] = masterList[j], masterList[i] }) - - heap = messageOrderingHeap{} - startChan = make(chan struct{}) - - currentIdx := 0 - - for j := 0; j < numThreads; j++ { - wg.Add(1) - - randomList := masterList[currentIdx : currentIdx+itemsPerThread] - currentIdx = currentIdx + itemsPerThread - - go fxn(randomList, &heap, startChan, &wg, &enqueuedMtx, &enqueuedList) - } - - // Tell all goroutines to go - close(startChan) - - wg.Wait() - - a.Equal(heap.Len(), int(messageOrderingHeapLimit)) - a.Equal(heap.enqueue(incomingMessage{}), errHeapReachedCapacity) - a.Equal(heap.Len(), int(messageOrderingHeapLimit)) - - sort.Ints(enqueuedList) - - for _, val := range enqueuedList { - - msg, sequenceNumber, err := heap.popSequence(uint64(val)) - a.Nil(err) - a.Equal(sequenceNumber, uint64(val)) - a.True(validateMsg(msg)) - } - - a.Equal(heap.Len(), int(0)) - } - -} diff --git a/txnsync/msgp_gen.go b/txnsync/msgp_gen.go deleted file mode 100644 index 1c1b512560..0000000000 --- a/txnsync/msgp_gen.go +++ /dev/null @@ -1,35449 +0,0 @@ -package txnsync - -// Code generated by github.com/algorand/msgp DO NOT EDIT. - -import ( - "sort" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/crypto/compactcert" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/msgp/msgp" -) - -// The following msgp objects are implemented in this file: -// addresses -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// appIndices -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// applicationArgs -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// assetIndices -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// bitmask -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// certProofs -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// encodedApplicationCallTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedAssetConfigTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedAssetFreezeTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedAssetParams -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedAssetTransferTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedBloomFilter -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedCert -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedCompactCertTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedKeyregTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedLsigs -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedMsigs -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedPaymentTxnFields -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedSignedTxns -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedTxnHeaders -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// encodedTxns -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// packedTransactionGroups -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// program -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// relayedProposal -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// requestParams -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// revealMap -// |-----> MarshalMsg -// |-----> CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> Msgsize -// |-----> MsgIsZero -// -// timingParams -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// transactionBlockMessage -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// txGroupsEncodingStub -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// txGroupsEncodingStubOld -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// -// txnGroups -// |-----> (*) MarshalMsg -// |-----> (*) CanMarshalMsg -// |-----> (*) UnmarshalMsg -// |-----> (*) CanUnmarshalMsg -// |-----> (*) Msgsize -// |-----> (*) MsgIsZero -// - -// MarshalMsg implements msgp.Marshaler -func (z addresses) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0005 := range z { - o = z[za0005].MarshalMsg(o) - } - return -} - -func (_ addresses) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(addresses) - if !ok { - _, ok = (z).(*addresses) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *addresses) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0002), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(addresses, zb0002) - } - for zb0001 := range *z { - bts, err = (*z)[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *addresses) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*addresses) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z addresses) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0005 := range z { - s += z[za0005].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z addresses) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z appIndices) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0001 := range z { - o = z[za0001].MarshalMsg(o) - } - return -} - -func (_ appIndices) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(appIndices) - if !ok { - _, ok = (z).(*appIndices) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *appIndices) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0002), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(appIndices, zb0002) - } - for zb0001 := range *z { - bts, err = (*z)[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *appIndices) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*appIndices) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z appIndices) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0001 := range z { - s += z[za0001].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z appIndices) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z applicationArgs) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0001 := range z { - o = msgp.AppendBytes(o, z[za0001]) - } - return -} - -func (_ applicationArgs) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(applicationArgs) - if !ok { - _, ok = (z).(*applicationArgs) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *applicationArgs) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0002), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(applicationArgs, zb0002) - } - for zb0001 := range *z { - (*z)[zb0001], bts, err = msgp.ReadBytesBytes(bts, (*z)[zb0001]) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *applicationArgs) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*applicationArgs) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z applicationArgs) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0001 := range z { - s += msgp.BytesPrefixSize + len(z[za0001]) - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z applicationArgs) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z assetIndices) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0001 := range z { - o = z[za0001].MarshalMsg(o) - } - return -} - -func (_ assetIndices) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(assetIndices) - if !ok { - _, ok = (z).(*assetIndices) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *assetIndices) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0002), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(assetIndices, zb0002) - } - for zb0001 := range *z { - bts, err = (*z)[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *assetIndices) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*assetIndices) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z assetIndices) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0001 := range z { - s += z[za0001].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z assetIndices) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z bitmask) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - o = msgp.AppendBytes(o, []byte(z)) - return -} - -func (_ bitmask) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(bitmask) - if !ok { - _, ok = (z).(*bitmask) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *bitmask) UnmarshalMsg(bts []byte) (o []byte, err error) { - { - var zb0001 []byte - var zb0002 int - zb0002, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0002), uint64(maxBitmaskSize)) - return - } - zb0001, bts, err = msgp.ReadBytesBytes(bts, []byte((*z))) - if err != nil { - err = msgp.WrapError(err) - return - } - (*z) = bitmask(zb0001) - } - o = bts - return -} - -func (_ *bitmask) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*bitmask) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z bitmask) Msgsize() (s int) { - s = msgp.BytesPrefixSize + len([]byte(z)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z bitmask) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z certProofs) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len(z))) - } - for za0001 := range z { - o = z[za0001].MarshalMsg(o) - } - return -} - -func (_ certProofs) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(certProofs) - if !ok { - _, ok = (z).(*certProofs) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *certProofs) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0002), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = nil - } else if (*z) != nil && cap((*z)) >= zb0002 { - (*z) = (*z)[:zb0002] - } else { - (*z) = make(certProofs, zb0002) - } - for zb0001 := range *z { - bts, err = (*z)[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - } - o = bts - return -} - -func (_ *certProofs) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*certProofs) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z certProofs) Msgsize() (s int) { - s = msgp.ArrayHeaderSize - for za0001 := range z { - s += z[za0001].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z certProofs) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedApplicationCallTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0017Len := uint32(26) - var zb0017Mask uint32 /* 27 bits */ - if len((*z).ApplicationArgs) == 0 { - zb0017Len-- - zb0017Mask |= 0x2 - } - if len((*z).BitmaskApplicationArgs) == 0 { - zb0017Len-- - zb0017Mask |= 0x4 - } - if len((*z).OnCompletion) == 0 { - zb0017Len-- - zb0017Mask |= 0x8 - } - if len((*z).BitmaskOnCompletion) == 0 { - zb0017Len-- - zb0017Mask |= 0x10 - } - if len((*z).ApprovalProgram) == 0 { - zb0017Len-- - zb0017Mask |= 0x20 - } - if len((*z).BitmaskApprovalProgram) == 0 { - zb0017Len-- - zb0017Mask |= 0x40 - } - if len((*z).ForeignAssets) == 0 { - zb0017Len-- - zb0017Mask |= 0x80 - } - if len((*z).BitmaskForeignAssets) == 0 { - zb0017Len-- - zb0017Mask |= 0x100 - } - if len((*z).Accounts) == 0 { - zb0017Len-- - zb0017Mask |= 0x200 - } - if len((*z).BitmaskAccounts) == 0 { - zb0017Len-- - zb0017Mask |= 0x400 - } - if len((*z).ExtraProgramPages) == 0 { - zb0017Len-- - zb0017Mask |= 0x800 - } - if len((*z).BitmaskExtraProgramPages) == 0 { - zb0017Len-- - zb0017Mask |= 0x1000 - } - if len((*z).ForeignApps) == 0 { - zb0017Len-- - zb0017Mask |= 0x2000 - } - if len((*z).BitmaskForeignApps) == 0 { - zb0017Len-- - zb0017Mask |= 0x4000 - } - if len((*z).ApplicationID) == 0 { - zb0017Len-- - zb0017Mask |= 0x8000 - } - if len((*z).BitmaskApplicationID) == 0 { - zb0017Len-- - zb0017Mask |= 0x10000 - } - if len((*z).ClearStateProgram) == 0 { - zb0017Len-- - zb0017Mask |= 0x20000 - } - if len((*z).BitmaskClearStateProgram) == 0 { - zb0017Len-- - zb0017Mask |= 0x40000 - } - if len((*z).GlobalNumByteSlice) == 0 { - zb0017Len-- - zb0017Mask |= 0x80000 - } - if len((*z).BitmaskGlobalNumByteSlice) == 0 { - zb0017Len-- - zb0017Mask |= 0x100000 - } - if len((*z).GlobalNumUint) == 0 { - zb0017Len-- - zb0017Mask |= 0x200000 - } - if len((*z).BitmaskGlobalNumUint) == 0 { - zb0017Len-- - zb0017Mask |= 0x400000 - } - if len((*z).LocalNumByteSlice) == 0 { - zb0017Len-- - zb0017Mask |= 0x800000 - } - if len((*z).BitmaskLocalNumByteSlice) == 0 { - zb0017Len-- - zb0017Mask |= 0x1000000 - } - if len((*z).LocalNumUint) == 0 { - zb0017Len-- - zb0017Mask |= 0x2000000 - } - if len((*z).BitmaskLocalNumUint) == 0 { - zb0017Len-- - zb0017Mask |= 0x4000000 - } - // variable map header, size zb0017Len - o = msgp.AppendMapHeader(o, zb0017Len) - if zb0017Len != 0 { - if (zb0017Mask & 0x2) == 0 { // if not empty - // string "apaa" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x61) - if (*z).ApplicationArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ApplicationArgs))) - } - for zb0002 := range (*z).ApplicationArgs { - if (*z).ApplicationArgs[zb0002] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ApplicationArgs[zb0002]))) - } - for zb0003 := range (*z).ApplicationArgs[zb0002] { - o = msgp.AppendBytes(o, (*z).ApplicationArgs[zb0002][zb0003]) - } - } - } - if (zb0017Mask & 0x4) == 0 { // if not empty - // string "apaabm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskApplicationArgs)) - } - if (zb0017Mask & 0x8) == 0 { // if not empty - // string "apan" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x6e) - o = msgp.AppendBytes(o, (*z).OnCompletion) - } - if (zb0017Mask & 0x10) == 0 { // if not empty - // string "apanbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskOnCompletion)) - } - if (zb0017Mask & 0x20) == 0 { // if not empty - // string "apap" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x70) - if (*z).ApprovalProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ApprovalProgram))) - } - for zb0014 := range (*z).ApprovalProgram { - o = msgp.AppendBytes(o, []byte((*z).ApprovalProgram[zb0014])) - } - } - if (zb0017Mask & 0x40) == 0 { // if not empty - // string "apapbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskApprovalProgram)) - } - if (zb0017Mask & 0x80) == 0 { // if not empty - // string "apas" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x73) - if (*z).ForeignAssets == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ForeignAssets))) - } - for zb0008 := range (*z).ForeignAssets { - if (*z).ForeignAssets[zb0008] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ForeignAssets[zb0008]))) - } - for zb0009 := range (*z).ForeignAssets[zb0008] { - o = (*z).ForeignAssets[zb0008][zb0009].MarshalMsg(o) - } - } - } - if (zb0017Mask & 0x100) == 0 { // if not empty - // string "apasbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskForeignAssets)) - } - if (zb0017Mask & 0x200) == 0 { // if not empty - // string "apat" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x74) - if (*z).Accounts == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Accounts))) - } - for zb0004 := range (*z).Accounts { - if (*z).Accounts[zb0004] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Accounts[zb0004]))) - } - for zb0005 := range (*z).Accounts[zb0004] { - o = (*z).Accounts[zb0004][zb0005].MarshalMsg(o) - } - } - } - if (zb0017Mask & 0x400) == 0 { // if not empty - // string "apatbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAccounts)) - } - if (zb0017Mask & 0x800) == 0 { // if not empty - // string "apep" - o = append(o, 0xa4, 0x61, 0x70, 0x65, 0x70) - if (*z).ExtraProgramPages == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ExtraProgramPages))) - } - for zb0016 := range (*z).ExtraProgramPages { - o = msgp.AppendUint32(o, (*z).ExtraProgramPages[zb0016]) - } - } - if (zb0017Mask & 0x1000) == 0 { // if not empty - // string "apepbm" - o = append(o, 0xa6, 0x61, 0x70, 0x65, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskExtraProgramPages)) - } - if (zb0017Mask & 0x2000) == 0 { // if not empty - // string "apfa" - o = append(o, 0xa4, 0x61, 0x70, 0x66, 0x61) - if (*z).ForeignApps == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ForeignApps))) - } - for zb0006 := range (*z).ForeignApps { - if (*z).ForeignApps[zb0006] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ForeignApps[zb0006]))) - } - for zb0007 := range (*z).ForeignApps[zb0006] { - o = (*z).ForeignApps[zb0006][zb0007].MarshalMsg(o) - } - } - } - if (zb0017Mask & 0x4000) == 0 { // if not empty - // string "apfabm" - o = append(o, 0xa6, 0x61, 0x70, 0x66, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskForeignApps)) - } - if (zb0017Mask & 0x8000) == 0 { // if not empty - // string "apid" - o = append(o, 0xa4, 0x61, 0x70, 0x69, 0x64) - if (*z).ApplicationID == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ApplicationID))) - } - for zb0001 := range (*z).ApplicationID { - o = (*z).ApplicationID[zb0001].MarshalMsg(o) - } - } - if (zb0017Mask & 0x10000) == 0 { // if not empty - // string "apidbm" - o = append(o, 0xa6, 0x61, 0x70, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskApplicationID)) - } - if (zb0017Mask & 0x20000) == 0 { // if not empty - // string "apsu" - o = append(o, 0xa4, 0x61, 0x70, 0x73, 0x75) - if (*z).ClearStateProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ClearStateProgram))) - } - for zb0015 := range (*z).ClearStateProgram { - o = msgp.AppendBytes(o, []byte((*z).ClearStateProgram[zb0015])) - } - } - if (zb0017Mask & 0x40000) == 0 { // if not empty - // string "apsubm" - o = append(o, 0xa6, 0x61, 0x70, 0x73, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskClearStateProgram)) - } - if (zb0017Mask & 0x80000) == 0 { // if not empty - // string "gnbs" - o = append(o, 0xa4, 0x67, 0x6e, 0x62, 0x73) - if (*z).GlobalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).GlobalNumByteSlice))) - } - for zb0013 := range (*z).GlobalNumByteSlice { - o = msgp.AppendUint64(o, (*z).GlobalNumByteSlice[zb0013]) - } - } - if (zb0017Mask & 0x100000) == 0 { // if not empty - // string "gnbsbm" - o = append(o, 0xa6, 0x67, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskGlobalNumByteSlice)) - } - if (zb0017Mask & 0x200000) == 0 { // if not empty - // string "gnui" - o = append(o, 0xa4, 0x67, 0x6e, 0x75, 0x69) - if (*z).GlobalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).GlobalNumUint))) - } - for zb0012 := range (*z).GlobalNumUint { - o = msgp.AppendUint64(o, (*z).GlobalNumUint[zb0012]) - } - } - if (zb0017Mask & 0x400000) == 0 { // if not empty - // string "gnuibm" - o = append(o, 0xa6, 0x67, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskGlobalNumUint)) - } - if (zb0017Mask & 0x800000) == 0 { // if not empty - // string "lnbs" - o = append(o, 0xa4, 0x6c, 0x6e, 0x62, 0x73) - if (*z).LocalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).LocalNumByteSlice))) - } - for zb0011 := range (*z).LocalNumByteSlice { - o = msgp.AppendUint64(o, (*z).LocalNumByteSlice[zb0011]) - } - } - if (zb0017Mask & 0x1000000) == 0 { // if not empty - // string "lnbsbm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLocalNumByteSlice)) - } - if (zb0017Mask & 0x2000000) == 0 { // if not empty - // string "lnui" - o = append(o, 0xa4, 0x6c, 0x6e, 0x75, 0x69) - if (*z).LocalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).LocalNumUint))) - } - for zb0010 := range (*z).LocalNumUint { - o = msgp.AppendUint64(o, (*z).LocalNumUint[zb0010]) - } - } - if (zb0017Mask & 0x4000000) == 0 { // if not empty - // string "lnuibm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLocalNumUint)) - } - } - return -} - -func (_ *encodedApplicationCallTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedApplicationCallTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedApplicationCallTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0017 int - var zb0018 bool - zb0017, zb0018, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0017, zb0018, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0017 > 0 { - zb0017-- - var zb0019 int - var zb0020 bool - zb0019, zb0020, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0019 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0019), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0020 { - (*z).ApplicationID = nil - } else if (*z).ApplicationID != nil && cap((*z).ApplicationID) >= zb0019 { - (*z).ApplicationID = ((*z).ApplicationID)[:zb0019] - } else { - (*z).ApplicationID = make([]basics.AppIndex, zb0019) - } - for zb0001 := range (*z).ApplicationID { - bts, err = (*z).ApplicationID[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID", zb0001) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0021 []byte - var zb0022 int - zb0022, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - if zb0022 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxBitmaskSize)) - return - } - zb0021, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - (*z).BitmaskApplicationID = bitmask(zb0021) - } - } - if zb0017 > 0 { - zb0017-- - var zb0023 int - zb0023, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - if zb0023 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxEncodedTransactionGroups)) - return - } - (*z).OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).OnCompletion) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0024 []byte - var zb0025 int - zb0025, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - if zb0025 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0025), uint64(maxBitmaskSize)) - return - } - zb0024, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - (*z).BitmaskOnCompletion = bitmask(zb0024) - } - } - if zb0017 > 0 { - zb0017-- - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0026 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0026), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0027 { - (*z).ApplicationArgs = nil - } else if (*z).ApplicationArgs != nil && cap((*z).ApplicationArgs) >= zb0026 { - (*z).ApplicationArgs = ((*z).ApplicationArgs)[:zb0026] - } else { - (*z).ApplicationArgs = make([]applicationArgs, zb0026) - } - for zb0002 := range (*z).ApplicationArgs { - var zb0028 int - var zb0029 bool - zb0028, zb0029, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0002) - return - } - if zb0028 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0028), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0002) - return - } - if zb0029 { - (*z).ApplicationArgs[zb0002] = nil - } else if (*z).ApplicationArgs[zb0002] != nil && cap((*z).ApplicationArgs[zb0002]) >= zb0028 { - (*z).ApplicationArgs[zb0002] = ((*z).ApplicationArgs[zb0002])[:zb0028] - } else { - (*z).ApplicationArgs[zb0002] = make(applicationArgs, zb0028) - } - for zb0003 := range (*z).ApplicationArgs[zb0002] { - (*z).ApplicationArgs[zb0002][zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).ApplicationArgs[zb0002][zb0003]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0002, zb0003) - return - } - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0030 []byte - var zb0031 int - zb0031, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - if zb0031 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0031), uint64(maxBitmaskSize)) - return - } - zb0030, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - (*z).BitmaskApplicationArgs = bitmask(zb0030) - } - } - if zb0017 > 0 { - zb0017-- - var zb0032 int - var zb0033 bool - zb0032, zb0033, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0032 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0032), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0033 { - (*z).Accounts = nil - } else if (*z).Accounts != nil && cap((*z).Accounts) >= zb0032 { - (*z).Accounts = ((*z).Accounts)[:zb0032] - } else { - (*z).Accounts = make([]addresses, zb0032) - } - for zb0004 := range (*z).Accounts { - var zb0034 int - var zb0035 bool - zb0034, zb0035, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0004) - return - } - if zb0034 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0034), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0004) - return - } - if zb0035 { - (*z).Accounts[zb0004] = nil - } else if (*z).Accounts[zb0004] != nil && cap((*z).Accounts[zb0004]) >= zb0034 { - (*z).Accounts[zb0004] = ((*z).Accounts[zb0004])[:zb0034] - } else { - (*z).Accounts[zb0004] = make(addresses, zb0034) - } - for zb0005 := range (*z).Accounts[zb0004] { - bts, err = (*z).Accounts[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0004, zb0005) - return - } - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0036 []byte - var zb0037 int - zb0037, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - if zb0037 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0037), uint64(maxBitmaskSize)) - return - } - zb0036, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - (*z).BitmaskAccounts = bitmask(zb0036) - } - } - if zb0017 > 0 { - zb0017-- - var zb0038 int - var zb0039 bool - zb0038, zb0039, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0038 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0038), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0039 { - (*z).ForeignApps = nil - } else if (*z).ForeignApps != nil && cap((*z).ForeignApps) >= zb0038 { - (*z).ForeignApps = ((*z).ForeignApps)[:zb0038] - } else { - (*z).ForeignApps = make([]appIndices, zb0038) - } - for zb0006 := range (*z).ForeignApps { - var zb0040 int - var zb0041 bool - zb0040, zb0041, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0006) - return - } - if zb0040 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0040), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0006) - return - } - if zb0041 { - (*z).ForeignApps[zb0006] = nil - } else if (*z).ForeignApps[zb0006] != nil && cap((*z).ForeignApps[zb0006]) >= zb0040 { - (*z).ForeignApps[zb0006] = ((*z).ForeignApps[zb0006])[:zb0040] - } else { - (*z).ForeignApps[zb0006] = make(appIndices, zb0040) - } - for zb0007 := range (*z).ForeignApps[zb0006] { - bts, err = (*z).ForeignApps[zb0006][zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0006, zb0007) - return - } - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0042 []byte - var zb0043 int - zb0043, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - if zb0043 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0043), uint64(maxBitmaskSize)) - return - } - zb0042, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - (*z).BitmaskForeignApps = bitmask(zb0042) - } - } - if zb0017 > 0 { - zb0017-- - var zb0044 int - var zb0045 bool - zb0044, zb0045, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0044 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0044), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0045 { - (*z).ForeignAssets = nil - } else if (*z).ForeignAssets != nil && cap((*z).ForeignAssets) >= zb0044 { - (*z).ForeignAssets = ((*z).ForeignAssets)[:zb0044] - } else { - (*z).ForeignAssets = make([]assetIndices, zb0044) - } - for zb0008 := range (*z).ForeignAssets { - var zb0046 int - var zb0047 bool - zb0046, zb0047, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0008) - return - } - if zb0046 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0046), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0008) - return - } - if zb0047 { - (*z).ForeignAssets[zb0008] = nil - } else if (*z).ForeignAssets[zb0008] != nil && cap((*z).ForeignAssets[zb0008]) >= zb0046 { - (*z).ForeignAssets[zb0008] = ((*z).ForeignAssets[zb0008])[:zb0046] - } else { - (*z).ForeignAssets[zb0008] = make(assetIndices, zb0046) - } - for zb0009 := range (*z).ForeignAssets[zb0008] { - bts, err = (*z).ForeignAssets[zb0008][zb0009].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0008, zb0009) - return - } - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0048 []byte - var zb0049 int - zb0049, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - if zb0049 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxBitmaskSize)) - return - } - zb0048, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - (*z).BitmaskForeignAssets = bitmask(zb0048) - } - } - if zb0017 > 0 { - zb0017-- - var zb0050 int - var zb0051 bool - zb0050, zb0051, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0050 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0050), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0051 { - (*z).LocalNumUint = nil - } else if (*z).LocalNumUint != nil && cap((*z).LocalNumUint) >= zb0050 { - (*z).LocalNumUint = ((*z).LocalNumUint)[:zb0050] - } else { - (*z).LocalNumUint = make([]uint64, zb0050) - } - for zb0010 := range (*z).LocalNumUint { - (*z).LocalNumUint[zb0010], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint", zb0010) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0052 []byte - var zb0053 int - zb0053, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - if zb0053 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0053), uint64(maxBitmaskSize)) - return - } - zb0052, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - (*z).BitmaskLocalNumUint = bitmask(zb0052) - } - } - if zb0017 > 0 { - zb0017-- - var zb0054 int - var zb0055 bool - zb0054, zb0055, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0054 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0055 { - (*z).LocalNumByteSlice = nil - } else if (*z).LocalNumByteSlice != nil && cap((*z).LocalNumByteSlice) >= zb0054 { - (*z).LocalNumByteSlice = ((*z).LocalNumByteSlice)[:zb0054] - } else { - (*z).LocalNumByteSlice = make([]uint64, zb0054) - } - for zb0011 := range (*z).LocalNumByteSlice { - (*z).LocalNumByteSlice[zb0011], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice", zb0011) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0056 []byte - var zb0057 int - zb0057, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - if zb0057 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0057), uint64(maxBitmaskSize)) - return - } - zb0056, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - (*z).BitmaskLocalNumByteSlice = bitmask(zb0056) - } - } - if zb0017 > 0 { - zb0017-- - var zb0058 int - var zb0059 bool - zb0058, zb0059, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0058 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0058), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0059 { - (*z).GlobalNumUint = nil - } else if (*z).GlobalNumUint != nil && cap((*z).GlobalNumUint) >= zb0058 { - (*z).GlobalNumUint = ((*z).GlobalNumUint)[:zb0058] - } else { - (*z).GlobalNumUint = make([]uint64, zb0058) - } - for zb0012 := range (*z).GlobalNumUint { - (*z).GlobalNumUint[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint", zb0012) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0060 []byte - var zb0061 int - zb0061, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - if zb0061 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0061), uint64(maxBitmaskSize)) - return - } - zb0060, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - (*z).BitmaskGlobalNumUint = bitmask(zb0060) - } - } - if zb0017 > 0 { - zb0017-- - var zb0062 int - var zb0063 bool - zb0062, zb0063, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0062 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0062), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0063 { - (*z).GlobalNumByteSlice = nil - } else if (*z).GlobalNumByteSlice != nil && cap((*z).GlobalNumByteSlice) >= zb0062 { - (*z).GlobalNumByteSlice = ((*z).GlobalNumByteSlice)[:zb0062] - } else { - (*z).GlobalNumByteSlice = make([]uint64, zb0062) - } - for zb0013 := range (*z).GlobalNumByteSlice { - (*z).GlobalNumByteSlice[zb0013], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice", zb0013) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0064 []byte - var zb0065 int - zb0065, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - if zb0065 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0065), uint64(maxBitmaskSize)) - return - } - zb0064, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - (*z).BitmaskGlobalNumByteSlice = bitmask(zb0064) - } - } - if zb0017 > 0 { - zb0017-- - var zb0066 int - var zb0067 bool - zb0066, zb0067, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0066 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0067 { - (*z).ApprovalProgram = nil - } else if (*z).ApprovalProgram != nil && cap((*z).ApprovalProgram) >= zb0066 { - (*z).ApprovalProgram = ((*z).ApprovalProgram)[:zb0066] - } else { - (*z).ApprovalProgram = make([]program, zb0066) - } - for zb0014 := range (*z).ApprovalProgram { - { - var zb0068 []byte - var zb0069 int - zb0069, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0014) - return - } - if zb0069 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0069), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0068, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).ApprovalProgram[zb0014])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0014) - return - } - (*z).ApprovalProgram[zb0014] = program(zb0068) - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0070 []byte - var zb0071 int - zb0071, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - if zb0071 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0071), uint64(maxBitmaskSize)) - return - } - zb0070, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - (*z).BitmaskApprovalProgram = bitmask(zb0070) - } - } - if zb0017 > 0 { - zb0017-- - var zb0072 int - var zb0073 bool - zb0072, zb0073, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0072 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0073 { - (*z).ClearStateProgram = nil - } else if (*z).ClearStateProgram != nil && cap((*z).ClearStateProgram) >= zb0072 { - (*z).ClearStateProgram = ((*z).ClearStateProgram)[:zb0072] - } else { - (*z).ClearStateProgram = make([]program, zb0072) - } - for zb0015 := range (*z).ClearStateProgram { - { - var zb0074 []byte - var zb0075 int - zb0075, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0015) - return - } - if zb0075 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0075), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0074, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).ClearStateProgram[zb0015])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0015) - return - } - (*z).ClearStateProgram[zb0015] = program(zb0074) - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0076 []byte - var zb0077 int - zb0077, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - if zb0077 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0077), uint64(maxBitmaskSize)) - return - } - zb0076, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - (*z).BitmaskClearStateProgram = bitmask(zb0076) - } - } - if zb0017 > 0 { - zb0017-- - var zb0078 int - var zb0079 bool - zb0078, zb0079, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0078 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0079 { - (*z).ExtraProgramPages = nil - } else if (*z).ExtraProgramPages != nil && cap((*z).ExtraProgramPages) >= zb0078 { - (*z).ExtraProgramPages = ((*z).ExtraProgramPages)[:zb0078] - } else { - (*z).ExtraProgramPages = make([]uint32, zb0078) - } - for zb0016 := range (*z).ExtraProgramPages { - (*z).ExtraProgramPages[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages", zb0016) - return - } - } - } - if zb0017 > 0 { - zb0017-- - { - var zb0080 []byte - var zb0081 int - zb0081, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - if zb0081 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxBitmaskSize)) - return - } - zb0080, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - (*z).BitmaskExtraProgramPages = bitmask(zb0080) - } - } - if zb0017 > 0 { - err = msgp.ErrTooManyArrayFields(zb0017) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0018 { - (*z) = encodedApplicationCallTxnFields{} - } - for zb0017 > 0 { - zb0017-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "apid": - var zb0082 int - var zb0083 bool - zb0082, zb0083, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0082 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0082), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0083 { - (*z).ApplicationID = nil - } else if (*z).ApplicationID != nil && cap((*z).ApplicationID) >= zb0082 { - (*z).ApplicationID = ((*z).ApplicationID)[:zb0082] - } else { - (*z).ApplicationID = make([]basics.AppIndex, zb0082) - } - for zb0001 := range (*z).ApplicationID { - bts, err = (*z).ApplicationID[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID", zb0001) - return - } - } - case "apidbm": - { - var zb0084 []byte - var zb0085 int - zb0085, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - if zb0085 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0085), uint64(maxBitmaskSize)) - return - } - zb0084, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - (*z).BitmaskApplicationID = bitmask(zb0084) - } - case "apan": - var zb0086 int - zb0086, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - if zb0086 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0086), uint64(maxEncodedTransactionGroups)) - return - } - (*z).OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).OnCompletion) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - case "apanbm": - { - var zb0087 []byte - var zb0088 int - zb0088, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - if zb0088 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0088), uint64(maxBitmaskSize)) - return - } - zb0087, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - (*z).BitmaskOnCompletion = bitmask(zb0087) - } - case "apaa": - var zb0089 int - var zb0090 bool - zb0089, zb0090, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0089 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0089), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0090 { - (*z).ApplicationArgs = nil - } else if (*z).ApplicationArgs != nil && cap((*z).ApplicationArgs) >= zb0089 { - (*z).ApplicationArgs = ((*z).ApplicationArgs)[:zb0089] - } else { - (*z).ApplicationArgs = make([]applicationArgs, zb0089) - } - for zb0002 := range (*z).ApplicationArgs { - var zb0091 int - var zb0092 bool - zb0091, zb0092, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0002) - return - } - if zb0091 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0091), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "ApplicationArgs", zb0002) - return - } - if zb0092 { - (*z).ApplicationArgs[zb0002] = nil - } else if (*z).ApplicationArgs[zb0002] != nil && cap((*z).ApplicationArgs[zb0002]) >= zb0091 { - (*z).ApplicationArgs[zb0002] = ((*z).ApplicationArgs[zb0002])[:zb0091] - } else { - (*z).ApplicationArgs[zb0002] = make(applicationArgs, zb0091) - } - for zb0003 := range (*z).ApplicationArgs[zb0002] { - (*z).ApplicationArgs[zb0002][zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).ApplicationArgs[zb0002][zb0003]) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0002, zb0003) - return - } - } - } - case "apaabm": - { - var zb0093 []byte - var zb0094 int - zb0094, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - if zb0094 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0094), uint64(maxBitmaskSize)) - return - } - zb0093, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - (*z).BitmaskApplicationArgs = bitmask(zb0093) - } - case "apat": - var zb0095 int - var zb0096 bool - zb0095, zb0096, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts") - return - } - if zb0095 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0095), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Accounts") - return - } - if zb0096 { - (*z).Accounts = nil - } else if (*z).Accounts != nil && cap((*z).Accounts) >= zb0095 { - (*z).Accounts = ((*z).Accounts)[:zb0095] - } else { - (*z).Accounts = make([]addresses, zb0095) - } - for zb0004 := range (*z).Accounts { - var zb0097 int - var zb0098 bool - zb0097, zb0098, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0004) - return - } - if zb0097 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0097), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "Accounts", zb0004) - return - } - if zb0098 { - (*z).Accounts[zb0004] = nil - } else if (*z).Accounts[zb0004] != nil && cap((*z).Accounts[zb0004]) >= zb0097 { - (*z).Accounts[zb0004] = ((*z).Accounts[zb0004])[:zb0097] - } else { - (*z).Accounts[zb0004] = make(addresses, zb0097) - } - for zb0005 := range (*z).Accounts[zb0004] { - bts, err = (*z).Accounts[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0004, zb0005) - return - } - } - } - case "apatbm": - { - var zb0099 []byte - var zb0100 int - zb0100, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - if zb0100 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0100), uint64(maxBitmaskSize)) - return - } - zb0099, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - (*z).BitmaskAccounts = bitmask(zb0099) - } - case "apfa": - var zb0101 int - var zb0102 bool - zb0101, zb0102, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0101 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0101), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0102 { - (*z).ForeignApps = nil - } else if (*z).ForeignApps != nil && cap((*z).ForeignApps) >= zb0101 { - (*z).ForeignApps = ((*z).ForeignApps)[:zb0101] - } else { - (*z).ForeignApps = make([]appIndices, zb0101) - } - for zb0006 := range (*z).ForeignApps { - var zb0103 int - var zb0104 bool - zb0103, zb0104, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0006) - return - } - if zb0103 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0103), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "ForeignApps", zb0006) - return - } - if zb0104 { - (*z).ForeignApps[zb0006] = nil - } else if (*z).ForeignApps[zb0006] != nil && cap((*z).ForeignApps[zb0006]) >= zb0103 { - (*z).ForeignApps[zb0006] = ((*z).ForeignApps[zb0006])[:zb0103] - } else { - (*z).ForeignApps[zb0006] = make(appIndices, zb0103) - } - for zb0007 := range (*z).ForeignApps[zb0006] { - bts, err = (*z).ForeignApps[zb0006][zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0006, zb0007) - return - } - } - } - case "apfabm": - { - var zb0105 []byte - var zb0106 int - zb0106, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - if zb0106 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0106), uint64(maxBitmaskSize)) - return - } - zb0105, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - (*z).BitmaskForeignApps = bitmask(zb0105) - } - case "apas": - var zb0107 int - var zb0108 bool - zb0107, zb0108, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0107 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0107), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0108 { - (*z).ForeignAssets = nil - } else if (*z).ForeignAssets != nil && cap((*z).ForeignAssets) >= zb0107 { - (*z).ForeignAssets = ((*z).ForeignAssets)[:zb0107] - } else { - (*z).ForeignAssets = make([]assetIndices, zb0107) - } - for zb0008 := range (*z).ForeignAssets { - var zb0109 int - var zb0110 bool - zb0109, zb0110, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0008) - return - } - if zb0109 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0109), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "ForeignAssets", zb0008) - return - } - if zb0110 { - (*z).ForeignAssets[zb0008] = nil - } else if (*z).ForeignAssets[zb0008] != nil && cap((*z).ForeignAssets[zb0008]) >= zb0109 { - (*z).ForeignAssets[zb0008] = ((*z).ForeignAssets[zb0008])[:zb0109] - } else { - (*z).ForeignAssets[zb0008] = make(assetIndices, zb0109) - } - for zb0009 := range (*z).ForeignAssets[zb0008] { - bts, err = (*z).ForeignAssets[zb0008][zb0009].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0008, zb0009) - return - } - } - } - case "apasbm": - { - var zb0111 []byte - var zb0112 int - zb0112, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - if zb0112 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0112), uint64(maxBitmaskSize)) - return - } - zb0111, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - (*z).BitmaskForeignAssets = bitmask(zb0111) - } - case "lnui": - var zb0113 int - var zb0114 bool - zb0113, zb0114, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0113 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0113), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0114 { - (*z).LocalNumUint = nil - } else if (*z).LocalNumUint != nil && cap((*z).LocalNumUint) >= zb0113 { - (*z).LocalNumUint = ((*z).LocalNumUint)[:zb0113] - } else { - (*z).LocalNumUint = make([]uint64, zb0113) - } - for zb0010 := range (*z).LocalNumUint { - (*z).LocalNumUint[zb0010], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint", zb0010) - return - } - } - case "lnuibm": - { - var zb0115 []byte - var zb0116 int - zb0116, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - if zb0116 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0116), uint64(maxBitmaskSize)) - return - } - zb0115, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - (*z).BitmaskLocalNumUint = bitmask(zb0115) - } - case "lnbs": - var zb0117 int - var zb0118 bool - zb0117, zb0118, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0117 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0117), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0118 { - (*z).LocalNumByteSlice = nil - } else if (*z).LocalNumByteSlice != nil && cap((*z).LocalNumByteSlice) >= zb0117 { - (*z).LocalNumByteSlice = ((*z).LocalNumByteSlice)[:zb0117] - } else { - (*z).LocalNumByteSlice = make([]uint64, zb0117) - } - for zb0011 := range (*z).LocalNumByteSlice { - (*z).LocalNumByteSlice[zb0011], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice", zb0011) - return - } - } - case "lnbsbm": - { - var zb0119 []byte - var zb0120 int - zb0120, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - if zb0120 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0120), uint64(maxBitmaskSize)) - return - } - zb0119, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - (*z).BitmaskLocalNumByteSlice = bitmask(zb0119) - } - case "gnui": - var zb0121 int - var zb0122 bool - zb0121, zb0122, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0121 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0121), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0122 { - (*z).GlobalNumUint = nil - } else if (*z).GlobalNumUint != nil && cap((*z).GlobalNumUint) >= zb0121 { - (*z).GlobalNumUint = ((*z).GlobalNumUint)[:zb0121] - } else { - (*z).GlobalNumUint = make([]uint64, zb0121) - } - for zb0012 := range (*z).GlobalNumUint { - (*z).GlobalNumUint[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint", zb0012) - return - } - } - case "gnuibm": - { - var zb0123 []byte - var zb0124 int - zb0124, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - if zb0124 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0124), uint64(maxBitmaskSize)) - return - } - zb0123, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - (*z).BitmaskGlobalNumUint = bitmask(zb0123) - } - case "gnbs": - var zb0125 int - var zb0126 bool - zb0125, zb0126, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0125 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0125), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0126 { - (*z).GlobalNumByteSlice = nil - } else if (*z).GlobalNumByteSlice != nil && cap((*z).GlobalNumByteSlice) >= zb0125 { - (*z).GlobalNumByteSlice = ((*z).GlobalNumByteSlice)[:zb0125] - } else { - (*z).GlobalNumByteSlice = make([]uint64, zb0125) - } - for zb0013 := range (*z).GlobalNumByteSlice { - (*z).GlobalNumByteSlice[zb0013], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice", zb0013) - return - } - } - case "gnbsbm": - { - var zb0127 []byte - var zb0128 int - zb0128, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - if zb0128 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0128), uint64(maxBitmaskSize)) - return - } - zb0127, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - (*z).BitmaskGlobalNumByteSlice = bitmask(zb0127) - } - case "apap": - var zb0129 int - var zb0130 bool - zb0129, zb0130, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0129 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0129), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0130 { - (*z).ApprovalProgram = nil - } else if (*z).ApprovalProgram != nil && cap((*z).ApprovalProgram) >= zb0129 { - (*z).ApprovalProgram = ((*z).ApprovalProgram)[:zb0129] - } else { - (*z).ApprovalProgram = make([]program, zb0129) - } - for zb0014 := range (*z).ApprovalProgram { - { - var zb0131 []byte - var zb0132 int - zb0132, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0014) - return - } - if zb0132 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0132), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0131, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).ApprovalProgram[zb0014])) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0014) - return - } - (*z).ApprovalProgram[zb0014] = program(zb0131) - } - } - case "apapbm": - { - var zb0133 []byte - var zb0134 int - zb0134, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - if zb0134 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0134), uint64(maxBitmaskSize)) - return - } - zb0133, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - (*z).BitmaskApprovalProgram = bitmask(zb0133) - } - case "apsu": - var zb0135 int - var zb0136 bool - zb0135, zb0136, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0135 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0135), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0136 { - (*z).ClearStateProgram = nil - } else if (*z).ClearStateProgram != nil && cap((*z).ClearStateProgram) >= zb0135 { - (*z).ClearStateProgram = ((*z).ClearStateProgram)[:zb0135] - } else { - (*z).ClearStateProgram = make([]program, zb0135) - } - for zb0015 := range (*z).ClearStateProgram { - { - var zb0137 []byte - var zb0138 int - zb0138, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0015) - return - } - if zb0138 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0138), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0137, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).ClearStateProgram[zb0015])) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0015) - return - } - (*z).ClearStateProgram[zb0015] = program(zb0137) - } - } - case "apsubm": - { - var zb0139 []byte - var zb0140 int - zb0140, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - if zb0140 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0140), uint64(maxBitmaskSize)) - return - } - zb0139, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - (*z).BitmaskClearStateProgram = bitmask(zb0139) - } - case "apep": - var zb0141 int - var zb0142 bool - zb0141, zb0142, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0141 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0141), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0142 { - (*z).ExtraProgramPages = nil - } else if (*z).ExtraProgramPages != nil && cap((*z).ExtraProgramPages) >= zb0141 { - (*z).ExtraProgramPages = ((*z).ExtraProgramPages)[:zb0141] - } else { - (*z).ExtraProgramPages = make([]uint32, zb0141) - } - for zb0016 := range (*z).ExtraProgramPages { - (*z).ExtraProgramPages[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages", zb0016) - return - } - } - case "apepbm": - { - var zb0143 []byte - var zb0144 int - zb0144, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - if zb0144 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0144), uint64(maxBitmaskSize)) - return - } - zb0143, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - (*z).BitmaskExtraProgramPages = bitmask(zb0143) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedApplicationCallTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedApplicationCallTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedApplicationCallTxnFields) Msgsize() (s int) { - s = 3 + 5 + msgp.ArrayHeaderSize - for zb0001 := range (*z).ApplicationID { - s += (*z).ApplicationID[zb0001].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskApplicationID)) + 5 + msgp.BytesPrefixSize + len((*z).OnCompletion) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskOnCompletion)) + 5 + msgp.ArrayHeaderSize - for zb0002 := range (*z).ApplicationArgs { - s += msgp.ArrayHeaderSize - for zb0003 := range (*z).ApplicationArgs[zb0002] { - s += msgp.BytesPrefixSize + len((*z).ApplicationArgs[zb0002][zb0003]) - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskApplicationArgs)) + 5 + msgp.ArrayHeaderSize - for zb0004 := range (*z).Accounts { - s += msgp.ArrayHeaderSize - for zb0005 := range (*z).Accounts[zb0004] { - s += (*z).Accounts[zb0004][zb0005].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAccounts)) + 5 + msgp.ArrayHeaderSize - for zb0006 := range (*z).ForeignApps { - s += msgp.ArrayHeaderSize - for zb0007 := range (*z).ForeignApps[zb0006] { - s += (*z).ForeignApps[zb0006][zb0007].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskForeignApps)) + 5 + msgp.ArrayHeaderSize - for zb0008 := range (*z).ForeignAssets { - s += msgp.ArrayHeaderSize - for zb0009 := range (*z).ForeignAssets[zb0008] { - s += (*z).ForeignAssets[zb0008][zb0009].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskForeignAssets)) + 5 + msgp.ArrayHeaderSize + (len((*z).LocalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLocalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).LocalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLocalNumByteSlice)) + 5 + msgp.ArrayHeaderSize + (len((*z).GlobalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskGlobalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).GlobalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskGlobalNumByteSlice)) + 5 + msgp.ArrayHeaderSize - for zb0014 := range (*z).ApprovalProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).ApprovalProgram[zb0014])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskApprovalProgram)) + 5 + msgp.ArrayHeaderSize - for zb0015 := range (*z).ClearStateProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).ClearStateProgram[zb0015])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskClearStateProgram)) + 5 + msgp.ArrayHeaderSize + (len((*z).ExtraProgramPages) * (msgp.Uint32Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskExtraProgramPages)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedApplicationCallTxnFields) MsgIsZero() bool { - return (len((*z).ApplicationID) == 0) && (len((*z).BitmaskApplicationID) == 0) && (len((*z).OnCompletion) == 0) && (len((*z).BitmaskOnCompletion) == 0) && (len((*z).ApplicationArgs) == 0) && (len((*z).BitmaskApplicationArgs) == 0) && (len((*z).Accounts) == 0) && (len((*z).BitmaskAccounts) == 0) && (len((*z).ForeignApps) == 0) && (len((*z).BitmaskForeignApps) == 0) && (len((*z).ForeignAssets) == 0) && (len((*z).BitmaskForeignAssets) == 0) && (len((*z).LocalNumUint) == 0) && (len((*z).BitmaskLocalNumUint) == 0) && (len((*z).LocalNumByteSlice) == 0) && (len((*z).BitmaskLocalNumByteSlice) == 0) && (len((*z).GlobalNumUint) == 0) && (len((*z).BitmaskGlobalNumUint) == 0) && (len((*z).GlobalNumByteSlice) == 0) && (len((*z).BitmaskGlobalNumByteSlice) == 0) && (len((*z).ApprovalProgram) == 0) && (len((*z).BitmaskApprovalProgram) == 0) && (len((*z).ClearStateProgram) == 0) && (len((*z).BitmaskClearStateProgram) == 0) && (len((*z).ExtraProgramPages) == 0) && (len((*z).BitmaskExtraProgramPages) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedAssetConfigTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0007Len := uint32(23) - var zb0007Mask uint32 /* 25 bits */ - if len((*z).encodedAssetParams.MetadataHash) == 0 { - zb0007Len-- - zb0007Mask |= 0x4 - } - if len((*z).encodedAssetParams.BitmaskMetadataHash) == 0 { - zb0007Len-- - zb0007Mask |= 0x8 - } - if len((*z).encodedAssetParams.AssetName) == 0 { - zb0007Len-- - zb0007Mask |= 0x10 - } - if len((*z).encodedAssetParams.BitmaskAssetName) == 0 { - zb0007Len-- - zb0007Mask |= 0x20 - } - if len((*z).encodedAssetParams.URL) == 0 { - zb0007Len-- - zb0007Mask |= 0x40 - } - if len((*z).encodedAssetParams.BitmaskURL) == 0 { - zb0007Len-- - zb0007Mask |= 0x80 - } - if len((*z).encodedAssetParams.Clawback) == 0 { - zb0007Len-- - zb0007Mask |= 0x100 - } - if len((*z).ConfigAsset) == 0 { - zb0007Len-- - zb0007Mask |= 0x200 - } - if len((*z).BitmaskConfigAsset) == 0 { - zb0007Len-- - zb0007Mask |= 0x400 - } - if len((*z).encodedAssetParams.BitmaskClawback) == 0 { - zb0007Len-- - zb0007Mask |= 0x800 - } - if len((*z).encodedAssetParams.Decimals) == 0 { - zb0007Len-- - zb0007Mask |= 0x1000 - } - if len((*z).encodedAssetParams.BitmaskDecimals) == 0 { - zb0007Len-- - zb0007Mask |= 0x2000 - } - if len((*z).encodedAssetParams.BitmaskDefaultFrozen) == 0 { - zb0007Len-- - zb0007Mask |= 0x4000 - } - if len((*z).encodedAssetParams.Freeze) == 0 { - zb0007Len-- - zb0007Mask |= 0x8000 - } - if len((*z).encodedAssetParams.BitmaskFreeze) == 0 { - zb0007Len-- - zb0007Mask |= 0x10000 - } - if len((*z).encodedAssetParams.Manager) == 0 { - zb0007Len-- - zb0007Mask |= 0x20000 - } - if len((*z).encodedAssetParams.BitmaskManager) == 0 { - zb0007Len-- - zb0007Mask |= 0x40000 - } - if len((*z).encodedAssetParams.Reserve) == 0 { - zb0007Len-- - zb0007Mask |= 0x80000 - } - if len((*z).encodedAssetParams.BitmaskReserve) == 0 { - zb0007Len-- - zb0007Mask |= 0x100000 - } - if len((*z).encodedAssetParams.Total) == 0 { - zb0007Len-- - zb0007Mask |= 0x200000 - } - if len((*z).encodedAssetParams.BitmaskTotal) == 0 { - zb0007Len-- - zb0007Mask |= 0x400000 - } - if len((*z).encodedAssetParams.UnitName) == 0 { - zb0007Len-- - zb0007Mask |= 0x800000 - } - if len((*z).encodedAssetParams.BitmaskUnitName) == 0 { - zb0007Len-- - zb0007Mask |= 0x1000000 - } - // variable map header, size zb0007Len - o = msgp.AppendMapHeader(o, zb0007Len) - if zb0007Len != 0 { - if (zb0007Mask & 0x4) == 0 { // if not empty - // string "am" - o = append(o, 0xa2, 0x61, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedAssetParams.MetadataHash) - } - if (zb0007Mask & 0x8) == 0 { // if not empty - // string "ambm" - o = append(o, 0xa4, 0x61, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskMetadataHash)) - } - if (zb0007Mask & 0x10) == 0 { // if not empty - // string "an" - o = append(o, 0xa2, 0x61, 0x6e) - if (*z).encodedAssetParams.AssetName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetParams.AssetName))) - } - for zb0005 := range (*z).encodedAssetParams.AssetName { - o = msgp.AppendString(o, (*z).encodedAssetParams.AssetName[zb0005]) - } - } - if (zb0007Mask & 0x20) == 0 { // if not empty - // string "anbm" - o = append(o, 0xa4, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskAssetName)) - } - if (zb0007Mask & 0x40) == 0 { // if not empty - // string "au" - o = append(o, 0xa2, 0x61, 0x75) - if (*z).encodedAssetParams.URL == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetParams.URL))) - } - for zb0006 := range (*z).encodedAssetParams.URL { - o = msgp.AppendString(o, (*z).encodedAssetParams.URL[zb0006]) - } - } - if (zb0007Mask & 0x80) == 0 { // if not empty - // string "aubm" - o = append(o, 0xa4, 0x61, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskURL)) - } - if (zb0007Mask & 0x100) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendBytes(o, (*z).encodedAssetParams.Clawback) - } - if (zb0007Mask & 0x200) == 0 { // if not empty - // string "caid" - o = append(o, 0xa4, 0x63, 0x61, 0x69, 0x64) - if (*z).ConfigAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).ConfigAsset))) - } - for zb0001 := range (*z).ConfigAsset { - o = (*z).ConfigAsset[zb0001].MarshalMsg(o) - } - } - if (zb0007Mask & 0x400) == 0 { // if not empty - // string "caidbm" - o = append(o, 0xa6, 0x63, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskConfigAsset)) - } - if (zb0007Mask & 0x800) == 0 { // if not empty - // string "cbm" - o = append(o, 0xa3, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskClawback)) - } - if (zb0007Mask & 0x1000) == 0 { // if not empty - // string "dc" - o = append(o, 0xa2, 0x64, 0x63) - if (*z).encodedAssetParams.Decimals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetParams.Decimals))) - } - for zb0003 := range (*z).encodedAssetParams.Decimals { - o = msgp.AppendUint32(o, (*z).encodedAssetParams.Decimals[zb0003]) - } - } - if (zb0007Mask & 0x2000) == 0 { // if not empty - // string "dcbm" - o = append(o, 0xa4, 0x64, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskDecimals)) - } - if (zb0007Mask & 0x4000) == 0 { // if not empty - // string "dfbm" - o = append(o, 0xa4, 0x64, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskDefaultFrozen)) - } - if (zb0007Mask & 0x8000) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).encodedAssetParams.Freeze) - } - if (zb0007Mask & 0x10000) == 0 { // if not empty - // string "fbm" - o = append(o, 0xa3, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskFreeze)) - } - if (zb0007Mask & 0x20000) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedAssetParams.Manager) - } - if (zb0007Mask & 0x40000) == 0 { // if not empty - // string "mbm" - o = append(o, 0xa3, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskManager)) - } - if (zb0007Mask & 0x80000) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendBytes(o, (*z).encodedAssetParams.Reserve) - } - if (zb0007Mask & 0x100000) == 0 { // if not empty - // string "rbm" - o = append(o, 0xa3, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskReserve)) - } - if (zb0007Mask & 0x200000) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).encodedAssetParams.Total == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetParams.Total))) - } - for zb0002 := range (*z).encodedAssetParams.Total { - o = msgp.AppendUint64(o, (*z).encodedAssetParams.Total[zb0002]) - } - } - if (zb0007Mask & 0x400000) == 0 { // if not empty - // string "tbm" - o = append(o, 0xa3, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskTotal)) - } - if (zb0007Mask & 0x800000) == 0 { // if not empty - // string "un" - o = append(o, 0xa2, 0x75, 0x6e) - if (*z).encodedAssetParams.UnitName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetParams.UnitName))) - } - for zb0004 := range (*z).encodedAssetParams.UnitName { - o = msgp.AppendString(o, (*z).encodedAssetParams.UnitName[zb0004]) - } - } - if (zb0007Mask & 0x1000000) == 0 { // if not empty - // string "unbm" - o = append(o, 0xa4, 0x75, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetParams.BitmaskUnitName)) - } - } - return -} - -func (_ *encodedAssetConfigTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetConfigTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedAssetConfigTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0007 int - var zb0008 bool - zb0007, zb0008, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0007, zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0007 > 0 { - zb0007-- - var zb0009 int - var zb0010 bool - zb0009, zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0009 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0009), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0010 { - (*z).ConfigAsset = nil - } else if (*z).ConfigAsset != nil && cap((*z).ConfigAsset) >= zb0009 { - (*z).ConfigAsset = ((*z).ConfigAsset)[:zb0009] - } else { - (*z).ConfigAsset = make([]basics.AssetIndex, zb0009) - } - for zb0001 := range (*z).ConfigAsset { - bts, err = (*z).ConfigAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset", zb0001) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0011 []byte - var zb0012 int - zb0012, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - if zb0012 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0012), uint64(maxBitmaskSize)) - return - } - zb0011, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - (*z).BitmaskConfigAsset = bitmask(zb0011) - } - } - if zb0007 > 0 { - zb0007-- - var zb0013 int - var zb0014 bool - zb0013, zb0014, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0013 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0014 { - (*z).encodedAssetParams.Total = nil - } else if (*z).encodedAssetParams.Total != nil && cap((*z).encodedAssetParams.Total) >= zb0013 { - (*z).encodedAssetParams.Total = ((*z).encodedAssetParams.Total)[:zb0013] - } else { - (*z).encodedAssetParams.Total = make([]uint64, zb0013) - } - for zb0002 := range (*z).encodedAssetParams.Total { - (*z).encodedAssetParams.Total[zb0002], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total", zb0002) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0015 []byte - var zb0016 int - zb0016, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - if zb0016 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxBitmaskSize)) - return - } - zb0015, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - (*z).encodedAssetParams.BitmaskTotal = bitmask(zb0015) - } - } - if zb0007 > 0 { - zb0007-- - var zb0017 int - var zb0018 bool - zb0017, zb0018, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0017 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0018 { - (*z).encodedAssetParams.Decimals = nil - } else if (*z).encodedAssetParams.Decimals != nil && cap((*z).encodedAssetParams.Decimals) >= zb0017 { - (*z).encodedAssetParams.Decimals = ((*z).encodedAssetParams.Decimals)[:zb0017] - } else { - (*z).encodedAssetParams.Decimals = make([]uint32, zb0017) - } - for zb0003 := range (*z).encodedAssetParams.Decimals { - (*z).encodedAssetParams.Decimals[zb0003], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals", zb0003) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0019 []byte - var zb0020 int - zb0020, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - if zb0020 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0020), uint64(maxBitmaskSize)) - return - } - zb0019, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - (*z).encodedAssetParams.BitmaskDecimals = bitmask(zb0019) - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0021 []byte - var zb0022 int - zb0022, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - if zb0022 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxBitmaskSize)) - return - } - zb0021, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - (*z).encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0021) - } - } - if zb0007 > 0 { - zb0007-- - var zb0023 int - var zb0024 bool - zb0023, zb0024, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0023 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0024 { - (*z).encodedAssetParams.UnitName = nil - } else if (*z).encodedAssetParams.UnitName != nil && cap((*z).encodedAssetParams.UnitName) >= zb0023 { - (*z).encodedAssetParams.UnitName = ((*z).encodedAssetParams.UnitName)[:zb0023] - } else { - (*z).encodedAssetParams.UnitName = make([]string, zb0023) - } - for zb0004 := range (*z).encodedAssetParams.UnitName { - (*z).encodedAssetParams.UnitName[zb0004], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName", zb0004) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0025 []byte - var zb0026 int - zb0026, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - if zb0026 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0026), uint64(maxBitmaskSize)) - return - } - zb0025, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - (*z).encodedAssetParams.BitmaskUnitName = bitmask(zb0025) - } - } - if zb0007 > 0 { - zb0007-- - var zb0027 int - var zb0028 bool - zb0027, zb0028, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0027 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0027), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0028 { - (*z).encodedAssetParams.AssetName = nil - } else if (*z).encodedAssetParams.AssetName != nil && cap((*z).encodedAssetParams.AssetName) >= zb0027 { - (*z).encodedAssetParams.AssetName = ((*z).encodedAssetParams.AssetName)[:zb0027] - } else { - (*z).encodedAssetParams.AssetName = make([]string, zb0027) - } - for zb0005 := range (*z).encodedAssetParams.AssetName { - (*z).encodedAssetParams.AssetName[zb0005], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName", zb0005) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0029 []byte - var zb0030 int - zb0030, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - if zb0030 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0030), uint64(maxBitmaskSize)) - return - } - zb0029, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - (*z).encodedAssetParams.BitmaskAssetName = bitmask(zb0029) - } - } - if zb0007 > 0 { - zb0007-- - var zb0031 int - var zb0032 bool - zb0031, zb0032, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0031 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0031), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0032 { - (*z).encodedAssetParams.URL = nil - } else if (*z).encodedAssetParams.URL != nil && cap((*z).encodedAssetParams.URL) >= zb0031 { - (*z).encodedAssetParams.URL = ((*z).encodedAssetParams.URL)[:zb0031] - } else { - (*z).encodedAssetParams.URL = make([]string, zb0031) - } - for zb0006 := range (*z).encodedAssetParams.URL { - (*z).encodedAssetParams.URL[zb0006], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL", zb0006) - return - } - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0033 []byte - var zb0034 int - zb0034, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - if zb0034 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0034), uint64(maxBitmaskSize)) - return - } - zb0033, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - (*z).encodedAssetParams.BitmaskURL = bitmask(zb0033) - } - } - if zb0007 > 0 { - zb0007-- - var zb0035 int - zb0035, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - if zb0035 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0035), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0036 []byte - var zb0037 int - zb0037, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - if zb0037 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0037), uint64(maxBitmaskSize)) - return - } - zb0036, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - (*z).encodedAssetParams.BitmaskMetadataHash = bitmask(zb0036) - } - } - if zb0007 > 0 { - zb0007-- - var zb0038 int - zb0038, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - if zb0038 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0038), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0039 []byte - var zb0040 int - zb0040, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - if zb0040 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0040), uint64(maxBitmaskSize)) - return - } - zb0039, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - (*z).encodedAssetParams.BitmaskManager = bitmask(zb0039) - } - } - if zb0007 > 0 { - zb0007-- - var zb0041 int - zb0041, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - if zb0041 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0041), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0042 []byte - var zb0043 int - zb0043, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - if zb0043 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0043), uint64(maxBitmaskSize)) - return - } - zb0042, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - (*z).encodedAssetParams.BitmaskReserve = bitmask(zb0042) - } - } - if zb0007 > 0 { - zb0007-- - var zb0044 int - zb0044, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - if zb0044 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0044), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0045 []byte - var zb0046 int - zb0046, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - if zb0046 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0046), uint64(maxBitmaskSize)) - return - } - zb0045, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - (*z).encodedAssetParams.BitmaskFreeze = bitmask(zb0045) - } - } - if zb0007 > 0 { - zb0007-- - var zb0047 int - zb0047, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - if zb0047 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0047), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - } - if zb0007 > 0 { - zb0007-- - { - var zb0048 []byte - var zb0049 int - zb0049, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - if zb0049 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxBitmaskSize)) - return - } - zb0048, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - (*z).encodedAssetParams.BitmaskClawback = bitmask(zb0048) - } - } - if zb0007 > 0 { - err = msgp.ErrTooManyArrayFields(zb0007) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0008 { - (*z) = encodedAssetConfigTxnFields{} - } - for zb0007 > 0 { - zb0007-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "caid": - var zb0050 int - var zb0051 bool - zb0050, zb0051, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0050 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0050), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0051 { - (*z).ConfigAsset = nil - } else if (*z).ConfigAsset != nil && cap((*z).ConfigAsset) >= zb0050 { - (*z).ConfigAsset = ((*z).ConfigAsset)[:zb0050] - } else { - (*z).ConfigAsset = make([]basics.AssetIndex, zb0050) - } - for zb0001 := range (*z).ConfigAsset { - bts, err = (*z).ConfigAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset", zb0001) - return - } - } - case "caidbm": - { - var zb0052 []byte - var zb0053 int - zb0053, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - if zb0053 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0053), uint64(maxBitmaskSize)) - return - } - zb0052, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - (*z).BitmaskConfigAsset = bitmask(zb0052) - } - case "t": - var zb0054 int - var zb0055 bool - zb0054, zb0055, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total") - return - } - if zb0054 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Total") - return - } - if zb0055 { - (*z).encodedAssetParams.Total = nil - } else if (*z).encodedAssetParams.Total != nil && cap((*z).encodedAssetParams.Total) >= zb0054 { - (*z).encodedAssetParams.Total = ((*z).encodedAssetParams.Total)[:zb0054] - } else { - (*z).encodedAssetParams.Total = make([]uint64, zb0054) - } - for zb0002 := range (*z).encodedAssetParams.Total { - (*z).encodedAssetParams.Total[zb0002], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total", zb0002) - return - } - } - case "tbm": - { - var zb0056 []byte - var zb0057 int - zb0057, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - if zb0057 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0057), uint64(maxBitmaskSize)) - return - } - zb0056, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - (*z).encodedAssetParams.BitmaskTotal = bitmask(zb0056) - } - case "dc": - var zb0058 int - var zb0059 bool - zb0058, zb0059, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals") - return - } - if zb0058 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0058), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Decimals") - return - } - if zb0059 { - (*z).encodedAssetParams.Decimals = nil - } else if (*z).encodedAssetParams.Decimals != nil && cap((*z).encodedAssetParams.Decimals) >= zb0058 { - (*z).encodedAssetParams.Decimals = ((*z).encodedAssetParams.Decimals)[:zb0058] - } else { - (*z).encodedAssetParams.Decimals = make([]uint32, zb0058) - } - for zb0003 := range (*z).encodedAssetParams.Decimals { - (*z).encodedAssetParams.Decimals[zb0003], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals", zb0003) - return - } - } - case "dcbm": - { - var zb0060 []byte - var zb0061 int - zb0061, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - if zb0061 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0061), uint64(maxBitmaskSize)) - return - } - zb0060, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - (*z).encodedAssetParams.BitmaskDecimals = bitmask(zb0060) - } - case "dfbm": - { - var zb0062 []byte - var zb0063 int - zb0063, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - if zb0063 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0063), uint64(maxBitmaskSize)) - return - } - zb0062, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - (*z).encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0062) - } - case "un": - var zb0064 int - var zb0065 bool - zb0064, zb0065, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName") - return - } - if zb0064 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0064), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "UnitName") - return - } - if zb0065 { - (*z).encodedAssetParams.UnitName = nil - } else if (*z).encodedAssetParams.UnitName != nil && cap((*z).encodedAssetParams.UnitName) >= zb0064 { - (*z).encodedAssetParams.UnitName = ((*z).encodedAssetParams.UnitName)[:zb0064] - } else { - (*z).encodedAssetParams.UnitName = make([]string, zb0064) - } - for zb0004 := range (*z).encodedAssetParams.UnitName { - (*z).encodedAssetParams.UnitName[zb0004], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName", zb0004) - return - } - } - case "unbm": - { - var zb0066 []byte - var zb0067 int - zb0067, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - if zb0067 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0067), uint64(maxBitmaskSize)) - return - } - zb0066, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - (*z).encodedAssetParams.BitmaskUnitName = bitmask(zb0066) - } - case "an": - var zb0068 int - var zb0069 bool - zb0068, zb0069, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName") - return - } - if zb0068 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0068), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetName") - return - } - if zb0069 { - (*z).encodedAssetParams.AssetName = nil - } else if (*z).encodedAssetParams.AssetName != nil && cap((*z).encodedAssetParams.AssetName) >= zb0068 { - (*z).encodedAssetParams.AssetName = ((*z).encodedAssetParams.AssetName)[:zb0068] - } else { - (*z).encodedAssetParams.AssetName = make([]string, zb0068) - } - for zb0005 := range (*z).encodedAssetParams.AssetName { - (*z).encodedAssetParams.AssetName[zb0005], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName", zb0005) - return - } - } - case "anbm": - { - var zb0070 []byte - var zb0071 int - zb0071, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - if zb0071 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0071), uint64(maxBitmaskSize)) - return - } - zb0070, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - (*z).encodedAssetParams.BitmaskAssetName = bitmask(zb0070) - } - case "au": - var zb0072 int - var zb0073 bool - zb0072, zb0073, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL") - return - } - if zb0072 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "URL") - return - } - if zb0073 { - (*z).encodedAssetParams.URL = nil - } else if (*z).encodedAssetParams.URL != nil && cap((*z).encodedAssetParams.URL) >= zb0072 { - (*z).encodedAssetParams.URL = ((*z).encodedAssetParams.URL)[:zb0072] - } else { - (*z).encodedAssetParams.URL = make([]string, zb0072) - } - for zb0006 := range (*z).encodedAssetParams.URL { - (*z).encodedAssetParams.URL[zb0006], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL", zb0006) - return - } - } - case "aubm": - { - var zb0074 []byte - var zb0075 int - zb0075, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - if zb0075 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0075), uint64(maxBitmaskSize)) - return - } - zb0074, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - (*z).encodedAssetParams.BitmaskURL = bitmask(zb0074) - } - case "am": - var zb0076 int - zb0076, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - if zb0076 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0076), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - case "ambm": - { - var zb0077 []byte - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - if zb0078 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxBitmaskSize)) - return - } - zb0077, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - (*z).encodedAssetParams.BitmaskMetadataHash = bitmask(zb0077) - } - case "m": - var zb0079 int - zb0079, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - if zb0079 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0079), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - case "mbm": - { - var zb0080 []byte - var zb0081 int - zb0081, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - if zb0081 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxBitmaskSize)) - return - } - zb0080, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - (*z).encodedAssetParams.BitmaskManager = bitmask(zb0080) - } - case "r": - var zb0082 int - zb0082, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - if zb0082 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0082), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - case "rbm": - { - var zb0083 []byte - var zb0084 int - zb0084, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - if zb0084 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0084), uint64(maxBitmaskSize)) - return - } - zb0083, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - (*z).encodedAssetParams.BitmaskReserve = bitmask(zb0083) - } - case "f": - var zb0085 int - zb0085, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - if zb0085 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0085), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - case "fbm": - { - var zb0086 []byte - var zb0087 int - zb0087, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - if zb0087 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0087), uint64(maxBitmaskSize)) - return - } - zb0086, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - (*z).encodedAssetParams.BitmaskFreeze = bitmask(zb0086) - } - case "c": - var zb0088 int - zb0088, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - if zb0088 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0088), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - case "cbm": - { - var zb0089 []byte - var zb0090 int - zb0090, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - if zb0090 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0090), uint64(maxBitmaskSize)) - return - } - zb0089, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - (*z).encodedAssetParams.BitmaskClawback = bitmask(zb0089) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedAssetConfigTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetConfigTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedAssetConfigTxnFields) Msgsize() (s int) { - s = 3 + 5 + msgp.ArrayHeaderSize - for zb0001 := range (*z).ConfigAsset { - s += (*z).ConfigAsset[zb0001].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskConfigAsset)) + 2 + msgp.ArrayHeaderSize + (len((*z).encodedAssetParams.Total) * (msgp.Uint64Size)) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskTotal)) + 3 + msgp.ArrayHeaderSize + (len((*z).encodedAssetParams.Decimals) * (msgp.Uint32Size)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskDecimals)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskDefaultFrozen)) + 3 + msgp.ArrayHeaderSize - for zb0004 := range (*z).encodedAssetParams.UnitName { - s += msgp.StringPrefixSize + len((*z).encodedAssetParams.UnitName[zb0004]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskUnitName)) + 3 + msgp.ArrayHeaderSize - for zb0005 := range (*z).encodedAssetParams.AssetName { - s += msgp.StringPrefixSize + len((*z).encodedAssetParams.AssetName[zb0005]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskAssetName)) + 3 + msgp.ArrayHeaderSize - for zb0006 := range (*z).encodedAssetParams.URL { - s += msgp.StringPrefixSize + len((*z).encodedAssetParams.URL[zb0006]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskURL)) + 3 + msgp.BytesPrefixSize + len((*z).encodedAssetParams.MetadataHash) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskMetadataHash)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetParams.Manager) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskManager)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetParams.Reserve) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskReserve)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetParams.Freeze) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskFreeze)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetParams.Clawback) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetParams.BitmaskClawback)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedAssetConfigTxnFields) MsgIsZero() bool { - return (len((*z).ConfigAsset) == 0) && (len((*z).BitmaskConfigAsset) == 0) && (len((*z).encodedAssetParams.Total) == 0) && (len((*z).encodedAssetParams.BitmaskTotal) == 0) && (len((*z).encodedAssetParams.Decimals) == 0) && (len((*z).encodedAssetParams.BitmaskDecimals) == 0) && (len((*z).encodedAssetParams.BitmaskDefaultFrozen) == 0) && (len((*z).encodedAssetParams.UnitName) == 0) && (len((*z).encodedAssetParams.BitmaskUnitName) == 0) && (len((*z).encodedAssetParams.AssetName) == 0) && (len((*z).encodedAssetParams.BitmaskAssetName) == 0) && (len((*z).encodedAssetParams.URL) == 0) && (len((*z).encodedAssetParams.BitmaskURL) == 0) && (len((*z).encodedAssetParams.MetadataHash) == 0) && (len((*z).encodedAssetParams.BitmaskMetadataHash) == 0) && (len((*z).encodedAssetParams.Manager) == 0) && (len((*z).encodedAssetParams.BitmaskManager) == 0) && (len((*z).encodedAssetParams.Reserve) == 0) && (len((*z).encodedAssetParams.BitmaskReserve) == 0) && (len((*z).encodedAssetParams.Freeze) == 0) && (len((*z).encodedAssetParams.BitmaskFreeze) == 0) && (len((*z).encodedAssetParams.Clawback) == 0) && (len((*z).encodedAssetParams.BitmaskClawback) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedAssetFreezeTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0002Len := uint32(5) - var zb0002Mask uint8 /* 6 bits */ - if len((*z).BitmaskAssetFrozen) == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - if len((*z).FreezeAccount) == 0 { - zb0002Len-- - zb0002Mask |= 0x4 - } - if len((*z).BitmaskFreezeAccount) == 0 { - zb0002Len-- - zb0002Mask |= 0x8 - } - if len((*z).FreezeAsset) == 0 { - zb0002Len-- - zb0002Mask |= 0x10 - } - if len((*z).BitmaskFreezeAsset) == 0 { - zb0002Len-- - zb0002Mask |= 0x20 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if zb0002Len != 0 { - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "afrzbm" - o = append(o, 0xa6, 0x61, 0x66, 0x72, 0x7a, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetFrozen)) - } - if (zb0002Mask & 0x4) == 0 { // if not empty - // string "fadd" - o = append(o, 0xa4, 0x66, 0x61, 0x64, 0x64) - o = msgp.AppendBytes(o, (*z).FreezeAccount) - } - if (zb0002Mask & 0x8) == 0 { // if not empty - // string "faddbm" - o = append(o, 0xa6, 0x66, 0x61, 0x64, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskFreezeAccount)) - } - if (zb0002Mask & 0x10) == 0 { // if not empty - // string "faid" - o = append(o, 0xa4, 0x66, 0x61, 0x69, 0x64) - if (*z).FreezeAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).FreezeAsset))) - } - for zb0001 := range (*z).FreezeAsset { - o = (*z).FreezeAsset[zb0001].MarshalMsg(o) - } - } - if (zb0002Mask & 0x20) == 0 { // if not empty - // string "faidbm" - o = append(o, 0xa6, 0x66, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskFreezeAsset)) - } - } - return -} - -func (_ *encodedAssetFreezeTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetFreezeTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedAssetFreezeTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > 0 { - zb0002-- - var zb0004 int - zb0004, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - if zb0004 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxAddressBytes)) - return - } - (*z).FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0005 []byte - var zb0006 int - zb0006, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - if zb0006 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxBitmaskSize)) - return - } - zb0005, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - (*z).BitmaskFreezeAccount = bitmask(zb0005) - } - } - if zb0002 > 0 { - zb0002-- - var zb0007 int - var zb0008 bool - zb0007, zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0007 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0008 { - (*z).FreezeAsset = nil - } else if (*z).FreezeAsset != nil && cap((*z).FreezeAsset) >= zb0007 { - (*z).FreezeAsset = ((*z).FreezeAsset)[:zb0007] - } else { - (*z).FreezeAsset = make([]basics.AssetIndex, zb0007) - } - for zb0001 := range (*z).FreezeAsset { - bts, err = (*z).FreezeAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset", zb0001) - return - } - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0009 []byte - var zb0010 int - zb0010, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - if zb0010 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0010), uint64(maxBitmaskSize)) - return - } - zb0009, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - (*z).BitmaskFreezeAsset = bitmask(zb0009) - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0011 []byte - var zb0012 int - zb0012, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - if zb0012 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0012), uint64(maxBitmaskSize)) - return - } - zb0011, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - (*z).BitmaskAssetFrozen = bitmask(zb0011) - } - } - if zb0002 > 0 { - err = msgp.ErrTooManyArrayFields(zb0002) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = encodedAssetFreezeTxnFields{} - } - for zb0002 > 0 { - zb0002-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "fadd": - var zb0013 int - zb0013, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - if zb0013 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxAddressBytes)) - return - } - (*z).FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - case "faddbm": - { - var zb0014 []byte - var zb0015 int - zb0015, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - if zb0015 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0015), uint64(maxBitmaskSize)) - return - } - zb0014, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - (*z).BitmaskFreezeAccount = bitmask(zb0014) - } - case "faid": - var zb0016 int - var zb0017 bool - zb0016, zb0017, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0016 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0017 { - (*z).FreezeAsset = nil - } else if (*z).FreezeAsset != nil && cap((*z).FreezeAsset) >= zb0016 { - (*z).FreezeAsset = ((*z).FreezeAsset)[:zb0016] - } else { - (*z).FreezeAsset = make([]basics.AssetIndex, zb0016) - } - for zb0001 := range (*z).FreezeAsset { - bts, err = (*z).FreezeAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset", zb0001) - return - } - } - case "faidbm": - { - var zb0018 []byte - var zb0019 int - zb0019, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - if zb0019 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0019), uint64(maxBitmaskSize)) - return - } - zb0018, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - (*z).BitmaskFreezeAsset = bitmask(zb0018) - } - case "afrzbm": - { - var zb0020 []byte - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - if zb0021 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxBitmaskSize)) - return - } - zb0020, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - (*z).BitmaskAssetFrozen = bitmask(zb0020) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedAssetFreezeTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetFreezeTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedAssetFreezeTxnFields) Msgsize() (s int) { - s = 1 + 5 + msgp.BytesPrefixSize + len((*z).FreezeAccount) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskFreezeAccount)) + 5 + msgp.ArrayHeaderSize - for zb0001 := range (*z).FreezeAsset { - s += (*z).FreezeAsset[zb0001].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskFreezeAsset)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetFrozen)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedAssetFreezeTxnFields) MsgIsZero() bool { - return (len((*z).FreezeAccount) == 0) && (len((*z).BitmaskFreezeAccount) == 0) && (len((*z).FreezeAsset) == 0) && (len((*z).BitmaskFreezeAsset) == 0) && (len((*z).BitmaskAssetFrozen) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedAssetParams) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0006Len := uint32(21) - var zb0006Mask uint32 /* 22 bits */ - if len((*z).MetadataHash) == 0 { - zb0006Len-- - zb0006Mask |= 0x2 - } - if len((*z).BitmaskMetadataHash) == 0 { - zb0006Len-- - zb0006Mask |= 0x4 - } - if len((*z).AssetName) == 0 { - zb0006Len-- - zb0006Mask |= 0x8 - } - if len((*z).BitmaskAssetName) == 0 { - zb0006Len-- - zb0006Mask |= 0x10 - } - if len((*z).URL) == 0 { - zb0006Len-- - zb0006Mask |= 0x20 - } - if len((*z).BitmaskURL) == 0 { - zb0006Len-- - zb0006Mask |= 0x40 - } - if len((*z).Clawback) == 0 { - zb0006Len-- - zb0006Mask |= 0x80 - } - if len((*z).BitmaskClawback) == 0 { - zb0006Len-- - zb0006Mask |= 0x100 - } - if len((*z).Decimals) == 0 { - zb0006Len-- - zb0006Mask |= 0x200 - } - if len((*z).BitmaskDecimals) == 0 { - zb0006Len-- - zb0006Mask |= 0x400 - } - if len((*z).BitmaskDefaultFrozen) == 0 { - zb0006Len-- - zb0006Mask |= 0x800 - } - if len((*z).Freeze) == 0 { - zb0006Len-- - zb0006Mask |= 0x1000 - } - if len((*z).BitmaskFreeze) == 0 { - zb0006Len-- - zb0006Mask |= 0x2000 - } - if len((*z).Manager) == 0 { - zb0006Len-- - zb0006Mask |= 0x4000 - } - if len((*z).BitmaskManager) == 0 { - zb0006Len-- - zb0006Mask |= 0x8000 - } - if len((*z).Reserve) == 0 { - zb0006Len-- - zb0006Mask |= 0x10000 - } - if len((*z).BitmaskReserve) == 0 { - zb0006Len-- - zb0006Mask |= 0x20000 - } - if len((*z).Total) == 0 { - zb0006Len-- - zb0006Mask |= 0x40000 - } - if len((*z).BitmaskTotal) == 0 { - zb0006Len-- - zb0006Mask |= 0x80000 - } - if len((*z).UnitName) == 0 { - zb0006Len-- - zb0006Mask |= 0x100000 - } - if len((*z).BitmaskUnitName) == 0 { - zb0006Len-- - zb0006Mask |= 0x200000 - } - // variable map header, size zb0006Len - o = msgp.AppendMapHeader(o, zb0006Len) - if zb0006Len != 0 { - if (zb0006Mask & 0x2) == 0 { // if not empty - // string "am" - o = append(o, 0xa2, 0x61, 0x6d) - o = msgp.AppendBytes(o, (*z).MetadataHash) - } - if (zb0006Mask & 0x4) == 0 { // if not empty - // string "ambm" - o = append(o, 0xa4, 0x61, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskMetadataHash)) - } - if (zb0006Mask & 0x8) == 0 { // if not empty - // string "an" - o = append(o, 0xa2, 0x61, 0x6e) - if (*z).AssetName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).AssetName))) - } - for zb0004 := range (*z).AssetName { - o = msgp.AppendString(o, (*z).AssetName[zb0004]) - } - } - if (zb0006Mask & 0x10) == 0 { // if not empty - // string "anbm" - o = append(o, 0xa4, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetName)) - } - if (zb0006Mask & 0x20) == 0 { // if not empty - // string "au" - o = append(o, 0xa2, 0x61, 0x75) - if (*z).URL == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).URL))) - } - for zb0005 := range (*z).URL { - o = msgp.AppendString(o, (*z).URL[zb0005]) - } - } - if (zb0006Mask & 0x40) == 0 { // if not empty - // string "aubm" - o = append(o, 0xa4, 0x61, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskURL)) - } - if (zb0006Mask & 0x80) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendBytes(o, (*z).Clawback) - } - if (zb0006Mask & 0x100) == 0 { // if not empty - // string "cbm" - o = append(o, 0xa3, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskClawback)) - } - if (zb0006Mask & 0x200) == 0 { // if not empty - // string "dc" - o = append(o, 0xa2, 0x64, 0x63) - if (*z).Decimals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Decimals))) - } - for zb0002 := range (*z).Decimals { - o = msgp.AppendUint32(o, (*z).Decimals[zb0002]) - } - } - if (zb0006Mask & 0x400) == 0 { // if not empty - // string "dcbm" - o = append(o, 0xa4, 0x64, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskDecimals)) - } - if (zb0006Mask & 0x800) == 0 { // if not empty - // string "dfbm" - o = append(o, 0xa4, 0x64, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskDefaultFrozen)) - } - if (zb0006Mask & 0x1000) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).Freeze) - } - if (zb0006Mask & 0x2000) == 0 { // if not empty - // string "fbm" - o = append(o, 0xa3, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskFreeze)) - } - if (zb0006Mask & 0x4000) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendBytes(o, (*z).Manager) - } - if (zb0006Mask & 0x8000) == 0 { // if not empty - // string "mbm" - o = append(o, 0xa3, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskManager)) - } - if (zb0006Mask & 0x10000) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendBytes(o, (*z).Reserve) - } - if (zb0006Mask & 0x20000) == 0 { // if not empty - // string "rbm" - o = append(o, 0xa3, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskReserve)) - } - if (zb0006Mask & 0x40000) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).Total == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Total))) - } - for zb0001 := range (*z).Total { - o = msgp.AppendUint64(o, (*z).Total[zb0001]) - } - } - if (zb0006Mask & 0x80000) == 0 { // if not empty - // string "tbm" - o = append(o, 0xa3, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskTotal)) - } - if (zb0006Mask & 0x100000) == 0 { // if not empty - // string "un" - o = append(o, 0xa2, 0x75, 0x6e) - if (*z).UnitName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).UnitName))) - } - for zb0003 := range (*z).UnitName { - o = msgp.AppendString(o, (*z).UnitName[zb0003]) - } - } - if (zb0006Mask & 0x200000) == 0 { // if not empty - // string "unbm" - o = append(o, 0xa4, 0x75, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskUnitName)) - } - } - return -} - -func (_ *encodedAssetParams) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetParams) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedAssetParams) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0006 int - var zb0007 bool - zb0006, zb0007, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0006 > 0 { - zb0006-- - var zb0008 int - var zb0009 bool - zb0008, zb0009, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0008 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0008), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0009 { - (*z).Total = nil - } else if (*z).Total != nil && cap((*z).Total) >= zb0008 { - (*z).Total = ((*z).Total)[:zb0008] - } else { - (*z).Total = make([]uint64, zb0008) - } - for zb0001 := range (*z).Total { - (*z).Total[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total", zb0001) - return - } - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0010 []byte - var zb0011 int - zb0011, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - if zb0011 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxBitmaskSize)) - return - } - zb0010, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - (*z).BitmaskTotal = bitmask(zb0010) - } - } - if zb0006 > 0 { - zb0006-- - var zb0012 int - var zb0013 bool - zb0012, zb0013, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0012 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0012), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0013 { - (*z).Decimals = nil - } else if (*z).Decimals != nil && cap((*z).Decimals) >= zb0012 { - (*z).Decimals = ((*z).Decimals)[:zb0012] - } else { - (*z).Decimals = make([]uint32, zb0012) - } - for zb0002 := range (*z).Decimals { - (*z).Decimals[zb0002], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals", zb0002) - return - } - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0014 []byte - var zb0015 int - zb0015, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - if zb0015 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0015), uint64(maxBitmaskSize)) - return - } - zb0014, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - (*z).BitmaskDecimals = bitmask(zb0014) - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0016 []byte - var zb0017 int - zb0017, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - if zb0017 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxBitmaskSize)) - return - } - zb0016, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - (*z).BitmaskDefaultFrozen = bitmask(zb0016) - } - } - if zb0006 > 0 { - zb0006-- - var zb0018 int - var zb0019 bool - zb0018, zb0019, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0018 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0018), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0019 { - (*z).UnitName = nil - } else if (*z).UnitName != nil && cap((*z).UnitName) >= zb0018 { - (*z).UnitName = ((*z).UnitName)[:zb0018] - } else { - (*z).UnitName = make([]string, zb0018) - } - for zb0003 := range (*z).UnitName { - (*z).UnitName[zb0003], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName", zb0003) - return - } - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0020 []byte - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - if zb0021 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxBitmaskSize)) - return - } - zb0020, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - (*z).BitmaskUnitName = bitmask(zb0020) - } - } - if zb0006 > 0 { - zb0006-- - var zb0022 int - var zb0023 bool - zb0022, zb0023, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0022 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0023 { - (*z).AssetName = nil - } else if (*z).AssetName != nil && cap((*z).AssetName) >= zb0022 { - (*z).AssetName = ((*z).AssetName)[:zb0022] - } else { - (*z).AssetName = make([]string, zb0022) - } - for zb0004 := range (*z).AssetName { - (*z).AssetName[zb0004], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName", zb0004) - return - } - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0024 []byte - var zb0025 int - zb0025, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - if zb0025 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0025), uint64(maxBitmaskSize)) - return - } - zb0024, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - (*z).BitmaskAssetName = bitmask(zb0024) - } - } - if zb0006 > 0 { - zb0006-- - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0026 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0026), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0027 { - (*z).URL = nil - } else if (*z).URL != nil && cap((*z).URL) >= zb0026 { - (*z).URL = ((*z).URL)[:zb0026] - } else { - (*z).URL = make([]string, zb0026) - } - for zb0005 := range (*z).URL { - (*z).URL[zb0005], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL", zb0005) - return - } - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0028 []byte - var zb0029 int - zb0029, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - if zb0029 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0029), uint64(maxBitmaskSize)) - return - } - zb0028, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - (*z).BitmaskURL = bitmask(zb0028) - } - } - if zb0006 > 0 { - zb0006-- - var zb0030 int - zb0030, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - if zb0030 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0030), uint64(maxAddressBytes)) - return - } - (*z).MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).MetadataHash) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0031 []byte - var zb0032 int - zb0032, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - if zb0032 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0032), uint64(maxBitmaskSize)) - return - } - zb0031, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - (*z).BitmaskMetadataHash = bitmask(zb0031) - } - } - if zb0006 > 0 { - zb0006-- - var zb0033 int - zb0033, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - if zb0033 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0033), uint64(maxAddressBytes)) - return - } - (*z).Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).Manager) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0034 []byte - var zb0035 int - zb0035, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - if zb0035 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0035), uint64(maxBitmaskSize)) - return - } - zb0034, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - (*z).BitmaskManager = bitmask(zb0034) - } - } - if zb0006 > 0 { - zb0006-- - var zb0036 int - zb0036, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - if zb0036 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0036), uint64(maxAddressBytes)) - return - } - (*z).Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).Reserve) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0037 []byte - var zb0038 int - zb0038, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - if zb0038 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0038), uint64(maxBitmaskSize)) - return - } - zb0037, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - (*z).BitmaskReserve = bitmask(zb0037) - } - } - if zb0006 > 0 { - zb0006-- - var zb0039 int - zb0039, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - if zb0039 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0039), uint64(maxAddressBytes)) - return - } - (*z).Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).Freeze) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0040 []byte - var zb0041 int - zb0041, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - if zb0041 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0041), uint64(maxBitmaskSize)) - return - } - zb0040, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - (*z).BitmaskFreeze = bitmask(zb0040) - } - } - if zb0006 > 0 { - zb0006-- - var zb0042 int - zb0042, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - if zb0042 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0042), uint64(maxAddressBytes)) - return - } - (*z).Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).Clawback) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - } - if zb0006 > 0 { - zb0006-- - { - var zb0043 []byte - var zb0044 int - zb0044, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - if zb0044 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0044), uint64(maxBitmaskSize)) - return - } - zb0043, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - (*z).BitmaskClawback = bitmask(zb0043) - } - } - if zb0006 > 0 { - err = msgp.ErrTooManyArrayFields(zb0006) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0007 { - (*z) = encodedAssetParams{} - } - for zb0006 > 0 { - zb0006-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "t": - var zb0045 int - var zb0046 bool - zb0045, zb0046, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total") - return - } - if zb0045 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0045), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Total") - return - } - if zb0046 { - (*z).Total = nil - } else if (*z).Total != nil && cap((*z).Total) >= zb0045 { - (*z).Total = ((*z).Total)[:zb0045] - } else { - (*z).Total = make([]uint64, zb0045) - } - for zb0001 := range (*z).Total { - (*z).Total[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total", zb0001) - return - } - } - case "tbm": - { - var zb0047 []byte - var zb0048 int - zb0048, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - if zb0048 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0048), uint64(maxBitmaskSize)) - return - } - zb0047, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - (*z).BitmaskTotal = bitmask(zb0047) - } - case "dc": - var zb0049 int - var zb0050 bool - zb0049, zb0050, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals") - return - } - if zb0049 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Decimals") - return - } - if zb0050 { - (*z).Decimals = nil - } else if (*z).Decimals != nil && cap((*z).Decimals) >= zb0049 { - (*z).Decimals = ((*z).Decimals)[:zb0049] - } else { - (*z).Decimals = make([]uint32, zb0049) - } - for zb0002 := range (*z).Decimals { - (*z).Decimals[zb0002], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals", zb0002) - return - } - } - case "dcbm": - { - var zb0051 []byte - var zb0052 int - zb0052, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - if zb0052 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0052), uint64(maxBitmaskSize)) - return - } - zb0051, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - (*z).BitmaskDecimals = bitmask(zb0051) - } - case "dfbm": - { - var zb0053 []byte - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - if zb0054 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxBitmaskSize)) - return - } - zb0053, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - (*z).BitmaskDefaultFrozen = bitmask(zb0053) - } - case "un": - var zb0055 int - var zb0056 bool - zb0055, zb0056, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName") - return - } - if zb0055 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0055), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "UnitName") - return - } - if zb0056 { - (*z).UnitName = nil - } else if (*z).UnitName != nil && cap((*z).UnitName) >= zb0055 { - (*z).UnitName = ((*z).UnitName)[:zb0055] - } else { - (*z).UnitName = make([]string, zb0055) - } - for zb0003 := range (*z).UnitName { - (*z).UnitName[zb0003], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName", zb0003) - return - } - } - case "unbm": - { - var zb0057 []byte - var zb0058 int - zb0058, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - if zb0058 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0058), uint64(maxBitmaskSize)) - return - } - zb0057, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - (*z).BitmaskUnitName = bitmask(zb0057) - } - case "an": - var zb0059 int - var zb0060 bool - zb0059, zb0060, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName") - return - } - if zb0059 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0059), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetName") - return - } - if zb0060 { - (*z).AssetName = nil - } else if (*z).AssetName != nil && cap((*z).AssetName) >= zb0059 { - (*z).AssetName = ((*z).AssetName)[:zb0059] - } else { - (*z).AssetName = make([]string, zb0059) - } - for zb0004 := range (*z).AssetName { - (*z).AssetName[zb0004], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName", zb0004) - return - } - } - case "anbm": - { - var zb0061 []byte - var zb0062 int - zb0062, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - if zb0062 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0062), uint64(maxBitmaskSize)) - return - } - zb0061, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - (*z).BitmaskAssetName = bitmask(zb0061) - } - case "au": - var zb0063 int - var zb0064 bool - zb0063, zb0064, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL") - return - } - if zb0063 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0063), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "URL") - return - } - if zb0064 { - (*z).URL = nil - } else if (*z).URL != nil && cap((*z).URL) >= zb0063 { - (*z).URL = ((*z).URL)[:zb0063] - } else { - (*z).URL = make([]string, zb0063) - } - for zb0005 := range (*z).URL { - (*z).URL[zb0005], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL", zb0005) - return - } - } - case "aubm": - { - var zb0065 []byte - var zb0066 int - zb0066, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - if zb0066 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxBitmaskSize)) - return - } - zb0065, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - (*z).BitmaskURL = bitmask(zb0065) - } - case "am": - var zb0067 int - zb0067, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - if zb0067 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0067), uint64(maxAddressBytes)) - return - } - (*z).MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).MetadataHash) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - case "ambm": - { - var zb0068 []byte - var zb0069 int - zb0069, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - if zb0069 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0069), uint64(maxBitmaskSize)) - return - } - zb0068, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - (*z).BitmaskMetadataHash = bitmask(zb0068) - } - case "m": - var zb0070 int - zb0070, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - if zb0070 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0070), uint64(maxAddressBytes)) - return - } - (*z).Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).Manager) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - case "mbm": - { - var zb0071 []byte - var zb0072 int - zb0072, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - if zb0072 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxBitmaskSize)) - return - } - zb0071, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - (*z).BitmaskManager = bitmask(zb0071) - } - case "r": - var zb0073 int - zb0073, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - if zb0073 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0073), uint64(maxAddressBytes)) - return - } - (*z).Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).Reserve) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - case "rbm": - { - var zb0074 []byte - var zb0075 int - zb0075, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - if zb0075 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0075), uint64(maxBitmaskSize)) - return - } - zb0074, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - (*z).BitmaskReserve = bitmask(zb0074) - } - case "f": - var zb0076 int - zb0076, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - if zb0076 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0076), uint64(maxAddressBytes)) - return - } - (*z).Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).Freeze) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - case "fbm": - { - var zb0077 []byte - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - if zb0078 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxBitmaskSize)) - return - } - zb0077, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - (*z).BitmaskFreeze = bitmask(zb0077) - } - case "c": - var zb0079 int - zb0079, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - if zb0079 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0079), uint64(maxAddressBytes)) - return - } - (*z).Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).Clawback) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - case "cbm": - { - var zb0080 []byte - var zb0081 int - zb0081, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - if zb0081 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxBitmaskSize)) - return - } - zb0080, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - (*z).BitmaskClawback = bitmask(zb0080) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedAssetParams) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetParams) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedAssetParams) Msgsize() (s int) { - s = 3 + 2 + msgp.ArrayHeaderSize + (len((*z).Total) * (msgp.Uint64Size)) + 4 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskTotal)) + 3 + msgp.ArrayHeaderSize + (len((*z).Decimals) * (msgp.Uint32Size)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskDecimals)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskDefaultFrozen)) + 3 + msgp.ArrayHeaderSize - for zb0003 := range (*z).UnitName { - s += msgp.StringPrefixSize + len((*z).UnitName[zb0003]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskUnitName)) + 3 + msgp.ArrayHeaderSize - for zb0004 := range (*z).AssetName { - s += msgp.StringPrefixSize + len((*z).AssetName[zb0004]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetName)) + 3 + msgp.ArrayHeaderSize - for zb0005 := range (*z).URL { - s += msgp.StringPrefixSize + len((*z).URL[zb0005]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskURL)) + 3 + msgp.BytesPrefixSize + len((*z).MetadataHash) + 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskMetadataHash)) + 2 + msgp.BytesPrefixSize + len((*z).Manager) + 4 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskManager)) + 2 + msgp.BytesPrefixSize + len((*z).Reserve) + 4 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskReserve)) + 2 + msgp.BytesPrefixSize + len((*z).Freeze) + 4 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskFreeze)) + 2 + msgp.BytesPrefixSize + len((*z).Clawback) + 4 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskClawback)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedAssetParams) MsgIsZero() bool { - return (len((*z).Total) == 0) && (len((*z).BitmaskTotal) == 0) && (len((*z).Decimals) == 0) && (len((*z).BitmaskDecimals) == 0) && (len((*z).BitmaskDefaultFrozen) == 0) && (len((*z).UnitName) == 0) && (len((*z).BitmaskUnitName) == 0) && (len((*z).AssetName) == 0) && (len((*z).BitmaskAssetName) == 0) && (len((*z).URL) == 0) && (len((*z).BitmaskURL) == 0) && (len((*z).MetadataHash) == 0) && (len((*z).BitmaskMetadataHash) == 0) && (len((*z).Manager) == 0) && (len((*z).BitmaskManager) == 0) && (len((*z).Reserve) == 0) && (len((*z).BitmaskReserve) == 0) && (len((*z).Freeze) == 0) && (len((*z).BitmaskFreeze) == 0) && (len((*z).Clawback) == 0) && (len((*z).BitmaskClawback) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedAssetTransferTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0003Len := uint32(10) - var zb0003Mask uint16 /* 11 bits */ - if len((*z).AssetAmount) == 0 { - zb0003Len-- - zb0003Mask |= 0x2 - } - if len((*z).BitmaskAssetAmount) == 0 { - zb0003Len-- - zb0003Mask |= 0x4 - } - if len((*z).AssetCloseTo) == 0 { - zb0003Len-- - zb0003Mask |= 0x8 - } - if len((*z).BitmaskAssetCloseTo) == 0 { - zb0003Len-- - zb0003Mask |= 0x10 - } - if len((*z).AssetReceiver) == 0 { - zb0003Len-- - zb0003Mask |= 0x20 - } - if len((*z).BitmaskAssetReceiver) == 0 { - zb0003Len-- - zb0003Mask |= 0x40 - } - if len((*z).AssetSender) == 0 { - zb0003Len-- - zb0003Mask |= 0x80 - } - if len((*z).BitmaskAssetSender) == 0 { - zb0003Len-- - zb0003Mask |= 0x100 - } - if len((*z).XferAsset) == 0 { - zb0003Len-- - zb0003Mask |= 0x200 - } - if len((*z).BitmaskXferAsset) == 0 { - zb0003Len-- - zb0003Mask |= 0x400 - } - // variable map header, size zb0003Len - o = append(o, 0x80|uint8(zb0003Len)) - if zb0003Len != 0 { - if (zb0003Mask & 0x2) == 0 { // if not empty - // string "aamt" - o = append(o, 0xa4, 0x61, 0x61, 0x6d, 0x74) - if (*z).AssetAmount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).AssetAmount))) - } - for zb0002 := range (*z).AssetAmount { - o = msgp.AppendUint64(o, (*z).AssetAmount[zb0002]) - } - } - if (zb0003Mask & 0x4) == 0 { // if not empty - // string "aamtbm" - o = append(o, 0xa6, 0x61, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetAmount)) - } - if (zb0003Mask & 0x8) == 0 { // if not empty - // string "aclose" - o = append(o, 0xa6, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).AssetCloseTo) - } - if (zb0003Mask & 0x10) == 0 { // if not empty - // string "aclosebm" - o = append(o, 0xa8, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetCloseTo)) - } - if (zb0003Mask & 0x20) == 0 { // if not empty - // string "arcv" - o = append(o, 0xa4, 0x61, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).AssetReceiver) - } - if (zb0003Mask & 0x40) == 0 { // if not empty - // string "arcvbm" - o = append(o, 0xa6, 0x61, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetReceiver)) - } - if (zb0003Mask & 0x80) == 0 { // if not empty - // string "asnd" - o = append(o, 0xa4, 0x61, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).AssetSender) - } - if (zb0003Mask & 0x100) == 0 { // if not empty - // string "asndbm" - o = append(o, 0xa6, 0x61, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAssetSender)) - } - if (zb0003Mask & 0x200) == 0 { // if not empty - // string "xaid" - o = append(o, 0xa4, 0x78, 0x61, 0x69, 0x64) - if (*z).XferAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).XferAsset))) - } - for zb0001 := range (*z).XferAsset { - o = (*z).XferAsset[zb0001].MarshalMsg(o) - } - } - if (zb0003Mask & 0x400) == 0 { // if not empty - // string "xaidbm" - o = append(o, 0xa6, 0x78, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskXferAsset)) - } - } - return -} - -func (_ *encodedAssetTransferTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetTransferTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedAssetTransferTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0003 int - var zb0004 bool - zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 > 0 { - zb0003-- - var zb0005 int - var zb0006 bool - zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0005 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0005), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0006 { - (*z).XferAsset = nil - } else if (*z).XferAsset != nil && cap((*z).XferAsset) >= zb0005 { - (*z).XferAsset = ((*z).XferAsset)[:zb0005] - } else { - (*z).XferAsset = make([]basics.AssetIndex, zb0005) - } - for zb0001 := range (*z).XferAsset { - bts, err = (*z).XferAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset", zb0001) - return - } - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0007 []byte - var zb0008 int - zb0008, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - if zb0008 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0008), uint64(maxBitmaskSize)) - return - } - zb0007, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - (*z).BitmaskXferAsset = bitmask(zb0007) - } - } - if zb0003 > 0 { - zb0003-- - var zb0009 int - var zb0010 bool - zb0009, zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0009 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0009), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0010 { - (*z).AssetAmount = nil - } else if (*z).AssetAmount != nil && cap((*z).AssetAmount) >= zb0009 { - (*z).AssetAmount = ((*z).AssetAmount)[:zb0009] - } else { - (*z).AssetAmount = make([]uint64, zb0009) - } - for zb0002 := range (*z).AssetAmount { - (*z).AssetAmount[zb0002], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount", zb0002) - return - } - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0011 []byte - var zb0012 int - zb0012, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - if zb0012 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0012), uint64(maxBitmaskSize)) - return - } - zb0011, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - (*z).BitmaskAssetAmount = bitmask(zb0011) - } - } - if zb0003 > 0 { - zb0003-- - var zb0013 int - zb0013, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - if zb0013 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxAddressBytes)) - return - } - (*z).AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetSender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0014 []byte - var zb0015 int - zb0015, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - if zb0015 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0015), uint64(maxBitmaskSize)) - return - } - zb0014, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - (*z).BitmaskAssetSender = bitmask(zb0014) - } - } - if zb0003 > 0 { - zb0003-- - var zb0016 int - zb0016, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - if zb0016 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxAddressBytes)) - return - } - (*z).AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0017 []byte - var zb0018 int - zb0018, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - if zb0018 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0018), uint64(maxBitmaskSize)) - return - } - zb0017, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - (*z).BitmaskAssetReceiver = bitmask(zb0017) - } - } - if zb0003 > 0 { - zb0003-- - var zb0019 int - zb0019, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - if zb0019 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0019), uint64(maxAddressBytes)) - return - } - (*z).AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0020 []byte - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - if zb0021 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxBitmaskSize)) - return - } - zb0020, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - (*z).BitmaskAssetCloseTo = bitmask(zb0020) - } - } - if zb0003 > 0 { - err = msgp.ErrTooManyArrayFields(zb0003) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0004 { - (*z) = encodedAssetTransferTxnFields{} - } - for zb0003 > 0 { - zb0003-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "xaid": - var zb0022 int - var zb0023 bool - zb0022, zb0023, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0022 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0023 { - (*z).XferAsset = nil - } else if (*z).XferAsset != nil && cap((*z).XferAsset) >= zb0022 { - (*z).XferAsset = ((*z).XferAsset)[:zb0022] - } else { - (*z).XferAsset = make([]basics.AssetIndex, zb0022) - } - for zb0001 := range (*z).XferAsset { - bts, err = (*z).XferAsset[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset", zb0001) - return - } - } - case "xaidbm": - { - var zb0024 []byte - var zb0025 int - zb0025, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - if zb0025 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0025), uint64(maxBitmaskSize)) - return - } - zb0024, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - (*z).BitmaskXferAsset = bitmask(zb0024) - } - case "aamt": - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0026 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0026), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0027 { - (*z).AssetAmount = nil - } else if (*z).AssetAmount != nil && cap((*z).AssetAmount) >= zb0026 { - (*z).AssetAmount = ((*z).AssetAmount)[:zb0026] - } else { - (*z).AssetAmount = make([]uint64, zb0026) - } - for zb0002 := range (*z).AssetAmount { - (*z).AssetAmount[zb0002], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount", zb0002) - return - } - } - case "aamtbm": - { - var zb0028 []byte - var zb0029 int - zb0029, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - if zb0029 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0029), uint64(maxBitmaskSize)) - return - } - zb0028, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - (*z).BitmaskAssetAmount = bitmask(zb0028) - } - case "asnd": - var zb0030 int - zb0030, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - if zb0030 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0030), uint64(maxAddressBytes)) - return - } - (*z).AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetSender) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - case "asndbm": - { - var zb0031 []byte - var zb0032 int - zb0032, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - if zb0032 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0032), uint64(maxBitmaskSize)) - return - } - zb0031, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - (*z).BitmaskAssetSender = bitmask(zb0031) - } - case "arcv": - var zb0033 int - zb0033, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - if zb0033 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0033), uint64(maxAddressBytes)) - return - } - (*z).AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - case "arcvbm": - { - var zb0034 []byte - var zb0035 int - zb0035, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - if zb0035 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0035), uint64(maxBitmaskSize)) - return - } - zb0034, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - (*z).BitmaskAssetReceiver = bitmask(zb0034) - } - case "aclose": - var zb0036 int - zb0036, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - if zb0036 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0036), uint64(maxAddressBytes)) - return - } - (*z).AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - case "aclosebm": - { - var zb0037 []byte - var zb0038 int - zb0038, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - if zb0038 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0038), uint64(maxBitmaskSize)) - return - } - zb0037, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - (*z).BitmaskAssetCloseTo = bitmask(zb0037) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedAssetTransferTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedAssetTransferTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedAssetTransferTxnFields) Msgsize() (s int) { - s = 1 + 5 + msgp.ArrayHeaderSize - for zb0001 := range (*z).XferAsset { - s += (*z).XferAsset[zb0001].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskXferAsset)) + 5 + msgp.ArrayHeaderSize + (len((*z).AssetAmount) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetAmount)) + 5 + msgp.BytesPrefixSize + len((*z).AssetSender) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetSender)) + 5 + msgp.BytesPrefixSize + len((*z).AssetReceiver) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetReceiver)) + 7 + msgp.BytesPrefixSize + len((*z).AssetCloseTo) + 9 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAssetCloseTo)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedAssetTransferTxnFields) MsgIsZero() bool { - return (len((*z).XferAsset) == 0) && (len((*z).BitmaskXferAsset) == 0) && (len((*z).AssetAmount) == 0) && (len((*z).BitmaskAssetAmount) == 0) && (len((*z).AssetSender) == 0) && (len((*z).BitmaskAssetSender) == 0) && (len((*z).AssetReceiver) == 0) && (len((*z).BitmaskAssetReceiver) == 0) && (len((*z).AssetCloseTo) == 0) && (len((*z).BitmaskAssetCloseTo) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedBloomFilter) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0001Len := uint32(4) - var zb0001Mask uint8 /* 5 bits */ - if (*z).ClearPrevious == 0 { - zb0001Len-- - zb0001Mask |= 0x2 - } - if len((*z).BloomFilter) == 0 { - zb0001Len-- - zb0001Mask |= 0x4 - } - if ((*z).EncodingParams.Offset == 0) && ((*z).EncodingParams.Modulator == 0) { - zb0001Len-- - zb0001Mask |= 0x8 - } - if (*z).BloomFilterType == 0 { - zb0001Len-- - zb0001Mask |= 0x10 - } - // variable map header, size zb0001Len - o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len != 0 { - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendByte(o, (*z).ClearPrevious) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).BloomFilter) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "p" - o = append(o, 0xa1, 0x70) - // omitempty: check for empty values - zb0002Len := uint32(2) - var zb0002Mask uint8 /* 3 bits */ - if (*z).EncodingParams.Modulator == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - if (*z).EncodingParams.Offset == 0 { - zb0002Len-- - zb0002Mask |= 0x4 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendByte(o, (*z).EncodingParams.Modulator) - } - if (zb0002Mask & 0x4) == 0 { // if not empty - // string "o" - o = append(o, 0xa1, 0x6f) - o = msgp.AppendByte(o, (*z).EncodingParams.Offset) - } - } - if (zb0001Mask & 0x10) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - o = msgp.AppendByte(o, (*z).BloomFilterType) - } - } - return -} - -func (_ *encodedBloomFilter) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedBloomFilter) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedBloomFilter) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0001 int - var zb0002 bool - zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0001 > 0 { - zb0001-- - (*z).BloomFilterType, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BloomFilterType") - return - } - } - if zb0001 > 0 { - zb0001-- - var zb0003 int - var zb0004 bool - zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams") - return - } - if zb0003 > 0 { - zb0003-- - (*z).EncodingParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams", "struct-from-array", "Offset") - return - } - } - if zb0003 > 0 { - zb0003-- - (*z).EncodingParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams", "struct-from-array", "Modulator") - return - } - } - if zb0003 > 0 { - err = msgp.ErrTooManyArrayFields(zb0003) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams", "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams") - return - } - if zb0004 { - (*z).EncodingParams = requestParams{} - } - for zb0003 > 0 { - zb0003-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams") - return - } - switch string(field) { - case "o": - (*z).EncodingParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams", "Offset") - return - } - case "m": - (*z).EncodingParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams", "Modulator") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "EncodingParams") - return - } - } - } - } - } - if zb0001 > 0 { - zb0001-- - var zb0005 int - zb0005, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BloomFilter") - return - } - if zb0005 > maxBloomFilterSize { - err = msgp.ErrOverflow(uint64(zb0005), uint64(maxBloomFilterSize)) - return - } - (*z).BloomFilter, bts, err = msgp.ReadBytesBytes(bts, (*z).BloomFilter) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BloomFilter") - return - } - } - if zb0001 > 0 { - zb0001-- - (*z).ClearPrevious, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearPrevious") - return - } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = encodedBloomFilter{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "t": - (*z).BloomFilterType, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "BloomFilterType") - return - } - case "p": - var zb0006 int - var zb0007 bool - zb0006, zb0007, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams") - return - } - if zb0006 > 0 { - zb0006-- - (*z).EncodingParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams", "struct-from-array", "Offset") - return - } - } - if zb0006 > 0 { - zb0006-- - (*z).EncodingParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams", "struct-from-array", "Modulator") - return - } - } - if zb0006 > 0 { - err = msgp.ErrTooManyArrayFields(zb0006) - if err != nil { - err = msgp.WrapError(err, "EncodingParams", "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "EncodingParams") - return - } - if zb0007 { - (*z).EncodingParams = requestParams{} - } - for zb0006 > 0 { - zb0006-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams") - return - } - switch string(field) { - case "o": - (*z).EncodingParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams", "Offset") - return - } - case "m": - (*z).EncodingParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "EncodingParams", "Modulator") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "EncodingParams") - return - } - } - } - } - case "f": - var zb0008 int - zb0008, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BloomFilter") - return - } - if zb0008 > maxBloomFilterSize { - err = msgp.ErrOverflow(uint64(zb0008), uint64(maxBloomFilterSize)) - return - } - (*z).BloomFilter, bts, err = msgp.ReadBytesBytes(bts, (*z).BloomFilter) - if err != nil { - err = msgp.WrapError(err, "BloomFilter") - return - } - case "c": - (*z).ClearPrevious, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ClearPrevious") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedBloomFilter) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedBloomFilter) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedBloomFilter) Msgsize() (s int) { - s = 1 + 2 + msgp.ByteSize + 2 + 1 + 2 + msgp.ByteSize + 2 + msgp.ByteSize + 2 + msgp.BytesPrefixSize + len((*z).BloomFilter) + 2 + msgp.ByteSize - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedBloomFilter) MsgIsZero() bool { - return ((*z).BloomFilterType == 0) && (((*z).EncodingParams.Offset == 0) && ((*z).EncodingParams.Modulator == 0)) && (len((*z).BloomFilter) == 0) && ((*z).ClearPrevious == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedCert) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0009Len := uint32(10) - var zb0009Mask uint16 /* 11 bits */ - if len((*z).PartProofs) == 0 { - zb0009Len-- - zb0009Mask |= 0x2 - } - if len((*z).BitmaskPartProofs) == 0 { - zb0009Len-- - zb0009Mask |= 0x4 - } - if len((*z).SigProofs) == 0 { - zb0009Len-- - zb0009Mask |= 0x8 - } - if len((*z).BitmaskSigProofs) == 0 { - zb0009Len-- - zb0009Mask |= 0x10 - } - if len((*z).SigCommit) == 0 { - zb0009Len-- - zb0009Mask |= 0x20 - } - if len((*z).BitmaskSigCommit) == 0 { - zb0009Len-- - zb0009Mask |= 0x40 - } - if len((*z).Reveals) == 0 { - zb0009Len-- - zb0009Mask |= 0x80 - } - if len((*z).BitmaskReveals) == 0 { - zb0009Len-- - zb0009Mask |= 0x100 - } - if len((*z).SignedWeight) == 0 { - zb0009Len-- - zb0009Mask |= 0x200 - } - if len((*z).BitmaskSignedWeight) == 0 { - zb0009Len-- - zb0009Mask |= 0x400 - } - // variable map header, size zb0009Len - o = append(o, 0x80|uint8(zb0009Len)) - if zb0009Len != 0 { - if (zb0009Mask & 0x2) == 0 { // if not empty - // string "certP" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x50) - if (*z).PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).PartProofs))) - } - for zb0004 := range (*z).PartProofs { - if (*z).PartProofs[zb0004] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).PartProofs[zb0004]))) - } - for zb0005 := range (*z).PartProofs[zb0004] { - o = (*z).PartProofs[zb0004][zb0005].MarshalMsg(o) - } - } - } - if (zb0009Mask & 0x4) == 0 { // if not empty - // string "certPbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x50, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskPartProofs)) - } - if (zb0009Mask & 0x8) == 0 { // if not empty - // string "certS" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x53) - if (*z).SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).SigProofs))) - } - for zb0002 := range (*z).SigProofs { - if (*z).SigProofs[zb0002] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).SigProofs[zb0002]))) - } - for zb0003 := range (*z).SigProofs[zb0002] { - o = (*z).SigProofs[zb0002][zb0003].MarshalMsg(o) - } - } - } - if (zb0009Mask & 0x10) == 0 { // if not empty - // string "certSbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x53, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSigProofs)) - } - if (zb0009Mask & 0x20) == 0 { // if not empty - // string "certc" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x63) - o = msgp.AppendBytes(o, (*z).SigCommit) - } - if (zb0009Mask & 0x40) == 0 { // if not empty - // string "certcbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSigCommit)) - } - if (zb0009Mask & 0x80) == 0 { // if not empty - // string "certr" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x72) - if (*z).Reveals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Reveals))) - } - for zb0006 := range (*z).Reveals { - if (*z).Reveals[zb0006] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len((*z).Reveals[zb0006]))) - } - zb0007_keys := make([]uint64, 0, len((*z).Reveals[zb0006])) - for zb0007 := range (*z).Reveals[zb0006] { - zb0007_keys = append(zb0007_keys, zb0007) - } - sort.Sort(SortUint64(zb0007_keys)) - for _, zb0007 := range zb0007_keys { - zb0008 := (*z).Reveals[zb0006][zb0007] - _ = zb0008 - o = msgp.AppendUint64(o, zb0007) - o = zb0008.MarshalMsg(o) - } - } - } - if (zb0009Mask & 0x100) == 0 { // if not empty - // string "certrbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskReveals)) - } - if (zb0009Mask & 0x200) == 0 { // if not empty - // string "certw" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x77) - if (*z).SignedWeight == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).SignedWeight))) - } - for zb0001 := range (*z).SignedWeight { - o = msgp.AppendUint64(o, (*z).SignedWeight[zb0001]) - } - } - if (zb0009Mask & 0x400) == 0 { // if not empty - // string "certwbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x77, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSignedWeight)) - } - } - return -} - -func (_ *encodedCert) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedCert) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedCert) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0009 int - var zb0010 bool - zb0009, zb0010, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0009, zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0009 > 0 { - zb0009-- - var zb0011 int - zb0011, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - if zb0011 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxAddressBytes)) - return - } - (*z).SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).SigCommit) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - } - if zb0009 > 0 { - zb0009-- - { - var zb0012 []byte - var zb0013 int - zb0013, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - if zb0013 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxBitmaskSize)) - return - } - zb0012, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - (*z).BitmaskSigCommit = bitmask(zb0012) - } - } - if zb0009 > 0 { - zb0009-- - var zb0014 int - var zb0015 bool - zb0014, zb0015, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0014 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0014), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0015 { - (*z).SignedWeight = nil - } else if (*z).SignedWeight != nil && cap((*z).SignedWeight) >= zb0014 { - (*z).SignedWeight = ((*z).SignedWeight)[:zb0014] - } else { - (*z).SignedWeight = make([]uint64, zb0014) - } - for zb0001 := range (*z).SignedWeight { - (*z).SignedWeight[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight", zb0001) - return - } - } - } - if zb0009 > 0 { - zb0009-- - { - var zb0016 []byte - var zb0017 int - zb0017, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - if zb0017 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxBitmaskSize)) - return - } - zb0016, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - (*z).BitmaskSignedWeight = bitmask(zb0016) - } - } - if zb0009 > 0 { - zb0009-- - var zb0018 int - var zb0019 bool - zb0018, zb0019, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0018 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0018), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0019 { - (*z).SigProofs = nil - } else if (*z).SigProofs != nil && cap((*z).SigProofs) >= zb0018 { - (*z).SigProofs = ((*z).SigProofs)[:zb0018] - } else { - (*z).SigProofs = make([]certProofs, zb0018) - } - for zb0002 := range (*z).SigProofs { - var zb0020 int - var zb0021 bool - zb0020, zb0021, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0002) - return - } - if zb0020 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0020), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0002) - return - } - if zb0021 { - (*z).SigProofs[zb0002] = nil - } else if (*z).SigProofs[zb0002] != nil && cap((*z).SigProofs[zb0002]) >= zb0020 { - (*z).SigProofs[zb0002] = ((*z).SigProofs[zb0002])[:zb0020] - } else { - (*z).SigProofs[zb0002] = make(certProofs, zb0020) - } - for zb0003 := range (*z).SigProofs[zb0002] { - bts, err = (*z).SigProofs[zb0002][zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0002, zb0003) - return - } - } - } - } - if zb0009 > 0 { - zb0009-- - { - var zb0022 []byte - var zb0023 int - zb0023, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - if zb0023 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxBitmaskSize)) - return - } - zb0022, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - (*z).BitmaskSigProofs = bitmask(zb0022) - } - } - if zb0009 > 0 { - zb0009-- - var zb0024 int - var zb0025 bool - zb0024, zb0025, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0024 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0024), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0025 { - (*z).PartProofs = nil - } else if (*z).PartProofs != nil && cap((*z).PartProofs) >= zb0024 { - (*z).PartProofs = ((*z).PartProofs)[:zb0024] - } else { - (*z).PartProofs = make([]certProofs, zb0024) - } - for zb0004 := range (*z).PartProofs { - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0004) - return - } - if zb0026 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0026), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0004) - return - } - if zb0027 { - (*z).PartProofs[zb0004] = nil - } else if (*z).PartProofs[zb0004] != nil && cap((*z).PartProofs[zb0004]) >= zb0026 { - (*z).PartProofs[zb0004] = ((*z).PartProofs[zb0004])[:zb0026] - } else { - (*z).PartProofs[zb0004] = make(certProofs, zb0026) - } - for zb0005 := range (*z).PartProofs[zb0004] { - bts, err = (*z).PartProofs[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0004, zb0005) - return - } - } - } - } - if zb0009 > 0 { - zb0009-- - { - var zb0028 []byte - var zb0029 int - zb0029, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - if zb0029 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0029), uint64(maxBitmaskSize)) - return - } - zb0028, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - (*z).BitmaskPartProofs = bitmask(zb0028) - } - } - if zb0009 > 0 { - zb0009-- - var zb0030 int - var zb0031 bool - zb0030, zb0031, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0030 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0030), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0031 { - (*z).Reveals = nil - } else if (*z).Reveals != nil && cap((*z).Reveals) >= zb0030 { - (*z).Reveals = ((*z).Reveals)[:zb0030] - } else { - (*z).Reveals = make([]revealMap, zb0030) - } - for zb0006 := range (*z).Reveals { - var zb0032 int - var zb0033 bool - zb0032, zb0033, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0006) - return - } - if zb0032 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0032), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0006) - return - } - if zb0033 { - (*z).Reveals[zb0006] = nil - } else if (*z).Reveals[zb0006] == nil { - (*z).Reveals[zb0006] = make(revealMap, zb0032) - } - for zb0032 > 0 { - var zb0007 uint64 - var zb0008 compactcert.Reveal - zb0032-- - zb0007, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0006) - return - } - bts, err = zb0008.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0006, zb0007) - return - } - (*z).Reveals[zb0006][zb0007] = zb0008 - } - } - } - if zb0009 > 0 { - zb0009-- - { - var zb0034 []byte - var zb0035 int - zb0035, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - if zb0035 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0035), uint64(maxBitmaskSize)) - return - } - zb0034, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - (*z).BitmaskReveals = bitmask(zb0034) - } - } - if zb0009 > 0 { - err = msgp.ErrTooManyArrayFields(zb0009) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0010 { - (*z) = encodedCert{} - } - for zb0009 > 0 { - zb0009-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "certc": - var zb0036 int - zb0036, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - if zb0036 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0036), uint64(maxAddressBytes)) - return - } - (*z).SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).SigCommit) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - case "certcbm": - { - var zb0037 []byte - var zb0038 int - zb0038, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - if zb0038 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0038), uint64(maxBitmaskSize)) - return - } - zb0037, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - (*z).BitmaskSigCommit = bitmask(zb0037) - } - case "certw": - var zb0039 int - var zb0040 bool - zb0039, zb0040, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0039 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0039), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0040 { - (*z).SignedWeight = nil - } else if (*z).SignedWeight != nil && cap((*z).SignedWeight) >= zb0039 { - (*z).SignedWeight = ((*z).SignedWeight)[:zb0039] - } else { - (*z).SignedWeight = make([]uint64, zb0039) - } - for zb0001 := range (*z).SignedWeight { - (*z).SignedWeight[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight", zb0001) - return - } - } - case "certwbm": - { - var zb0041 []byte - var zb0042 int - zb0042, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - if zb0042 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0042), uint64(maxBitmaskSize)) - return - } - zb0041, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - (*z).BitmaskSignedWeight = bitmask(zb0041) - } - case "certS": - var zb0043 int - var zb0044 bool - zb0043, zb0044, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0043 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0043), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0044 { - (*z).SigProofs = nil - } else if (*z).SigProofs != nil && cap((*z).SigProofs) >= zb0043 { - (*z).SigProofs = ((*z).SigProofs)[:zb0043] - } else { - (*z).SigProofs = make([]certProofs, zb0043) - } - for zb0002 := range (*z).SigProofs { - var zb0045 int - var zb0046 bool - zb0045, zb0046, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0002) - return - } - if zb0045 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0045), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "SigProofs", zb0002) - return - } - if zb0046 { - (*z).SigProofs[zb0002] = nil - } else if (*z).SigProofs[zb0002] != nil && cap((*z).SigProofs[zb0002]) >= zb0045 { - (*z).SigProofs[zb0002] = ((*z).SigProofs[zb0002])[:zb0045] - } else { - (*z).SigProofs[zb0002] = make(certProofs, zb0045) - } - for zb0003 := range (*z).SigProofs[zb0002] { - bts, err = (*z).SigProofs[zb0002][zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0002, zb0003) - return - } - } - } - case "certSbm": - { - var zb0047 []byte - var zb0048 int - zb0048, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - if zb0048 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0048), uint64(maxBitmaskSize)) - return - } - zb0047, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - (*z).BitmaskSigProofs = bitmask(zb0047) - } - case "certP": - var zb0049 int - var zb0050 bool - zb0049, zb0050, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0049 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0050 { - (*z).PartProofs = nil - } else if (*z).PartProofs != nil && cap((*z).PartProofs) >= zb0049 { - (*z).PartProofs = ((*z).PartProofs)[:zb0049] - } else { - (*z).PartProofs = make([]certProofs, zb0049) - } - for zb0004 := range (*z).PartProofs { - var zb0051 int - var zb0052 bool - zb0051, zb0052, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0004) - return - } - if zb0051 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0051), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "PartProofs", zb0004) - return - } - if zb0052 { - (*z).PartProofs[zb0004] = nil - } else if (*z).PartProofs[zb0004] != nil && cap((*z).PartProofs[zb0004]) >= zb0051 { - (*z).PartProofs[zb0004] = ((*z).PartProofs[zb0004])[:zb0051] - } else { - (*z).PartProofs[zb0004] = make(certProofs, zb0051) - } - for zb0005 := range (*z).PartProofs[zb0004] { - bts, err = (*z).PartProofs[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0004, zb0005) - return - } - } - } - case "certPbm": - { - var zb0053 []byte - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - if zb0054 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxBitmaskSize)) - return - } - zb0053, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - (*z).BitmaskPartProofs = bitmask(zb0053) - } - case "certr": - var zb0055 int - var zb0056 bool - zb0055, zb0056, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals") - return - } - if zb0055 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0055), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Reveals") - return - } - if zb0056 { - (*z).Reveals = nil - } else if (*z).Reveals != nil && cap((*z).Reveals) >= zb0055 { - (*z).Reveals = ((*z).Reveals)[:zb0055] - } else { - (*z).Reveals = make([]revealMap, zb0055) - } - for zb0006 := range (*z).Reveals { - var zb0057 int - var zb0058 bool - zb0057, zb0058, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0006) - return - } - if zb0057 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0057), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "Reveals", zb0006) - return - } - if zb0058 { - (*z).Reveals[zb0006] = nil - } else if (*z).Reveals[zb0006] == nil { - (*z).Reveals[zb0006] = make(revealMap, zb0057) - } - for zb0057 > 0 { - var zb0007 uint64 - var zb0008 compactcert.Reveal - zb0057-- - zb0007, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0006) - return - } - bts, err = zb0008.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0006, zb0007) - return - } - (*z).Reveals[zb0006][zb0007] = zb0008 - } - } - case "certrbm": - { - var zb0059 []byte - var zb0060 int - zb0060, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - if zb0060 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxBitmaskSize)) - return - } - zb0059, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - (*z).BitmaskReveals = bitmask(zb0059) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedCert) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedCert) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedCert) Msgsize() (s int) { - s = 1 + 6 + msgp.BytesPrefixSize + len((*z).SigCommit) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSigCommit)) + 6 + msgp.ArrayHeaderSize + (len((*z).SignedWeight) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSignedWeight)) + 6 + msgp.ArrayHeaderSize - for zb0002 := range (*z).SigProofs { - s += msgp.ArrayHeaderSize - for zb0003 := range (*z).SigProofs[zb0002] { - s += (*z).SigProofs[zb0002][zb0003].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSigProofs)) + 6 + msgp.ArrayHeaderSize - for zb0004 := range (*z).PartProofs { - s += msgp.ArrayHeaderSize - for zb0005 := range (*z).PartProofs[zb0004] { - s += (*z).PartProofs[zb0004][zb0005].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskPartProofs)) + 6 + msgp.ArrayHeaderSize - for zb0006 := range (*z).Reveals { - s += msgp.MapHeaderSize - if (*z).Reveals[zb0006] != nil { - for zb0007, zb0008 := range (*z).Reveals[zb0006] { - _ = zb0007 - _ = zb0008 - s += 0 + msgp.Uint64Size + zb0008.Msgsize() - } - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskReveals)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedCert) MsgIsZero() bool { - return (len((*z).SigCommit) == 0) && (len((*z).BitmaskSigCommit) == 0) && (len((*z).SignedWeight) == 0) && (len((*z).BitmaskSignedWeight) == 0) && (len((*z).SigProofs) == 0) && (len((*z).BitmaskSigProofs) == 0) && (len((*z).PartProofs) == 0) && (len((*z).BitmaskPartProofs) == 0) && (len((*z).Reveals) == 0) && (len((*z).BitmaskReveals) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedCompactCertTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0011Len := uint32(14) - var zb0011Mask uint16 /* 16 bits */ - if len((*z).encodedCert.PartProofs) == 0 { - zb0011Len-- - zb0011Mask |= 0x4 - } - if len((*z).encodedCert.BitmaskPartProofs) == 0 { - zb0011Len-- - zb0011Mask |= 0x8 - } - if len((*z).encodedCert.SigProofs) == 0 { - zb0011Len-- - zb0011Mask |= 0x10 - } - if len((*z).encodedCert.BitmaskSigProofs) == 0 { - zb0011Len-- - zb0011Mask |= 0x20 - } - if len((*z).encodedCert.SigCommit) == 0 { - zb0011Len-- - zb0011Mask |= 0x40 - } - if len((*z).encodedCert.BitmaskSigCommit) == 0 { - zb0011Len-- - zb0011Mask |= 0x80 - } - if len((*z).encodedCert.Reveals) == 0 { - zb0011Len-- - zb0011Mask |= 0x100 - } - if len((*z).encodedCert.BitmaskReveals) == 0 { - zb0011Len-- - zb0011Mask |= 0x200 - } - if len((*z).CertRound) == 0 { - zb0011Len-- - zb0011Mask |= 0x400 - } - if len((*z).BitmaskCertRound) == 0 { - zb0011Len-- - zb0011Mask |= 0x800 - } - if len((*z).CertType) == 0 { - zb0011Len-- - zb0011Mask |= 0x1000 - } - if len((*z).BitmaskCertType) == 0 { - zb0011Len-- - zb0011Mask |= 0x2000 - } - if len((*z).encodedCert.SignedWeight) == 0 { - zb0011Len-- - zb0011Mask |= 0x4000 - } - if len((*z).encodedCert.BitmaskSignedWeight) == 0 { - zb0011Len-- - zb0011Mask |= 0x8000 - } - // variable map header, size zb0011Len - o = append(o, 0x80|uint8(zb0011Len)) - if zb0011Len != 0 { - if (zb0011Mask & 0x4) == 0 { // if not empty - // string "certP" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x50) - if (*z).encodedCert.PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.PartProofs))) - } - for zb0006 := range (*z).encodedCert.PartProofs { - if (*z).encodedCert.PartProofs[zb0006] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.PartProofs[zb0006]))) - } - for zb0007 := range (*z).encodedCert.PartProofs[zb0006] { - o = (*z).encodedCert.PartProofs[zb0006][zb0007].MarshalMsg(o) - } - } - } - if (zb0011Mask & 0x8) == 0 { // if not empty - // string "certPbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x50, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCert.BitmaskPartProofs)) - } - if (zb0011Mask & 0x10) == 0 { // if not empty - // string "certS" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x53) - if (*z).encodedCert.SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.SigProofs))) - } - for zb0004 := range (*z).encodedCert.SigProofs { - if (*z).encodedCert.SigProofs[zb0004] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.SigProofs[zb0004]))) - } - for zb0005 := range (*z).encodedCert.SigProofs[zb0004] { - o = (*z).encodedCert.SigProofs[zb0004][zb0005].MarshalMsg(o) - } - } - } - if (zb0011Mask & 0x20) == 0 { // if not empty - // string "certSbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x53, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCert.BitmaskSigProofs)) - } - if (zb0011Mask & 0x40) == 0 { // if not empty - // string "certc" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x63) - o = msgp.AppendBytes(o, (*z).encodedCert.SigCommit) - } - if (zb0011Mask & 0x80) == 0 { // if not empty - // string "certcbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCert.BitmaskSigCommit)) - } - if (zb0011Mask & 0x100) == 0 { // if not empty - // string "certr" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x72) - if (*z).encodedCert.Reveals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.Reveals))) - } - for zb0008 := range (*z).encodedCert.Reveals { - if (*z).encodedCert.Reveals[zb0008] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len((*z).encodedCert.Reveals[zb0008]))) - } - zb0009_keys := make([]uint64, 0, len((*z).encodedCert.Reveals[zb0008])) - for zb0009 := range (*z).encodedCert.Reveals[zb0008] { - zb0009_keys = append(zb0009_keys, zb0009) - } - sort.Sort(SortUint64(zb0009_keys)) - for _, zb0009 := range zb0009_keys { - zb0010 := (*z).encodedCert.Reveals[zb0008][zb0009] - _ = zb0010 - o = msgp.AppendUint64(o, zb0009) - o = zb0010.MarshalMsg(o) - } - } - } - if (zb0011Mask & 0x200) == 0 { // if not empty - // string "certrbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCert.BitmaskReveals)) - } - if (zb0011Mask & 0x400) == 0 { // if not empty - // string "certrnd" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64) - if (*z).CertRound == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).CertRound))) - } - for zb0001 := range (*z).CertRound { - o = (*z).CertRound[zb0001].MarshalMsg(o) - } - } - if (zb0011Mask & 0x800) == 0 { // if not empty - // string "certrndbm" - o = append(o, 0xa9, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskCertRound)) - } - if (zb0011Mask & 0x1000) == 0 { // if not empty - // string "certtype" - o = append(o, 0xa8, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65) - if (*z).CertType == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).CertType))) - } - for zb0002 := range (*z).CertType { - o = (*z).CertType[zb0002].MarshalMsg(o) - } - } - if (zb0011Mask & 0x2000) == 0 { // if not empty - // string "certtypebm" - o = append(o, 0xaa, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskCertType)) - } - if (zb0011Mask & 0x4000) == 0 { // if not empty - // string "certw" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x77) - if (*z).encodedCert.SignedWeight == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCert.SignedWeight))) - } - for zb0003 := range (*z).encodedCert.SignedWeight { - o = msgp.AppendUint64(o, (*z).encodedCert.SignedWeight[zb0003]) - } - } - if (zb0011Mask & 0x8000) == 0 { // if not empty - // string "certwbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x77, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCert.BitmaskSignedWeight)) - } - } - return -} - -func (_ *encodedCompactCertTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedCompactCertTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedCompactCertTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0011 int - var zb0012 bool - zb0011, zb0012, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0011, zb0012, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0011 > 0 { - zb0011-- - var zb0013 int - var zb0014 bool - zb0013, zb0014, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0013 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0014 { - (*z).CertRound = nil - } else if (*z).CertRound != nil && cap((*z).CertRound) >= zb0013 { - (*z).CertRound = ((*z).CertRound)[:zb0013] - } else { - (*z).CertRound = make([]basics.Round, zb0013) - } - for zb0001 := range (*z).CertRound { - bts, err = (*z).CertRound[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound", zb0001) - return - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0015 []byte - var zb0016 int - zb0016, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - if zb0016 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxBitmaskSize)) - return - } - zb0015, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - (*z).BitmaskCertRound = bitmask(zb0015) - } - } - if zb0011 > 0 { - zb0011-- - var zb0017 int - var zb0018 bool - zb0017, zb0018, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0017 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0018 { - (*z).CertType = nil - } else if (*z).CertType != nil && cap((*z).CertType) >= zb0017 { - (*z).CertType = ((*z).CertType)[:zb0017] - } else { - (*z).CertType = make([]protocol.CompactCertType, zb0017) - } - for zb0002 := range (*z).CertType { - bts, err = (*z).CertType[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType", zb0002) - return - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0019 []byte - var zb0020 int - zb0020, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - if zb0020 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0020), uint64(maxBitmaskSize)) - return - } - zb0019, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - (*z).BitmaskCertType = bitmask(zb0019) - } - } - if zb0011 > 0 { - zb0011-- - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - if zb0021 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxAddressBytes)) - return - } - (*z).encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0022 []byte - var zb0023 int - zb0023, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - if zb0023 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxBitmaskSize)) - return - } - zb0022, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - (*z).encodedCert.BitmaskSigCommit = bitmask(zb0022) - } - } - if zb0011 > 0 { - zb0011-- - var zb0024 int - var zb0025 bool - zb0024, zb0025, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0024 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0024), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0025 { - (*z).encodedCert.SignedWeight = nil - } else if (*z).encodedCert.SignedWeight != nil && cap((*z).encodedCert.SignedWeight) >= zb0024 { - (*z).encodedCert.SignedWeight = ((*z).encodedCert.SignedWeight)[:zb0024] - } else { - (*z).encodedCert.SignedWeight = make([]uint64, zb0024) - } - for zb0003 := range (*z).encodedCert.SignedWeight { - (*z).encodedCert.SignedWeight[zb0003], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight", zb0003) - return - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0026 []byte - var zb0027 int - zb0027, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - if zb0027 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0027), uint64(maxBitmaskSize)) - return - } - zb0026, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - (*z).encodedCert.BitmaskSignedWeight = bitmask(zb0026) - } - } - if zb0011 > 0 { - zb0011-- - var zb0028 int - var zb0029 bool - zb0028, zb0029, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0028 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0028), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0029 { - (*z).encodedCert.SigProofs = nil - } else if (*z).encodedCert.SigProofs != nil && cap((*z).encodedCert.SigProofs) >= zb0028 { - (*z).encodedCert.SigProofs = ((*z).encodedCert.SigProofs)[:zb0028] - } else { - (*z).encodedCert.SigProofs = make([]certProofs, zb0028) - } - for zb0004 := range (*z).encodedCert.SigProofs { - var zb0030 int - var zb0031 bool - zb0030, zb0031, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0004) - return - } - if zb0030 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0030), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0004) - return - } - if zb0031 { - (*z).encodedCert.SigProofs[zb0004] = nil - } else if (*z).encodedCert.SigProofs[zb0004] != nil && cap((*z).encodedCert.SigProofs[zb0004]) >= zb0030 { - (*z).encodedCert.SigProofs[zb0004] = ((*z).encodedCert.SigProofs[zb0004])[:zb0030] - } else { - (*z).encodedCert.SigProofs[zb0004] = make(certProofs, zb0030) - } - for zb0005 := range (*z).encodedCert.SigProofs[zb0004] { - bts, err = (*z).encodedCert.SigProofs[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0004, zb0005) - return - } - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0032 []byte - var zb0033 int - zb0033, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - if zb0033 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0033), uint64(maxBitmaskSize)) - return - } - zb0032, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - (*z).encodedCert.BitmaskSigProofs = bitmask(zb0032) - } - } - if zb0011 > 0 { - zb0011-- - var zb0034 int - var zb0035 bool - zb0034, zb0035, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0034 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0034), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0035 { - (*z).encodedCert.PartProofs = nil - } else if (*z).encodedCert.PartProofs != nil && cap((*z).encodedCert.PartProofs) >= zb0034 { - (*z).encodedCert.PartProofs = ((*z).encodedCert.PartProofs)[:zb0034] - } else { - (*z).encodedCert.PartProofs = make([]certProofs, zb0034) - } - for zb0006 := range (*z).encodedCert.PartProofs { - var zb0036 int - var zb0037 bool - zb0036, zb0037, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0006) - return - } - if zb0036 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0036), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0006) - return - } - if zb0037 { - (*z).encodedCert.PartProofs[zb0006] = nil - } else if (*z).encodedCert.PartProofs[zb0006] != nil && cap((*z).encodedCert.PartProofs[zb0006]) >= zb0036 { - (*z).encodedCert.PartProofs[zb0006] = ((*z).encodedCert.PartProofs[zb0006])[:zb0036] - } else { - (*z).encodedCert.PartProofs[zb0006] = make(certProofs, zb0036) - } - for zb0007 := range (*z).encodedCert.PartProofs[zb0006] { - bts, err = (*z).encodedCert.PartProofs[zb0006][zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0006, zb0007) - return - } - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0038 []byte - var zb0039 int - zb0039, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - if zb0039 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0039), uint64(maxBitmaskSize)) - return - } - zb0038, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - (*z).encodedCert.BitmaskPartProofs = bitmask(zb0038) - } - } - if zb0011 > 0 { - zb0011-- - var zb0040 int - var zb0041 bool - zb0040, zb0041, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0040 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0040), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0041 { - (*z).encodedCert.Reveals = nil - } else if (*z).encodedCert.Reveals != nil && cap((*z).encodedCert.Reveals) >= zb0040 { - (*z).encodedCert.Reveals = ((*z).encodedCert.Reveals)[:zb0040] - } else { - (*z).encodedCert.Reveals = make([]revealMap, zb0040) - } - for zb0008 := range (*z).encodedCert.Reveals { - var zb0042 int - var zb0043 bool - zb0042, zb0043, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0008) - return - } - if zb0042 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0042), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0008) - return - } - if zb0043 { - (*z).encodedCert.Reveals[zb0008] = nil - } else if (*z).encodedCert.Reveals[zb0008] == nil { - (*z).encodedCert.Reveals[zb0008] = make(revealMap, zb0042) - } - for zb0042 > 0 { - var zb0009 uint64 - var zb0010 compactcert.Reveal - zb0042-- - zb0009, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0008) - return - } - bts, err = zb0010.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0008, zb0009) - return - } - (*z).encodedCert.Reveals[zb0008][zb0009] = zb0010 - } - } - } - if zb0011 > 0 { - zb0011-- - { - var zb0044 []byte - var zb0045 int - zb0045, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - if zb0045 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0045), uint64(maxBitmaskSize)) - return - } - zb0044, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - (*z).encodedCert.BitmaskReveals = bitmask(zb0044) - } - } - if zb0011 > 0 { - err = msgp.ErrTooManyArrayFields(zb0011) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0012 { - (*z) = encodedCompactCertTxnFields{} - } - for zb0011 > 0 { - zb0011-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "certrnd": - var zb0046 int - var zb0047 bool - zb0046, zb0047, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound") - return - } - if zb0046 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0046), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertRound") - return - } - if zb0047 { - (*z).CertRound = nil - } else if (*z).CertRound != nil && cap((*z).CertRound) >= zb0046 { - (*z).CertRound = ((*z).CertRound)[:zb0046] - } else { - (*z).CertRound = make([]basics.Round, zb0046) - } - for zb0001 := range (*z).CertRound { - bts, err = (*z).CertRound[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound", zb0001) - return - } - } - case "certrndbm": - { - var zb0048 []byte - var zb0049 int - zb0049, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - if zb0049 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxBitmaskSize)) - return - } - zb0048, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - (*z).BitmaskCertRound = bitmask(zb0048) - } - case "certtype": - var zb0050 int - var zb0051 bool - zb0050, zb0051, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertType") - return - } - if zb0050 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0050), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertType") - return - } - if zb0051 { - (*z).CertType = nil - } else if (*z).CertType != nil && cap((*z).CertType) >= zb0050 { - (*z).CertType = ((*z).CertType)[:zb0050] - } else { - (*z).CertType = make([]protocol.CompactCertType, zb0050) - } - for zb0002 := range (*z).CertType { - bts, err = (*z).CertType[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertType", zb0002) - return - } - } - case "certtypebm": - { - var zb0052 []byte - var zb0053 int - zb0053, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - if zb0053 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0053), uint64(maxBitmaskSize)) - return - } - zb0052, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - (*z).BitmaskCertType = bitmask(zb0052) - } - case "certc": - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - if zb0054 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxAddressBytes)) - return - } - (*z).encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - case "certcbm": - { - var zb0055 []byte - var zb0056 int - zb0056, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - if zb0056 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0056), uint64(maxBitmaskSize)) - return - } - zb0055, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - (*z).encodedCert.BitmaskSigCommit = bitmask(zb0055) - } - case "certw": - var zb0057 int - var zb0058 bool - zb0057, zb0058, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0057 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0057), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0058 { - (*z).encodedCert.SignedWeight = nil - } else if (*z).encodedCert.SignedWeight != nil && cap((*z).encodedCert.SignedWeight) >= zb0057 { - (*z).encodedCert.SignedWeight = ((*z).encodedCert.SignedWeight)[:zb0057] - } else { - (*z).encodedCert.SignedWeight = make([]uint64, zb0057) - } - for zb0003 := range (*z).encodedCert.SignedWeight { - (*z).encodedCert.SignedWeight[zb0003], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight", zb0003) - return - } - } - case "certwbm": - { - var zb0059 []byte - var zb0060 int - zb0060, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - if zb0060 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxBitmaskSize)) - return - } - zb0059, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - (*z).encodedCert.BitmaskSignedWeight = bitmask(zb0059) - } - case "certS": - var zb0061 int - var zb0062 bool - zb0061, zb0062, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0061 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0061), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0062 { - (*z).encodedCert.SigProofs = nil - } else if (*z).encodedCert.SigProofs != nil && cap((*z).encodedCert.SigProofs) >= zb0061 { - (*z).encodedCert.SigProofs = ((*z).encodedCert.SigProofs)[:zb0061] - } else { - (*z).encodedCert.SigProofs = make([]certProofs, zb0061) - } - for zb0004 := range (*z).encodedCert.SigProofs { - var zb0063 int - var zb0064 bool - zb0063, zb0064, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0004) - return - } - if zb0063 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0063), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "SigProofs", zb0004) - return - } - if zb0064 { - (*z).encodedCert.SigProofs[zb0004] = nil - } else if (*z).encodedCert.SigProofs[zb0004] != nil && cap((*z).encodedCert.SigProofs[zb0004]) >= zb0063 { - (*z).encodedCert.SigProofs[zb0004] = ((*z).encodedCert.SigProofs[zb0004])[:zb0063] - } else { - (*z).encodedCert.SigProofs[zb0004] = make(certProofs, zb0063) - } - for zb0005 := range (*z).encodedCert.SigProofs[zb0004] { - bts, err = (*z).encodedCert.SigProofs[zb0004][zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0004, zb0005) - return - } - } - } - case "certSbm": - { - var zb0065 []byte - var zb0066 int - zb0066, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - if zb0066 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxBitmaskSize)) - return - } - zb0065, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - (*z).encodedCert.BitmaskSigProofs = bitmask(zb0065) - } - case "certP": - var zb0067 int - var zb0068 bool - zb0067, zb0068, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0067 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0067), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0068 { - (*z).encodedCert.PartProofs = nil - } else if (*z).encodedCert.PartProofs != nil && cap((*z).encodedCert.PartProofs) >= zb0067 { - (*z).encodedCert.PartProofs = ((*z).encodedCert.PartProofs)[:zb0067] - } else { - (*z).encodedCert.PartProofs = make([]certProofs, zb0067) - } - for zb0006 := range (*z).encodedCert.PartProofs { - var zb0069 int - var zb0070 bool - zb0069, zb0070, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0006) - return - } - if zb0069 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0069), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "PartProofs", zb0006) - return - } - if zb0070 { - (*z).encodedCert.PartProofs[zb0006] = nil - } else if (*z).encodedCert.PartProofs[zb0006] != nil && cap((*z).encodedCert.PartProofs[zb0006]) >= zb0069 { - (*z).encodedCert.PartProofs[zb0006] = ((*z).encodedCert.PartProofs[zb0006])[:zb0069] - } else { - (*z).encodedCert.PartProofs[zb0006] = make(certProofs, zb0069) - } - for zb0007 := range (*z).encodedCert.PartProofs[zb0006] { - bts, err = (*z).encodedCert.PartProofs[zb0006][zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0006, zb0007) - return - } - } - } - case "certPbm": - { - var zb0071 []byte - var zb0072 int - zb0072, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - if zb0072 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxBitmaskSize)) - return - } - zb0071, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - (*z).encodedCert.BitmaskPartProofs = bitmask(zb0071) - } - case "certr": - var zb0073 int - var zb0074 bool - zb0073, zb0074, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals") - return - } - if zb0073 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0073), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Reveals") - return - } - if zb0074 { - (*z).encodedCert.Reveals = nil - } else if (*z).encodedCert.Reveals != nil && cap((*z).encodedCert.Reveals) >= zb0073 { - (*z).encodedCert.Reveals = ((*z).encodedCert.Reveals)[:zb0073] - } else { - (*z).encodedCert.Reveals = make([]revealMap, zb0073) - } - for zb0008 := range (*z).encodedCert.Reveals { - var zb0075 int - var zb0076 bool - zb0075, zb0076, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0008) - return - } - if zb0075 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0075), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "Reveals", zb0008) - return - } - if zb0076 { - (*z).encodedCert.Reveals[zb0008] = nil - } else if (*z).encodedCert.Reveals[zb0008] == nil { - (*z).encodedCert.Reveals[zb0008] = make(revealMap, zb0075) - } - for zb0075 > 0 { - var zb0009 uint64 - var zb0010 compactcert.Reveal - zb0075-- - zb0009, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0008) - return - } - bts, err = zb0010.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0008, zb0009) - return - } - (*z).encodedCert.Reveals[zb0008][zb0009] = zb0010 - } - } - case "certrbm": - { - var zb0077 []byte - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - if zb0078 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxBitmaskSize)) - return - } - zb0077, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - (*z).encodedCert.BitmaskReveals = bitmask(zb0077) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedCompactCertTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedCompactCertTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedCompactCertTxnFields) Msgsize() (s int) { - s = 1 + 8 + msgp.ArrayHeaderSize - for zb0001 := range (*z).CertRound { - s += (*z).CertRound[zb0001].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskCertRound)) + 9 + msgp.ArrayHeaderSize - for zb0002 := range (*z).CertType { - s += (*z).CertType[zb0002].Msgsize() - } - s += 11 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskCertType)) + 6 + msgp.BytesPrefixSize + len((*z).encodedCert.SigCommit) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCert.BitmaskSigCommit)) + 6 + msgp.ArrayHeaderSize + (len((*z).encodedCert.SignedWeight) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCert.BitmaskSignedWeight)) + 6 + msgp.ArrayHeaderSize - for zb0004 := range (*z).encodedCert.SigProofs { - s += msgp.ArrayHeaderSize - for zb0005 := range (*z).encodedCert.SigProofs[zb0004] { - s += (*z).encodedCert.SigProofs[zb0004][zb0005].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCert.BitmaskSigProofs)) + 6 + msgp.ArrayHeaderSize - for zb0006 := range (*z).encodedCert.PartProofs { - s += msgp.ArrayHeaderSize - for zb0007 := range (*z).encodedCert.PartProofs[zb0006] { - s += (*z).encodedCert.PartProofs[zb0006][zb0007].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCert.BitmaskPartProofs)) + 6 + msgp.ArrayHeaderSize - for zb0008 := range (*z).encodedCert.Reveals { - s += msgp.MapHeaderSize - if (*z).encodedCert.Reveals[zb0008] != nil { - for zb0009, zb0010 := range (*z).encodedCert.Reveals[zb0008] { - _ = zb0009 - _ = zb0010 - s += 0 + msgp.Uint64Size + zb0010.Msgsize() - } - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCert.BitmaskReveals)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedCompactCertTxnFields) MsgIsZero() bool { - return (len((*z).CertRound) == 0) && (len((*z).BitmaskCertRound) == 0) && (len((*z).CertType) == 0) && (len((*z).BitmaskCertType) == 0) && (len((*z).encodedCert.SigCommit) == 0) && (len((*z).encodedCert.BitmaskSigCommit) == 0) && (len((*z).encodedCert.SignedWeight) == 0) && (len((*z).encodedCert.BitmaskSignedWeight) == 0) && (len((*z).encodedCert.SigProofs) == 0) && (len((*z).encodedCert.BitmaskSigProofs) == 0) && (len((*z).encodedCert.PartProofs) == 0) && (len((*z).encodedCert.BitmaskPartProofs) == 0) && (len((*z).encodedCert.Reveals) == 0) && (len((*z).encodedCert.BitmaskReveals) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedKeyregTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0004Len := uint32(9) - var zb0004Mask uint16 /* 10 bits */ - if len((*z).BitmaskNonparticipation) == 0 { - zb0004Len-- - zb0004Mask |= 0x2 - } - if len((*z).SelectionPK) == 0 { - zb0004Len-- - zb0004Mask |= 0x4 - } - if len((*z).VoteFirst) == 0 { - zb0004Len-- - zb0004Mask |= 0x8 - } - if len((*z).BitmaskVoteFirst) == 0 { - zb0004Len-- - zb0004Mask |= 0x10 - } - if len((*z).BitmaskKeys) == 0 { - zb0004Len-- - zb0004Mask |= 0x20 - } - if len((*z).VoteKeyDilution) == 0 { - zb0004Len-- - zb0004Mask |= 0x40 - } - if len((*z).VotePK) == 0 { - zb0004Len-- - zb0004Mask |= 0x80 - } - if len((*z).VoteLast) == 0 { - zb0004Len-- - zb0004Mask |= 0x100 - } - if len((*z).BitmaskVoteLast) == 0 { - zb0004Len-- - zb0004Mask |= 0x200 - } - // variable map header, size zb0004Len - o = append(o, 0x80|uint8(zb0004Len)) - if zb0004Len != 0 { - if (zb0004Mask & 0x2) == 0 { // if not empty - // string "nonpartbm" - o = append(o, 0xa9, 0x6e, 0x6f, 0x6e, 0x70, 0x61, 0x72, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskNonparticipation)) - } - if (zb0004Mask & 0x4) == 0 { // if not empty - // string "selkey" - o = append(o, 0xa6, 0x73, 0x65, 0x6c, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).SelectionPK) - } - if (zb0004Mask & 0x8) == 0 { // if not empty - // string "votefst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) - if (*z).VoteFirst == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).VoteFirst))) - } - for zb0001 := range (*z).VoteFirst { - o = (*z).VoteFirst[zb0001].MarshalMsg(o) - } - } - if (zb0004Mask & 0x10) == 0 { // if not empty - // string "votefstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskVoteFirst)) - } - if (zb0004Mask & 0x20) == 0 { // if not empty - // string "votekbm" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskKeys)) - } - if (zb0004Mask & 0x40) == 0 { // if not empty - // string "votekd" - o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) - if (*z).VoteKeyDilution == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).VoteKeyDilution))) - } - for zb0003 := range (*z).VoteKeyDilution { - o = msgp.AppendUint64(o, (*z).VoteKeyDilution[zb0003]) - } - } - if (zb0004Mask & 0x80) == 0 { // if not empty - // string "votekey" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).VotePK) - } - if (zb0004Mask & 0x100) == 0 { // if not empty - // string "votelst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) - if (*z).VoteLast == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).VoteLast))) - } - for zb0002 := range (*z).VoteLast { - o = (*z).VoteLast[zb0002].MarshalMsg(o) - } - } - if (zb0004Mask & 0x200) == 0 { // if not empty - // string "votelstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskVoteLast)) - } - } - return -} - -func (_ *encodedKeyregTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedKeyregTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedKeyregTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0004 int - var zb0005 bool - zb0004, zb0005, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0004 > 0 { - zb0004-- - var zb0006 int - zb0006, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - if zb0006 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxAddressBytes)) - return - } - (*z).VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).VotePK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - } - if zb0004 > 0 { - zb0004-- - var zb0007 int - zb0007, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - if zb0007 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxAddressBytes)) - return - } - (*z).SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).SelectionPK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - } - if zb0004 > 0 { - zb0004-- - var zb0008 int - var zb0009 bool - zb0008, zb0009, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0008 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0008), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0009 { - (*z).VoteFirst = nil - } else if (*z).VoteFirst != nil && cap((*z).VoteFirst) >= zb0008 { - (*z).VoteFirst = ((*z).VoteFirst)[:zb0008] - } else { - (*z).VoteFirst = make([]basics.Round, zb0008) - } - for zb0001 := range (*z).VoteFirst { - bts, err = (*z).VoteFirst[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst", zb0001) - return - } - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0010 []byte - var zb0011 int - zb0011, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - if zb0011 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxBitmaskSize)) - return - } - zb0010, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - (*z).BitmaskVoteFirst = bitmask(zb0010) - } - } - if zb0004 > 0 { - zb0004-- - var zb0012 int - var zb0013 bool - zb0012, zb0013, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0012 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0012), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0013 { - (*z).VoteLast = nil - } else if (*z).VoteLast != nil && cap((*z).VoteLast) >= zb0012 { - (*z).VoteLast = ((*z).VoteLast)[:zb0012] - } else { - (*z).VoteLast = make([]basics.Round, zb0012) - } - for zb0002 := range (*z).VoteLast { - bts, err = (*z).VoteLast[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast", zb0002) - return - } - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0014 []byte - var zb0015 int - zb0015, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - if zb0015 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0015), uint64(maxBitmaskSize)) - return - } - zb0014, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - (*z).BitmaskVoteLast = bitmask(zb0014) - } - } - if zb0004 > 0 { - zb0004-- - var zb0016 int - var zb0017 bool - zb0016, zb0017, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0016 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0017 { - (*z).VoteKeyDilution = nil - } else if (*z).VoteKeyDilution != nil && cap((*z).VoteKeyDilution) >= zb0016 { - (*z).VoteKeyDilution = ((*z).VoteKeyDilution)[:zb0016] - } else { - (*z).VoteKeyDilution = make([]uint64, zb0016) - } - for zb0003 := range (*z).VoteKeyDilution { - (*z).VoteKeyDilution[zb0003], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution", zb0003) - return - } - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0018 []byte - var zb0019 int - zb0019, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - if zb0019 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0019), uint64(maxBitmaskSize)) - return - } - zb0018, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - (*z).BitmaskKeys = bitmask(zb0018) - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0020 []byte - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - if zb0021 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxBitmaskSize)) - return - } - zb0020, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - (*z).BitmaskNonparticipation = bitmask(zb0020) - } - } - if zb0004 > 0 { - err = msgp.ErrTooManyArrayFields(zb0004) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0005 { - (*z) = encodedKeyregTxnFields{} - } - for zb0004 > 0 { - zb0004-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "votekey": - var zb0022 int - zb0022, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - if zb0022 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxAddressBytes)) - return - } - (*z).VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).VotePK) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - case "selkey": - var zb0023 int - zb0023, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - if zb0023 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxAddressBytes)) - return - } - (*z).SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).SelectionPK) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - case "votefst": - var zb0024 int - var zb0025 bool - zb0024, zb0025, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0024 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0024), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0025 { - (*z).VoteFirst = nil - } else if (*z).VoteFirst != nil && cap((*z).VoteFirst) >= zb0024 { - (*z).VoteFirst = ((*z).VoteFirst)[:zb0024] - } else { - (*z).VoteFirst = make([]basics.Round, zb0024) - } - for zb0001 := range (*z).VoteFirst { - bts, err = (*z).VoteFirst[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst", zb0001) - return - } - } - case "votefstbm": - { - var zb0026 []byte - var zb0027 int - zb0027, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - if zb0027 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0027), uint64(maxBitmaskSize)) - return - } - zb0026, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - (*z).BitmaskVoteFirst = bitmask(zb0026) - } - case "votelst": - var zb0028 int - var zb0029 bool - zb0028, zb0029, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0028 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0028), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0029 { - (*z).VoteLast = nil - } else if (*z).VoteLast != nil && cap((*z).VoteLast) >= zb0028 { - (*z).VoteLast = ((*z).VoteLast)[:zb0028] - } else { - (*z).VoteLast = make([]basics.Round, zb0028) - } - for zb0002 := range (*z).VoteLast { - bts, err = (*z).VoteLast[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast", zb0002) - return - } - } - case "votelstbm": - { - var zb0030 []byte - var zb0031 int - zb0031, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - if zb0031 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0031), uint64(maxBitmaskSize)) - return - } - zb0030, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - (*z).BitmaskVoteLast = bitmask(zb0030) - } - case "votekd": - var zb0032 int - var zb0033 bool - zb0032, zb0033, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0032 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0032), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0033 { - (*z).VoteKeyDilution = nil - } else if (*z).VoteKeyDilution != nil && cap((*z).VoteKeyDilution) >= zb0032 { - (*z).VoteKeyDilution = ((*z).VoteKeyDilution)[:zb0032] - } else { - (*z).VoteKeyDilution = make([]uint64, zb0032) - } - for zb0003 := range (*z).VoteKeyDilution { - (*z).VoteKeyDilution[zb0003], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution", zb0003) - return - } - } - case "votekbm": - { - var zb0034 []byte - var zb0035 int - zb0035, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - if zb0035 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0035), uint64(maxBitmaskSize)) - return - } - zb0034, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - (*z).BitmaskKeys = bitmask(zb0034) - } - case "nonpartbm": - { - var zb0036 []byte - var zb0037 int - zb0037, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - if zb0037 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0037), uint64(maxBitmaskSize)) - return - } - zb0036, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - (*z).BitmaskNonparticipation = bitmask(zb0036) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedKeyregTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedKeyregTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedKeyregTxnFields) Msgsize() (s int) { - s = 1 + 8 + msgp.BytesPrefixSize + len((*z).VotePK) + 7 + msgp.BytesPrefixSize + len((*z).SelectionPK) + 8 + msgp.ArrayHeaderSize - for zb0001 := range (*z).VoteFirst { - s += (*z).VoteFirst[zb0001].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskVoteFirst)) + 8 + msgp.ArrayHeaderSize - for zb0002 := range (*z).VoteLast { - s += (*z).VoteLast[zb0002].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskVoteLast)) + 7 + msgp.ArrayHeaderSize + (len((*z).VoteKeyDilution) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskKeys)) + 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskNonparticipation)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedKeyregTxnFields) MsgIsZero() bool { - return (len((*z).VotePK) == 0) && (len((*z).SelectionPK) == 0) && (len((*z).VoteFirst) == 0) && (len((*z).BitmaskVoteFirst) == 0) && (len((*z).VoteLast) == 0) && (len((*z).BitmaskVoteLast) == 0) && (len((*z).VoteKeyDilution) == 0) && (len((*z).BitmaskKeys) == 0) && (len((*z).BitmaskNonparticipation) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedLsigs) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0004Len := uint32(4) - var zb0004Mask uint8 /* 5 bits */ - if len((*z).LogicArgs) == 0 { - zb0004Len-- - zb0004Mask |= 0x2 - } - if len((*z).BitmaskLogicArgs) == 0 { - zb0004Len-- - zb0004Mask |= 0x4 - } - if len((*z).Logic) == 0 { - zb0004Len-- - zb0004Mask |= 0x8 - } - if len((*z).BitmaskLogic) == 0 { - zb0004Len-- - zb0004Mask |= 0x10 - } - // variable map header, size zb0004Len - o = append(o, 0x80|uint8(zb0004Len)) - if zb0004Len != 0 { - if (zb0004Mask & 0x2) == 0 { // if not empty - // string "lsigarg" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67) - if (*z).LogicArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).LogicArgs))) - } - for zb0002 := range (*z).LogicArgs { - if (*z).LogicArgs[zb0002] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).LogicArgs[zb0002]))) - } - for zb0003 := range (*z).LogicArgs[zb0002] { - o = msgp.AppendBytes(o, (*z).LogicArgs[zb0002][zb0003]) - } - } - } - if (zb0004Mask & 0x4) == 0 { // if not empty - // string "lsigargbm" - o = append(o, 0xa9, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLogicArgs)) - } - if (zb0004Mask & 0x8) == 0 { // if not empty - // string "lsigl" - o = append(o, 0xa5, 0x6c, 0x73, 0x69, 0x67, 0x6c) - if (*z).Logic == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Logic))) - } - for zb0001 := range (*z).Logic { - o = msgp.AppendBytes(o, (*z).Logic[zb0001]) - } - } - if (zb0004Mask & 0x10) == 0 { // if not empty - // string "lsiglbm" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x6c, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLogic)) - } - } - return -} - -func (_ *encodedLsigs) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedLsigs) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedLsigs) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0004 int - var zb0005 bool - zb0004, zb0005, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0004 > 0 { - zb0004-- - var zb0006 int - var zb0007 bool - zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0006 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0007 { - (*z).Logic = nil - } else if (*z).Logic != nil && cap((*z).Logic) >= zb0006 { - (*z).Logic = ((*z).Logic)[:zb0006] - } else { - (*z).Logic = make([][]byte, zb0006) - } - for zb0001 := range (*z).Logic { - var zb0008 int - zb0008, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0001) - return - } - if zb0008 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0008), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).Logic[zb0001], bts, err = msgp.ReadBytesBytes(bts, (*z).Logic[zb0001]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0001) - return - } - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0009 []byte - var zb0010 int - zb0010, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - if zb0010 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0010), uint64(maxBitmaskSize)) - return - } - zb0009, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - (*z).BitmaskLogic = bitmask(zb0009) - } - } - if zb0004 > 0 { - zb0004-- - var zb0011 int - var zb0012 bool - zb0011, zb0012, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0011 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0012 { - (*z).LogicArgs = nil - } else if (*z).LogicArgs != nil && cap((*z).LogicArgs) >= zb0011 { - (*z).LogicArgs = ((*z).LogicArgs)[:zb0011] - } else { - (*z).LogicArgs = make([][][]byte, zb0011) - } - for zb0002 := range (*z).LogicArgs { - var zb0013 int - var zb0014 bool - zb0013, zb0014, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0002) - return - } - if zb0013 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0013), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0002) - return - } - if zb0014 { - (*z).LogicArgs[zb0002] = nil - } else if (*z).LogicArgs[zb0002] != nil && cap((*z).LogicArgs[zb0002]) >= zb0013 { - (*z).LogicArgs[zb0002] = ((*z).LogicArgs[zb0002])[:zb0013] - } else { - (*z).LogicArgs[zb0002] = make([][]byte, zb0013) - } - for zb0003 := range (*z).LogicArgs[zb0002] { - var zb0015 int - zb0015, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0002, zb0003) - return - } - if zb0015 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0015), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).LogicArgs[zb0002][zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).LogicArgs[zb0002][zb0003]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0002, zb0003) - return - } - } - } - } - if zb0004 > 0 { - zb0004-- - { - var zb0016 []byte - var zb0017 int - zb0017, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - if zb0017 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxBitmaskSize)) - return - } - zb0016, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - (*z).BitmaskLogicArgs = bitmask(zb0016) - } - } - if zb0004 > 0 { - err = msgp.ErrTooManyArrayFields(zb0004) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0005 { - (*z) = encodedLsigs{} - } - for zb0004 > 0 { - zb0004-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "lsigl": - var zb0018 int - var zb0019 bool - zb0018, zb0019, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Logic") - return - } - if zb0018 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0018), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Logic") - return - } - if zb0019 { - (*z).Logic = nil - } else if (*z).Logic != nil && cap((*z).Logic) >= zb0018 { - (*z).Logic = ((*z).Logic)[:zb0018] - } else { - (*z).Logic = make([][]byte, zb0018) - } - for zb0001 := range (*z).Logic { - var zb0020 int - zb0020, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0001) - return - } - if zb0020 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0020), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).Logic[zb0001], bts, err = msgp.ReadBytesBytes(bts, (*z).Logic[zb0001]) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0001) - return - } - } - case "lsiglbm": - { - var zb0021 []byte - var zb0022 int - zb0022, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - if zb0022 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxBitmaskSize)) - return - } - zb0021, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - (*z).BitmaskLogic = bitmask(zb0021) - } - case "lsigarg": - var zb0023 int - var zb0024 bool - zb0023, zb0024, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0023 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0024 { - (*z).LogicArgs = nil - } else if (*z).LogicArgs != nil && cap((*z).LogicArgs) >= zb0023 { - (*z).LogicArgs = ((*z).LogicArgs)[:zb0023] - } else { - (*z).LogicArgs = make([][][]byte, zb0023) - } - for zb0002 := range (*z).LogicArgs { - var zb0025 int - var zb0026 bool - zb0025, zb0026, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0002) - return - } - if zb0025 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0025), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "LogicArgs", zb0002) - return - } - if zb0026 { - (*z).LogicArgs[zb0002] = nil - } else if (*z).LogicArgs[zb0002] != nil && cap((*z).LogicArgs[zb0002]) >= zb0025 { - (*z).LogicArgs[zb0002] = ((*z).LogicArgs[zb0002])[:zb0025] - } else { - (*z).LogicArgs[zb0002] = make([][]byte, zb0025) - } - for zb0003 := range (*z).LogicArgs[zb0002] { - var zb0027 int - zb0027, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0002, zb0003) - return - } - if zb0027 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0027), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).LogicArgs[zb0002][zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).LogicArgs[zb0002][zb0003]) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0002, zb0003) - return - } - } - } - case "lsigargbm": - { - var zb0028 []byte - var zb0029 int - zb0029, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - if zb0029 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0029), uint64(maxBitmaskSize)) - return - } - zb0028, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - (*z).BitmaskLogicArgs = bitmask(zb0028) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedLsigs) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedLsigs) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedLsigs) Msgsize() (s int) { - s = 1 + 6 + msgp.ArrayHeaderSize - for zb0001 := range (*z).Logic { - s += msgp.BytesPrefixSize + len((*z).Logic[zb0001]) - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLogic)) + 8 + msgp.ArrayHeaderSize - for zb0002 := range (*z).LogicArgs { - s += msgp.ArrayHeaderSize - for zb0003 := range (*z).LogicArgs[zb0002] { - s += msgp.BytesPrefixSize + len((*z).LogicArgs[zb0002][zb0003]) - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLogicArgs)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedLsigs) MsgIsZero() bool { - return (len((*z).Logic) == 0) && (len((*z).BitmaskLogic) == 0) && (len((*z).LogicArgs) == 0) && (len((*z).BitmaskLogicArgs) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedMsigs) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0003Len := uint32(6) - var zb0003Mask uint8 /* 7 bits */ - if len((*z).Threshold) == 0 { - zb0003Len-- - zb0003Mask |= 0x2 - } - if len((*z).BitmaskThreshold) == 0 { - zb0003Len-- - zb0003Mask |= 0x4 - } - if len((*z).Version) == 0 { - zb0003Len-- - zb0003Mask |= 0x8 - } - if len((*z).BitmaskVersion) == 0 { - zb0003Len-- - zb0003Mask |= 0x10 - } - if len((*z).Subsigs) == 0 { - zb0003Len-- - zb0003Mask |= 0x20 - } - if len((*z).BitmaskSubsigs) == 0 { - zb0003Len-- - zb0003Mask |= 0x40 - } - // variable map header, size zb0003Len - o = append(o, 0x80|uint8(zb0003Len)) - if zb0003Len != 0 { - if (zb0003Mask & 0x2) == 0 { // if not empty - // string "msigthr" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72) - o = msgp.AppendBytes(o, (*z).Threshold) - } - if (zb0003Mask & 0x4) == 0 { // if not empty - // string "msigthrbm" - o = append(o, 0xa9, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskThreshold)) - } - if (zb0003Mask & 0x8) == 0 { // if not empty - // string "msigv" - o = append(o, 0xa5, 0x6d, 0x73, 0x69, 0x67, 0x76) - o = msgp.AppendBytes(o, (*z).Version) - } - if (zb0003Mask & 0x10) == 0 { // if not empty - // string "msigvbm" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskVersion)) - } - if (zb0003Mask & 0x20) == 0 { // if not empty - // string "subsig" - o = append(o, 0xa6, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67) - if (*z).Subsigs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Subsigs))) - } - for zb0001 := range (*z).Subsigs { - if (*z).Subsigs[zb0001] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Subsigs[zb0001]))) - } - for zb0002 := range (*z).Subsigs[zb0001] { - o = (*z).Subsigs[zb0001][zb0002].MarshalMsg(o) - } - } - } - if (zb0003Mask & 0x40) == 0 { // if not empty - // string "subsigsbm" - o = append(o, 0xa9, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSubsigs)) - } - } - return -} - -func (_ *encodedMsigs) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedMsigs) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedMsigs) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0003 int - var zb0004 bool - zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 > 0 { - zb0003-- - var zb0005 int - zb0005, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - if zb0005 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0005), uint64(maxEncodedTransactionGroups)) - return - } - (*z).Version, bts, err = msgp.ReadBytesBytes(bts, (*z).Version) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0006 []byte - var zb0007 int - zb0007, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - if zb0007 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxBitmaskSize)) - return - } - zb0006, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - (*z).BitmaskVersion = bitmask(zb0006) - } - } - if zb0003 > 0 { - zb0003-- - var zb0008 int - zb0008, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - if zb0008 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0008), uint64(maxEncodedTransactionGroups)) - return - } - (*z).Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).Threshold) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0009 []byte - var zb0010 int - zb0010, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - if zb0010 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0010), uint64(maxBitmaskSize)) - return - } - zb0009, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - (*z).BitmaskThreshold = bitmask(zb0009) - } - } - if zb0003 > 0 { - zb0003-- - var zb0011 int - var zb0012 bool - zb0011, zb0012, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0011 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0012 { - (*z).Subsigs = nil - } else if (*z).Subsigs != nil && cap((*z).Subsigs) >= zb0011 { - (*z).Subsigs = ((*z).Subsigs)[:zb0011] - } else { - (*z).Subsigs = make([][]crypto.MultisigSubsig, zb0011) - } - for zb0001 := range (*z).Subsigs { - var zb0013 int - var zb0014 bool - zb0013, zb0014, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0013 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0013), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0014 { - (*z).Subsigs[zb0001] = nil - } else if (*z).Subsigs[zb0001] != nil && cap((*z).Subsigs[zb0001]) >= zb0013 { - (*z).Subsigs[zb0001] = ((*z).Subsigs[zb0001])[:zb0013] - } else { - (*z).Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0013) - } - for zb0002 := range (*z).Subsigs[zb0001] { - bts, err = (*z).Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001, zb0002) - return - } - } - } - } - if zb0003 > 0 { - zb0003-- - { - var zb0015 []byte - var zb0016 int - zb0016, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - if zb0016 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxBitmaskSize)) - return - } - zb0015, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - (*z).BitmaskSubsigs = bitmask(zb0015) - } - } - if zb0003 > 0 { - err = msgp.ErrTooManyArrayFields(zb0003) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0004 { - (*z) = encodedMsigs{} - } - for zb0003 > 0 { - zb0003-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "msigv": - var zb0017 int - zb0017, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - if zb0017 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxEncodedTransactionGroups)) - return - } - (*z).Version, bts, err = msgp.ReadBytesBytes(bts, (*z).Version) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - case "msigvbm": - { - var zb0018 []byte - var zb0019 int - zb0019, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - if zb0019 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0019), uint64(maxBitmaskSize)) - return - } - zb0018, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - (*z).BitmaskVersion = bitmask(zb0018) - } - case "msigthr": - var zb0020 int - zb0020, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - if zb0020 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0020), uint64(maxEncodedTransactionGroups)) - return - } - (*z).Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).Threshold) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - case "msigthrbm": - { - var zb0021 []byte - var zb0022 int - zb0022, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - if zb0022 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxBitmaskSize)) - return - } - zb0021, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - (*z).BitmaskThreshold = bitmask(zb0021) - } - case "subsig": - var zb0023 int - var zb0024 bool - zb0023, zb0024, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0023 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0024 { - (*z).Subsigs = nil - } else if (*z).Subsigs != nil && cap((*z).Subsigs) >= zb0023 { - (*z).Subsigs = ((*z).Subsigs)[:zb0023] - } else { - (*z).Subsigs = make([][]crypto.MultisigSubsig, zb0023) - } - for zb0001 := range (*z).Subsigs { - var zb0025 int - var zb0026 bool - zb0025, zb0026, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0025 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0025), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0026 { - (*z).Subsigs[zb0001] = nil - } else if (*z).Subsigs[zb0001] != nil && cap((*z).Subsigs[zb0001]) >= zb0025 { - (*z).Subsigs[zb0001] = ((*z).Subsigs[zb0001])[:zb0025] - } else { - (*z).Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0025) - } - for zb0002 := range (*z).Subsigs[zb0001] { - bts, err = (*z).Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001, zb0002) - return - } - } - } - case "subsigsbm": - { - var zb0027 []byte - var zb0028 int - zb0028, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - if zb0028 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0028), uint64(maxBitmaskSize)) - return - } - zb0027, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - (*z).BitmaskSubsigs = bitmask(zb0027) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedMsigs) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedMsigs) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedMsigs) Msgsize() (s int) { - s = 1 + 6 + msgp.BytesPrefixSize + len((*z).Version) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskVersion)) + 8 + msgp.BytesPrefixSize + len((*z).Threshold) + 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskThreshold)) + 7 + msgp.ArrayHeaderSize - for zb0001 := range (*z).Subsigs { - s += msgp.ArrayHeaderSize - for zb0002 := range (*z).Subsigs[zb0001] { - s += (*z).Subsigs[zb0001][zb0002].Msgsize() - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSubsigs)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedMsigs) MsgIsZero() bool { - return (len((*z).Version) == 0) && (len((*z).BitmaskVersion) == 0) && (len((*z).Threshold) == 0) && (len((*z).BitmaskThreshold) == 0) && (len((*z).Subsigs) == 0) && (len((*z).BitmaskSubsigs) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedPaymentTxnFields) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0002Len := uint32(6) - var zb0002Mask uint8 /* 7 bits */ - if len((*z).Amount) == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - if len((*z).BitmaskAmount) == 0 { - zb0002Len-- - zb0002Mask |= 0x4 - } - if len((*z).CloseRemainderTo) == 0 { - zb0002Len-- - zb0002Mask |= 0x8 - } - if len((*z).BitmaskCloseRemainderTo) == 0 { - zb0002Len-- - zb0002Mask |= 0x10 - } - if len((*z).Receiver) == 0 { - zb0002Len-- - zb0002Mask |= 0x20 - } - if len((*z).BitmaskReceiver) == 0 { - zb0002Len-- - zb0002Mask |= 0x40 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if zb0002Len != 0 { - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "amt" - o = append(o, 0xa3, 0x61, 0x6d, 0x74) - if (*z).Amount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Amount))) - } - for zb0001 := range (*z).Amount { - o = (*z).Amount[zb0001].MarshalMsg(o) - } - } - if (zb0002Mask & 0x4) == 0 { // if not empty - // string "amtbm" - o = append(o, 0xa5, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAmount)) - } - if (zb0002Mask & 0x8) == 0 { // if not empty - // string "close" - o = append(o, 0xa5, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).CloseRemainderTo) - } - if (zb0002Mask & 0x10) == 0 { // if not empty - // string "closebm" - o = append(o, 0xa7, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskCloseRemainderTo)) - } - if (zb0002Mask & 0x20) == 0 { // if not empty - // string "rcv" - o = append(o, 0xa3, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).Receiver) - } - if (zb0002Mask & 0x40) == 0 { // if not empty - // string "rcvbm" - o = append(o, 0xa5, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskReceiver)) - } - } - return -} - -func (_ *encodedPaymentTxnFields) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedPaymentTxnFields) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedPaymentTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > 0 { - zb0002-- - var zb0004 int - zb0004, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - if zb0004 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxAddressBytes)) - return - } - (*z).Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).Receiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0005 []byte - var zb0006 int - zb0006, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - if zb0006 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxBitmaskSize)) - return - } - zb0005, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - (*z).BitmaskReceiver = bitmask(zb0005) - } - } - if zb0002 > 0 { - zb0002-- - var zb0007 int - var zb0008 bool - zb0007, zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0007 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0008 { - (*z).Amount = nil - } else if (*z).Amount != nil && cap((*z).Amount) >= zb0007 { - (*z).Amount = ((*z).Amount)[:zb0007] - } else { - (*z).Amount = make([]basics.MicroAlgos, zb0007) - } - for zb0001 := range (*z).Amount { - bts, err = (*z).Amount[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount", zb0001) - return - } - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0009 []byte - var zb0010 int - zb0010, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - if zb0010 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0010), uint64(maxBitmaskSize)) - return - } - zb0009, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - (*z).BitmaskAmount = bitmask(zb0009) - } - } - if zb0002 > 0 { - zb0002-- - var zb0011 int - zb0011, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - if zb0011 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxAddressBytes)) - return - } - (*z).CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - } - if zb0002 > 0 { - zb0002-- - { - var zb0012 []byte - var zb0013 int - zb0013, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - if zb0013 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxBitmaskSize)) - return - } - zb0012, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - (*z).BitmaskCloseRemainderTo = bitmask(zb0012) - } - } - if zb0002 > 0 { - err = msgp.ErrTooManyArrayFields(zb0002) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = encodedPaymentTxnFields{} - } - for zb0002 > 0 { - zb0002-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "rcv": - var zb0014 int - zb0014, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - if zb0014 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0014), uint64(maxAddressBytes)) - return - } - (*z).Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).Receiver) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - case "rcvbm": - { - var zb0015 []byte - var zb0016 int - zb0016, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - if zb0016 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0016), uint64(maxBitmaskSize)) - return - } - zb0015, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - (*z).BitmaskReceiver = bitmask(zb0015) - } - case "amt": - var zb0017 int - var zb0018 bool - zb0017, zb0018, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Amount") - return - } - if zb0017 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Amount") - return - } - if zb0018 { - (*z).Amount = nil - } else if (*z).Amount != nil && cap((*z).Amount) >= zb0017 { - (*z).Amount = ((*z).Amount)[:zb0017] - } else { - (*z).Amount = make([]basics.MicroAlgos, zb0017) - } - for zb0001 := range (*z).Amount { - bts, err = (*z).Amount[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Amount", zb0001) - return - } - } - case "amtbm": - { - var zb0019 []byte - var zb0020 int - zb0020, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - if zb0020 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0020), uint64(maxBitmaskSize)) - return - } - zb0019, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - (*z).BitmaskAmount = bitmask(zb0019) - } - case "close": - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - if zb0021 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxAddressBytes)) - return - } - (*z).CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - case "closebm": - { - var zb0022 []byte - var zb0023 int - zb0023, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - if zb0023 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0023), uint64(maxBitmaskSize)) - return - } - zb0022, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - (*z).BitmaskCloseRemainderTo = bitmask(zb0022) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedPaymentTxnFields) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedPaymentTxnFields) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedPaymentTxnFields) Msgsize() (s int) { - s = 1 + 4 + msgp.BytesPrefixSize + len((*z).Receiver) + 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskReceiver)) + 4 + msgp.ArrayHeaderSize - for zb0001 := range (*z).Amount { - s += (*z).Amount[zb0001].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAmount)) + 6 + msgp.BytesPrefixSize + len((*z).CloseRemainderTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskCloseRemainderTo)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedPaymentTxnFields) MsgIsZero() bool { - return (len((*z).Receiver) == 0) && (len((*z).BitmaskReceiver) == 0) && (len((*z).Amount) == 0) && (len((*z).BitmaskAmount) == 0) && (len((*z).CloseRemainderTo) == 0) && (len((*z).BitmaskCloseRemainderTo) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedSignedTxns) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0049Len := uint32(126) - var zb0049Mask [3]uint64 /* 140 bits */ - if len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000 - } - if len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.Amount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000000 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.CertRound) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.CertType) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000000000 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2 - } - if len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100 - } - if len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200 - } - if len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400 - } - if len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800 - } - if len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000 - } - if len((*z).encodedTxns.encodedTxnHeaders.Fee) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskFee) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000 - } - if len((*z).encodedTxns.encodedTxnHeaders.FirstValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000 - } - if len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000 - } - if len((*z).encodedLsigs.LogicArgs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000 - } - if len((*z).encodedLsigs.BitmaskLogicArgs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000 - } - if len((*z).encodedLsigs.Logic) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000 - } - if len((*z).encodedLsigs.BitmaskLogic) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.LastValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.Lease) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskLease) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000 - } - if len((*z).encodedMsigs.Threshold) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000 - } - if len((*z).encodedMsigs.BitmaskThreshold) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000 - } - if len((*z).encodedMsigs.Version) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000000 - } - if len((*z).encodedMsigs.BitmaskVersion) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000000 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.Note) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskNote) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000000 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.Receiver) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000000 - } - if len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.RekeyTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000000 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000000 - } - if len((*z).AuthAddr) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000000000 - } - if len((*z).BitmaskAuthAddr) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000000000 - } - if len((*z).Sig) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000000000 - } - if len((*z).BitmaskSig) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.Sender) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000000000 - } - if len((*z).encodedTxns.encodedTxnHeaders.BitmaskSender) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000000000 - } - if len((*z).encodedMsigs.Subsigs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000000000 - } - if len((*z).encodedMsigs.BitmaskSubsigs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000000000 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000000000 - } - if len((*z).encodedTxns.TxType) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000000000 - } - if len((*z).encodedTxns.BitmaskTxType) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000000000 - } - if (*z).encodedTxns.TxTypeOffset == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x1 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x2 - } - if len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x4 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x8 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x10 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x20 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x40 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.VotePK) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x80 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.VoteLast) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x100 - } - if len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x200 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x400 - } - if len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x800 - } - // variable map header, size zb0049Len - o = msgp.AppendMapHeader(o, zb0049Len) - if zb0049Len != 0 { - if (zb0049Mask[0] & 0x4000) == 0 { // if not empty - // string "aamt" - o = append(o, 0xa4, 0x61, 0x61, 0x6d, 0x74) - if (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount))) - } - for zb0021 := range (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021]) - } - } - if (zb0049Mask[0] & 0x8000) == 0 { // if not empty - // string "aamtbm" - o = append(o, 0xa6, 0x61, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - } - if (zb0049Mask[0] & 0x10000) == 0 { // if not empty - // string "aclose" - o = append(o, 0xa6, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - } - if (zb0049Mask[0] & 0x20000) == 0 { // if not empty - // string "aclosebm" - o = append(o, 0xa8, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - } - if (zb0049Mask[0] & 0x40000) == 0 { // if not empty - // string "afrzbm" - o = append(o, 0xa6, 0x61, 0x66, 0x72, 0x7a, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - } - if (zb0049Mask[0] & 0x80000) == 0 { // if not empty - // string "am" - o = append(o, 0xa2, 0x61, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - } - if (zb0049Mask[0] & 0x100000) == 0 { // if not empty - // string "ambm" - o = append(o, 0xa4, 0x61, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - } - if (zb0049Mask[0] & 0x200000) == 0 { // if not empty - // string "amt" - o = append(o, 0xa3, 0x61, 0x6d, 0x74) - if (*z).encodedTxns.encodedPaymentTxnFields.Amount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedPaymentTxnFields.Amount))) - } - for zb0013 := range (*z).encodedTxns.encodedPaymentTxnFields.Amount { - o = (*z).encodedTxns.encodedPaymentTxnFields.Amount[zb0013].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x400000) == 0 { // if not empty - // string "amtbm" - o = append(o, 0xa5, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - } - if (zb0049Mask[0] & 0x800000) == 0 { // if not empty - // string "an" - o = append(o, 0xa2, 0x61, 0x6e) - if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName))) - } - for zb0018 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - o = msgp.AppendString(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018]) - } - } - if (zb0049Mask[0] & 0x1000000) == 0 { // if not empty - // string "anbm" - o = append(o, 0xa4, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - } - if (zb0049Mask[0] & 0x2000000) == 0 { // if not empty - // string "apaa" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x61) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs))) - } - for zb0024 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]))) - } - for zb0025 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - } - } - } - if (zb0049Mask[0] & 0x4000000) == 0 { // if not empty - // string "apaabm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - } - if (zb0049Mask[0] & 0x8000000) == 0 { // if not empty - // string "apan" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x6e) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - } - if (zb0049Mask[0] & 0x10000000) == 0 { // if not empty - // string "apanbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - } - if (zb0049Mask[0] & 0x20000000) == 0 { // if not empty - // string "apap" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x70) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram))) - } - for zb0036 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - } - } - if (zb0049Mask[0] & 0x40000000) == 0 { // if not empty - // string "apapbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - } - if (zb0049Mask[0] & 0x80000000) == 0 { // if not empty - // string "apas" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x73) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets))) - } - for zb0030 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]))) - } - for zb0031 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - o = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x100000000) == 0 { // if not empty - // string "apasbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - } - if (zb0049Mask[0] & 0x200000000) == 0 { // if not empty - // string "apat" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x74) - if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts))) - } - for zb0026 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts { - if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]))) - } - for zb0027 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - o = (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x400000000) == 0 { // if not empty - // string "apatbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - } - if (zb0049Mask[0] & 0x800000000) == 0 { // if not empty - // string "apep" - o = append(o, 0xa4, 0x61, 0x70, 0x65, 0x70) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages))) - } - for zb0038 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - o = msgp.AppendUint32(o, (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038]) - } - } - if (zb0049Mask[0] & 0x1000000000) == 0 { // if not empty - // string "apepbm" - o = append(o, 0xa6, 0x61, 0x70, 0x65, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - } - if (zb0049Mask[0] & 0x2000000000) == 0 { // if not empty - // string "apfa" - o = append(o, 0xa4, 0x61, 0x70, 0x66, 0x61) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps))) - } - for zb0028 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]))) - } - for zb0029 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - o = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x4000000000) == 0 { // if not empty - // string "apfabm" - o = append(o, 0xa6, 0x61, 0x70, 0x66, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - } - if (zb0049Mask[0] & 0x8000000000) == 0 { // if not empty - // string "apid" - o = append(o, 0xa4, 0x61, 0x70, 0x69, 0x64) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID))) - } - for zb0023 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - o = (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x10000000000) == 0 { // if not empty - // string "apidbm" - o = append(o, 0xa6, 0x61, 0x70, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - } - if (zb0049Mask[0] & 0x20000000000) == 0 { // if not empty - // string "apsu" - o = append(o, 0xa4, 0x61, 0x70, 0x73, 0x75) - if (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram))) - } - for zb0037 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - } - } - if (zb0049Mask[0] & 0x40000000000) == 0 { // if not empty - // string "apsubm" - o = append(o, 0xa6, 0x61, 0x70, 0x73, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - } - if (zb0049Mask[0] & 0x80000000000) == 0 { // if not empty - // string "arcv" - o = append(o, 0xa4, 0x61, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - } - if (zb0049Mask[0] & 0x100000000000) == 0 { // if not empty - // string "arcvbm" - o = append(o, 0xa6, 0x61, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - } - if (zb0049Mask[0] & 0x200000000000) == 0 { // if not empty - // string "asnd" - o = append(o, 0xa4, 0x61, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) - } - if (zb0049Mask[0] & 0x400000000000) == 0 { // if not empty - // string "asndbm" - o = append(o, 0xa6, 0x61, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - } - if (zb0049Mask[0] & 0x800000000000) == 0 { // if not empty - // string "au" - o = append(o, 0xa2, 0x61, 0x75) - if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL))) - } - for zb0019 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - o = msgp.AppendString(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019]) - } - } - if (zb0049Mask[0] & 0x1000000000000) == 0 { // if not empty - // string "aubm" - o = append(o, 0xa4, 0x61, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - } - if (zb0049Mask[0] & 0x2000000000000) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - } - if (zb0049Mask[0] & 0x4000000000000) == 0 { // if not empty - // string "caid" - o = append(o, 0xa4, 0x63, 0x61, 0x69, 0x64) - if (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset))) - } - for zb0014 := range (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - o = (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x8000000000000) == 0 { // if not empty - // string "caidbm" - o = append(o, 0xa6, 0x63, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - } - if (zb0049Mask[0] & 0x10000000000000) == 0 { // if not empty - // string "cbm" - o = append(o, 0xa3, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - } - if (zb0049Mask[0] & 0x20000000000000) == 0 { // if not empty - // string "certP" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x50) - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs))) - } - for zb0044 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]))) - } - for zb0045 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - o = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x40000000000000) == 0 { // if not empty - // string "certPbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x50, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - } - if (zb0049Mask[0] & 0x80000000000000) == 0 { // if not empty - // string "certS" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x53) - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs))) - } - for zb0042 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]))) - } - for zb0043 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - o = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x100000000000000) == 0 { // if not empty - // string "certSbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x53, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - } - if (zb0049Mask[0] & 0x200000000000000) == 0 { // if not empty - // string "certc" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x63) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - } - if (zb0049Mask[0] & 0x400000000000000) == 0 { // if not empty - // string "certcbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - } - if (zb0049Mask[0] & 0x800000000000000) == 0 { // if not empty - // string "certr" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x72) - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals))) - } - for zb0046 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046]))) - } - zb0047_keys := make([]uint64, 0, len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046])) - for zb0047 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] { - zb0047_keys = append(zb0047_keys, zb0047) - } - sort.Sort(SortUint64(zb0047_keys)) - for _, zb0047 := range zb0047_keys { - zb0048 := (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] - _ = zb0048 - o = msgp.AppendUint64(o, zb0047) - o = zb0048.MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x1000000000000000) == 0 { // if not empty - // string "certrbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - } - if (zb0049Mask[0] & 0x2000000000000000) == 0 { // if not empty - // string "certrnd" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64) - if (*z).encodedTxns.encodedCompactCertTxnFields.CertRound == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.CertRound))) - } - for zb0039 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertRound { - o = (*z).encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x4000000000000000) == 0 { // if not empty - // string "certrndbm" - o = append(o, 0xa9, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - } - if (zb0049Mask[0] & 0x8000000000000000) == 0 { // if not empty - // string "certtype" - o = append(o, 0xa8, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65) - if (*z).encodedTxns.encodedCompactCertTxnFields.CertType == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.CertType))) - } - for zb0040 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertType { - o = (*z).encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x1) == 0 { // if not empty - // string "certtypebm" - o = append(o, 0xaa, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - } - if (zb0049Mask[1] & 0x2) == 0 { // if not empty - // string "certw" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x77) - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight))) - } - for zb0041 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041]) - } - } - if (zb0049Mask[1] & 0x4) == 0 { // if not empty - // string "certwbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x77, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - } - if (zb0049Mask[1] & 0x8) == 0 { // if not empty - // string "close" - o = append(o, 0xa5, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - } - if (zb0049Mask[1] & 0x10) == 0 { // if not empty - // string "closebm" - o = append(o, 0xa7, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - } - if (zb0049Mask[1] & 0x20) == 0 { // if not empty - // string "dc" - o = append(o, 0xa2, 0x64, 0x63) - if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals))) - } - for zb0016 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - o = msgp.AppendUint32(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016]) - } - } - if (zb0049Mask[1] & 0x40) == 0 { // if not empty - // string "dcbm" - o = append(o, 0xa4, 0x64, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - } - if (zb0049Mask[1] & 0x80) == 0 { // if not empty - // string "dfbm" - o = append(o, 0xa4, 0x64, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - } - if (zb0049Mask[1] & 0x100) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - } - if (zb0049Mask[1] & 0x200) == 0 { // if not empty - // string "fadd" - o = append(o, 0xa4, 0x66, 0x61, 0x64, 0x64) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - } - if (zb0049Mask[1] & 0x400) == 0 { // if not empty - // string "faddbm" - o = append(o, 0xa6, 0x66, 0x61, 0x64, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - } - if (zb0049Mask[1] & 0x800) == 0 { // if not empty - // string "faid" - o = append(o, 0xa4, 0x66, 0x61, 0x69, 0x64) - if (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset))) - } - for zb0022 := range (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - o = (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x1000) == 0 { // if not empty - // string "faidbm" - o = append(o, 0xa6, 0x66, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - } - if (zb0049Mask[1] & 0x2000) == 0 { // if not empty - // string "fbm" - o = append(o, 0xa3, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - } - if (zb0049Mask[1] & 0x4000) == 0 { // if not empty - // string "fee" - o = append(o, 0xa3, 0x66, 0x65, 0x65) - if (*z).encodedTxns.encodedTxnHeaders.Fee == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedTxnHeaders.Fee))) - } - for zb0006 := range (*z).encodedTxns.encodedTxnHeaders.Fee { - o = (*z).encodedTxns.encodedTxnHeaders.Fee[zb0006].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x8000) == 0 { // if not empty - // string "feebm" - o = append(o, 0xa5, 0x66, 0x65, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFee)) - } - if (zb0049Mask[1] & 0x10000) == 0 { // if not empty - // string "fv" - o = append(o, 0xa2, 0x66, 0x76) - if (*z).encodedTxns.encodedTxnHeaders.FirstValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedTxnHeaders.FirstValid))) - } - for zb0007 := range (*z).encodedTxns.encodedTxnHeaders.FirstValid { - o = (*z).encodedTxns.encodedTxnHeaders.FirstValid[zb0007].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x20000) == 0 { // if not empty - // string "fvbm" - o = append(o, 0xa4, 0x66, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - } - if (zb0049Mask[1] & 0x40000) == 0 { // if not empty - // string "genbm" - o = append(o, 0xa5, 0x67, 0x65, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - } - if (zb0049Mask[1] & 0x80000) == 0 { // if not empty - // string "gnbs" - o = append(o, 0xa4, 0x67, 0x6e, 0x62, 0x73) - if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice))) - } - for zb0035 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035]) - } - } - if (zb0049Mask[1] & 0x100000) == 0 { // if not empty - // string "gnbsbm" - o = append(o, 0xa6, 0x67, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - } - if (zb0049Mask[1] & 0x200000) == 0 { // if not empty - // string "gnui" - o = append(o, 0xa4, 0x67, 0x6e, 0x75, 0x69) - if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint))) - } - for zb0034 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034]) - } - } - if (zb0049Mask[1] & 0x400000) == 0 { // if not empty - // string "gnuibm" - o = append(o, 0xa6, 0x67, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - } - if (zb0049Mask[1] & 0x800000) == 0 { // if not empty - // string "grpbm" - o = append(o, 0xa5, 0x67, 0x72, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup)) - } - if (zb0049Mask[1] & 0x1000000) == 0 { // if not empty - // string "lnbs" - o = append(o, 0xa4, 0x6c, 0x6e, 0x62, 0x73) - if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice))) - } - for zb0033 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033]) - } - } - if (zb0049Mask[1] & 0x2000000) == 0 { // if not empty - // string "lnbsbm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - } - if (zb0049Mask[1] & 0x4000000) == 0 { // if not empty - // string "lnui" - o = append(o, 0xa4, 0x6c, 0x6e, 0x75, 0x69) - if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint))) - } - for zb0032 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032]) - } - } - if (zb0049Mask[1] & 0x8000000) == 0 { // if not empty - // string "lnuibm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - } - if (zb0049Mask[1] & 0x10000000) == 0 { // if not empty - // string "lsigarg" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67) - if (*z).encodedLsigs.LogicArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedLsigs.LogicArgs))) - } - for zb0004 := range (*z).encodedLsigs.LogicArgs { - if (*z).encodedLsigs.LogicArgs[zb0004] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedLsigs.LogicArgs[zb0004]))) - } - for zb0005 := range (*z).encodedLsigs.LogicArgs[zb0004] { - o = msgp.AppendBytes(o, (*z).encodedLsigs.LogicArgs[zb0004][zb0005]) - } - } - } - if (zb0049Mask[1] & 0x20000000) == 0 { // if not empty - // string "lsigargbm" - o = append(o, 0xa9, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedLsigs.BitmaskLogicArgs)) - } - if (zb0049Mask[1] & 0x40000000) == 0 { // if not empty - // string "lsigl" - o = append(o, 0xa5, 0x6c, 0x73, 0x69, 0x67, 0x6c) - if (*z).encodedLsigs.Logic == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedLsigs.Logic))) - } - for zb0003 := range (*z).encodedLsigs.Logic { - o = msgp.AppendBytes(o, (*z).encodedLsigs.Logic[zb0003]) - } - } - if (zb0049Mask[1] & 0x80000000) == 0 { // if not empty - // string "lsiglbm" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x6c, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedLsigs.BitmaskLogic)) - } - if (zb0049Mask[1] & 0x100000000) == 0 { // if not empty - // string "lv" - o = append(o, 0xa2, 0x6c, 0x76) - if (*z).encodedTxns.encodedTxnHeaders.LastValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedTxnHeaders.LastValid))) - } - for zb0008 := range (*z).encodedTxns.encodedTxnHeaders.LastValid { - o = (*z).encodedTxns.encodedTxnHeaders.LastValid[zb0008].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x200000000) == 0 { // if not empty - // string "lvbm" - o = append(o, 0xa4, 0x6c, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - } - if (zb0049Mask[1] & 0x400000000) == 0 { // if not empty - // string "lx" - o = append(o, 0xa2, 0x6c, 0x78) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedTxnHeaders.Lease) - } - if (zb0049Mask[1] & 0x800000000) == 0 { // if not empty - // string "lxbm" - o = append(o, 0xa4, 0x6c, 0x78, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLease)) - } - if (zb0049Mask[1] & 0x1000000000) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - } - if (zb0049Mask[1] & 0x2000000000) == 0 { // if not empty - // string "mbm" - o = append(o, 0xa3, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - } - if (zb0049Mask[1] & 0x4000000000) == 0 { // if not empty - // string "msigthr" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72) - o = msgp.AppendBytes(o, (*z).encodedMsigs.Threshold) - } - if (zb0049Mask[1] & 0x8000000000) == 0 { // if not empty - // string "msigthrbm" - o = append(o, 0xa9, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedMsigs.BitmaskThreshold)) - } - if (zb0049Mask[1] & 0x10000000000) == 0 { // if not empty - // string "msigv" - o = append(o, 0xa5, 0x6d, 0x73, 0x69, 0x67, 0x76) - o = msgp.AppendBytes(o, (*z).encodedMsigs.Version) - } - if (zb0049Mask[1] & 0x20000000000) == 0 { // if not empty - // string "msigvbm" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedMsigs.BitmaskVersion)) - } - if (zb0049Mask[1] & 0x40000000000) == 0 { // if not empty - // string "nonpartbm" - o = append(o, 0xa9, 0x6e, 0x6f, 0x6e, 0x70, 0x61, 0x72, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - } - if (zb0049Mask[1] & 0x80000000000) == 0 { // if not empty - // string "note" - o = append(o, 0xa4, 0x6e, 0x6f, 0x74, 0x65) - if (*z).encodedTxns.encodedTxnHeaders.Note == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedTxnHeaders.Note))) - } - for zb0009 := range (*z).encodedTxns.encodedTxnHeaders.Note { - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedTxnHeaders.Note[zb0009]) - } - } - if (zb0049Mask[1] & 0x100000000000) == 0 { // if not empty - // string "notebm" - o = append(o, 0xa6, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskNote)) - } - if (zb0049Mask[1] & 0x200000000000) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - } - if (zb0049Mask[1] & 0x400000000000) == 0 { // if not empty - // string "rbm" - o = append(o, 0xa3, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - } - if (zb0049Mask[1] & 0x800000000000) == 0 { // if not empty - // string "rcv" - o = append(o, 0xa3, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedPaymentTxnFields.Receiver) - } - if (zb0049Mask[1] & 0x1000000000000) == 0 { // if not empty - // string "rcvbm" - o = append(o, 0xa5, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - } - if (zb0049Mask[1] & 0x2000000000000) == 0 { // if not empty - // string "rekey" - o = append(o, 0xa5, 0x72, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedTxnHeaders.RekeyTo) - } - if (zb0049Mask[1] & 0x4000000000000) == 0 { // if not empty - // string "rekeybm" - o = append(o, 0xa7, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - } - if (zb0049Mask[1] & 0x8000000000000) == 0 { // if not empty - // string "selkey" - o = append(o, 0xa6, 0x73, 0x65, 0x6c, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) - } - if (zb0049Mask[1] & 0x10000000000000) == 0 { // if not empty - // string "sgnr" - o = append(o, 0xa4, 0x73, 0x67, 0x6e, 0x72) - o = msgp.AppendBytes(o, (*z).AuthAddr) - } - if (zb0049Mask[1] & 0x20000000000000) == 0 { // if not empty - // string "sgnrbm" - o = append(o, 0xa6, 0x73, 0x67, 0x6e, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskAuthAddr)) - } - if (zb0049Mask[1] & 0x40000000000000) == 0 { // if not empty - // string "sig" - o = append(o, 0xa3, 0x73, 0x69, 0x67) - o = msgp.AppendBytes(o, (*z).Sig) - } - if (zb0049Mask[1] & 0x80000000000000) == 0 { // if not empty - // string "sigbm" - o = append(o, 0xa5, 0x73, 0x69, 0x67, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSig)) - } - if (zb0049Mask[1] & 0x100000000000000) == 0 { // if not empty - // string "snd" - o = append(o, 0xa3, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedTxnHeaders.Sender) - } - if (zb0049Mask[1] & 0x200000000000000) == 0 { // if not empty - // string "sndbm" - o = append(o, 0xa5, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskSender)) - } - if (zb0049Mask[1] & 0x400000000000000) == 0 { // if not empty - // string "subsig" - o = append(o, 0xa6, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67) - if (*z).encodedMsigs.Subsigs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedMsigs.Subsigs))) - } - for zb0001 := range (*z).encodedMsigs.Subsigs { - if (*z).encodedMsigs.Subsigs[zb0001] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedMsigs.Subsigs[zb0001]))) - } - for zb0002 := range (*z).encodedMsigs.Subsigs[zb0001] { - o = (*z).encodedMsigs.Subsigs[zb0001][zb0002].MarshalMsg(o) - } - } - } - if (zb0049Mask[1] & 0x800000000000000) == 0 { // if not empty - // string "subsigsbm" - o = append(o, 0xa9, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedMsigs.BitmaskSubsigs)) - } - if (zb0049Mask[1] & 0x1000000000000000) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total))) - } - for zb0015 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015]) - } - } - if (zb0049Mask[1] & 0x2000000000000000) == 0 { // if not empty - // string "tbm" - o = append(o, 0xa3, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - } - if (zb0049Mask[1] & 0x4000000000000000) == 0 { // if not empty - // string "type" - o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) - o = msgp.AppendBytes(o, (*z).encodedTxns.TxType) - } - if (zb0049Mask[1] & 0x8000000000000000) == 0 { // if not empty - // string "typebm" - o = append(o, 0xa6, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.BitmaskTxType)) - } - if (zb0049Mask[2] & 0x1) == 0 { // if not empty - // string "typeo" - o = append(o, 0xa5, 0x74, 0x79, 0x70, 0x65, 0x6f) - o = msgp.AppendByte(o, (*z).encodedTxns.TxTypeOffset) - } - if (zb0049Mask[2] & 0x2) == 0 { // if not empty - // string "un" - o = append(o, 0xa2, 0x75, 0x6e) - if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName))) - } - for zb0017 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - o = msgp.AppendString(o, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017]) - } - } - if (zb0049Mask[2] & 0x4) == 0 { // if not empty - // string "unbm" - o = append(o, 0xa4, 0x75, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - } - if (zb0049Mask[2] & 0x8) == 0 { // if not empty - // string "votefst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) - if (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst))) - } - for zb0010 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst { - o = (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x10) == 0 { // if not empty - // string "votefstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - } - if (zb0049Mask[2] & 0x20) == 0 { // if not empty - // string "votekbm" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - } - if (zb0049Mask[2] & 0x40) == 0 { // if not empty - // string "votekd" - o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) - if (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution))) - } - for zb0012 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - o = msgp.AppendUint64(o, (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012]) - } - } - if (zb0049Mask[2] & 0x80) == 0 { // if not empty - // string "votekey" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedTxns.encodedKeyregTxnFields.VotePK) - } - if (zb0049Mask[2] & 0x100) == 0 { // if not empty - // string "votelst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) - if (*z).encodedTxns.encodedKeyregTxnFields.VoteLast == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedKeyregTxnFields.VoteLast))) - } - for zb0011 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteLast { - o = (*z).encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x200) == 0 { // if not empty - // string "votelstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - } - if (zb0049Mask[2] & 0x400) == 0 { // if not empty - // string "xaid" - o = append(o, 0xa4, 0x78, 0x61, 0x69, 0x64) - if (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset))) - } - for zb0020 := range (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset { - o = (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x800) == 0 { // if not empty - // string "xaidbm" - o = append(o, 0xa6, 0x78, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - } - } - return -} - -func (_ *encodedSignedTxns) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedSignedTxns) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedSignedTxns) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0049 int - var zb0050 bool - zb0049, zb0050, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0049, zb0050, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0049 > 0 { - zb0049-- - var zb0051 int - zb0051, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sig") - return - } - if zb0051 > maxSignatureBytes { - err = msgp.ErrOverflow(uint64(zb0051), uint64(maxSignatureBytes)) - return - } - (*z).Sig, bts, err = msgp.ReadBytesBytes(bts, (*z).Sig) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sig") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0052 []byte - var zb0053 int - zb0053, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSig") - return - } - if zb0053 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0053), uint64(maxBitmaskSize)) - return - } - zb0052, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSig)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSig") - return - } - (*z).BitmaskSig = bitmask(zb0052) - } - } - if zb0049 > 0 { - zb0049-- - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - if zb0054 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedMsigs.Version, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedMsigs.Version) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0055 []byte - var zb0056 int - zb0056, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - if zb0056 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0056), uint64(maxBitmaskSize)) - return - } - zb0055, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - (*z).encodedMsigs.BitmaskVersion = bitmask(zb0055) - } - } - if zb0049 > 0 { - zb0049-- - var zb0057 int - zb0057, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - if zb0057 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0057), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedMsigs.Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedMsigs.Threshold) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0058 []byte - var zb0059 int - zb0059, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - if zb0059 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0059), uint64(maxBitmaskSize)) - return - } - zb0058, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - (*z).encodedMsigs.BitmaskThreshold = bitmask(zb0058) - } - } - if zb0049 > 0 { - zb0049-- - var zb0060 int - var zb0061 bool - zb0060, zb0061, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0060 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0061 { - (*z).encodedMsigs.Subsigs = nil - } else if (*z).encodedMsigs.Subsigs != nil && cap((*z).encodedMsigs.Subsigs) >= zb0060 { - (*z).encodedMsigs.Subsigs = ((*z).encodedMsigs.Subsigs)[:zb0060] - } else { - (*z).encodedMsigs.Subsigs = make([][]crypto.MultisigSubsig, zb0060) - } - for zb0001 := range (*z).encodedMsigs.Subsigs { - var zb0062 int - var zb0063 bool - zb0062, zb0063, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0062 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0062), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0063 { - (*z).encodedMsigs.Subsigs[zb0001] = nil - } else if (*z).encodedMsigs.Subsigs[zb0001] != nil && cap((*z).encodedMsigs.Subsigs[zb0001]) >= zb0062 { - (*z).encodedMsigs.Subsigs[zb0001] = ((*z).encodedMsigs.Subsigs[zb0001])[:zb0062] - } else { - (*z).encodedMsigs.Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0062) - } - for zb0002 := range (*z).encodedMsigs.Subsigs[zb0001] { - bts, err = (*z).encodedMsigs.Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001, zb0002) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0064 []byte - var zb0065 int - zb0065, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - if zb0065 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0065), uint64(maxBitmaskSize)) - return - } - zb0064, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - (*z).encodedMsigs.BitmaskSubsigs = bitmask(zb0064) - } - } - if zb0049 > 0 { - zb0049-- - var zb0066 int - var zb0067 bool - zb0066, zb0067, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0066 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0067 { - (*z).encodedLsigs.Logic = nil - } else if (*z).encodedLsigs.Logic != nil && cap((*z).encodedLsigs.Logic) >= zb0066 { - (*z).encodedLsigs.Logic = ((*z).encodedLsigs.Logic)[:zb0066] - } else { - (*z).encodedLsigs.Logic = make([][]byte, zb0066) - } - for zb0003 := range (*z).encodedLsigs.Logic { - var zb0068 int - zb0068, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0003) - return - } - if zb0068 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0068), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedLsigs.Logic[zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedLsigs.Logic[zb0003]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0003) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0069 []byte - var zb0070 int - zb0070, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - if zb0070 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0070), uint64(maxBitmaskSize)) - return - } - zb0069, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedLsigs.BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - (*z).encodedLsigs.BitmaskLogic = bitmask(zb0069) - } - } - if zb0049 > 0 { - zb0049-- - var zb0071 int - var zb0072 bool - zb0071, zb0072, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0071 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0071), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0072 { - (*z).encodedLsigs.LogicArgs = nil - } else if (*z).encodedLsigs.LogicArgs != nil && cap((*z).encodedLsigs.LogicArgs) >= zb0071 { - (*z).encodedLsigs.LogicArgs = ((*z).encodedLsigs.LogicArgs)[:zb0071] - } else { - (*z).encodedLsigs.LogicArgs = make([][][]byte, zb0071) - } - for zb0004 := range (*z).encodedLsigs.LogicArgs { - var zb0073 int - var zb0074 bool - zb0073, zb0074, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004) - return - } - if zb0073 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0073), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004) - return - } - if zb0074 { - (*z).encodedLsigs.LogicArgs[zb0004] = nil - } else if (*z).encodedLsigs.LogicArgs[zb0004] != nil && cap((*z).encodedLsigs.LogicArgs[zb0004]) >= zb0073 { - (*z).encodedLsigs.LogicArgs[zb0004] = ((*z).encodedLsigs.LogicArgs[zb0004])[:zb0073] - } else { - (*z).encodedLsigs.LogicArgs[zb0004] = make([][]byte, zb0073) - } - for zb0005 := range (*z).encodedLsigs.LogicArgs[zb0004] { - var zb0075 int - zb0075, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004, zb0005) - return - } - if zb0075 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0075), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedLsigs.LogicArgs[zb0004][zb0005], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedLsigs.LogicArgs[zb0004][zb0005]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004, zb0005) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0076 []byte - var zb0077 int - zb0077, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - if zb0077 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0077), uint64(maxBitmaskSize)) - return - } - zb0076, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedLsigs.BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - (*z).encodedLsigs.BitmaskLogicArgs = bitmask(zb0076) - } - } - if zb0049 > 0 { - zb0049-- - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AuthAddr") - return - } - if zb0078 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxAddressBytes)) - return - } - (*z).AuthAddr, bts, err = msgp.ReadBytesBytes(bts, (*z).AuthAddr) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AuthAddr") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0079 []byte - var zb0080 int - zb0080, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAuthAddr") - return - } - if zb0080 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0080), uint64(maxBitmaskSize)) - return - } - zb0079, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAuthAddr)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAuthAddr") - return - } - (*z).BitmaskAuthAddr = bitmask(zb0079) - } - } - if zb0049 > 0 { - zb0049-- - var zb0081 int - zb0081, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - if zb0081 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedTxns.TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.TxType) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0082 []byte - var zb0083 int - zb0083, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - if zb0083 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0083), uint64(maxBitmaskSize)) - return - } - zb0082, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - (*z).encodedTxns.BitmaskTxType = bitmask(zb0082) - } - } - if zb0049 > 0 { - zb0049-- - (*z).encodedTxns.TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxTypeOffset") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0084 int - zb0084, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - if zb0084 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0084), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0085 []byte - var zb0086 int - zb0086, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - if zb0086 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0086), uint64(maxBitmaskSize)) - return - } - zb0085, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskSender = bitmask(zb0085) - } - } - if zb0049 > 0 { - zb0049-- - var zb0087 int - var zb0088 bool - zb0087, zb0088, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0087 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0087), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0088 { - (*z).encodedTxns.encodedTxnHeaders.Fee = nil - } else if (*z).encodedTxns.encodedTxnHeaders.Fee != nil && cap((*z).encodedTxns.encodedTxnHeaders.Fee) >= zb0087 { - (*z).encodedTxns.encodedTxnHeaders.Fee = ((*z).encodedTxns.encodedTxnHeaders.Fee)[:zb0087] - } else { - (*z).encodedTxns.encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0087) - } - for zb0006 := range (*z).encodedTxns.encodedTxnHeaders.Fee { - bts, err = (*z).encodedTxns.encodedTxnHeaders.Fee[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee", zb0006) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0089 []byte - var zb0090 int - zb0090, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - if zb0090 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0090), uint64(maxBitmaskSize)) - return - } - zb0089, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskFee = bitmask(zb0089) - } - } - if zb0049 > 0 { - zb0049-- - var zb0091 int - var zb0092 bool - zb0091, zb0092, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0091 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0091), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0092 { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedTxns.encodedTxnHeaders.FirstValid != nil && cap((*z).encodedTxns.encodedTxnHeaders.FirstValid) >= zb0091 { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = ((*z).encodedTxns.encodedTxnHeaders.FirstValid)[:zb0091] - } else { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = make([]basics.Round, zb0091) - } - for zb0007 := range (*z).encodedTxns.encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedTxns.encodedTxnHeaders.FirstValid[zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid", zb0007) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0093 []byte - var zb0094 int - zb0094, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - if zb0094 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0094), uint64(maxBitmaskSize)) - return - } - zb0093, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0093) - } - } - if zb0049 > 0 { - zb0049-- - var zb0095 int - var zb0096 bool - zb0095, zb0096, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0095 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0095), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0096 { - (*z).encodedTxns.encodedTxnHeaders.LastValid = nil - } else if (*z).encodedTxns.encodedTxnHeaders.LastValid != nil && cap((*z).encodedTxns.encodedTxnHeaders.LastValid) >= zb0095 { - (*z).encodedTxns.encodedTxnHeaders.LastValid = ((*z).encodedTxns.encodedTxnHeaders.LastValid)[:zb0095] - } else { - (*z).encodedTxns.encodedTxnHeaders.LastValid = make([]basics.Round, zb0095) - } - for zb0008 := range (*z).encodedTxns.encodedTxnHeaders.LastValid { - bts, err = (*z).encodedTxns.encodedTxnHeaders.LastValid[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid", zb0008) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0097 []byte - var zb0098 int - zb0098, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - if zb0098 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0098), uint64(maxBitmaskSize)) - return - } - zb0097, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid = bitmask(zb0097) - } - } - if zb0049 > 0 { - zb0049-- - var zb0099 int - var zb0100 bool - zb0099, zb0100, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0099 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0099), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0100 { - (*z).encodedTxns.encodedTxnHeaders.Note = nil - } else if (*z).encodedTxns.encodedTxnHeaders.Note != nil && cap((*z).encodedTxns.encodedTxnHeaders.Note) >= zb0099 { - (*z).encodedTxns.encodedTxnHeaders.Note = ((*z).encodedTxns.encodedTxnHeaders.Note)[:zb0099] - } else { - (*z).encodedTxns.encodedTxnHeaders.Note = make([][]byte, zb0099) - } - for zb0009 := range (*z).encodedTxns.encodedTxnHeaders.Note { - var zb0101 int - zb0101, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0009) - return - } - if zb0101 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0101), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Note[zb0009], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Note[zb0009]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0009) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0102 []byte - var zb0103 int - zb0103, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - if zb0103 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0103), uint64(maxBitmaskSize)) - return - } - zb0102, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskNote = bitmask(zb0102) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0104 []byte - var zb0105 int - zb0105, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - if zb0105 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0105), uint64(maxBitmaskSize)) - return - } - zb0104, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0104) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0106 []byte - var zb0107 int - zb0107, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - if zb0107 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0107), uint64(maxBitmaskSize)) - return - } - zb0106, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskGroup = bitmask(zb0106) - } - } - if zb0049 > 0 { - zb0049-- - var zb0108 int - zb0108, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - if zb0108 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0108), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0109 []byte - var zb0110 int - zb0110, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - if zb0110 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0110), uint64(maxBitmaskSize)) - return - } - zb0109, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskLease = bitmask(zb0109) - } - } - if zb0049 > 0 { - zb0049-- - var zb0111 int - zb0111, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - if zb0111 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0111), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0112 []byte - var zb0113 int - zb0113, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - if zb0113 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0113), uint64(maxBitmaskSize)) - return - } - zb0112, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0112) - } - } - if zb0049 > 0 { - zb0049-- - var zb0114 int - zb0114, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - if zb0114 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0114), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0115 int - zb0115, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - if zb0115 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0115), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0116 int - var zb0117 bool - zb0116, zb0117, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0116 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0116), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0117 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst) >= zb0116 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = ((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst)[:zb0116] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0116) - } - for zb0010 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst", zb0010) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0118 []byte - var zb0119 int - zb0119, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - if zb0119 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0119), uint64(maxBitmaskSize)) - return - } - zb0118, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0118) - } - } - if zb0049 > 0 { - zb0049-- - var zb0120 int - var zb0121 bool - zb0120, zb0121, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0120 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0120), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0121 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteLast) >= zb0120 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = ((*z).encodedTxns.encodedKeyregTxnFields.VoteLast)[:zb0120] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0120) - } - for zb0011 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast", zb0011) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0122 []byte - var zb0123 int - zb0123, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - if zb0123 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0123), uint64(maxBitmaskSize)) - return - } - zb0122, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0122) - } - } - if zb0049 > 0 { - zb0049-- - var zb0124 int - var zb0125 bool - zb0124, zb0125, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0124 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0124), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0125 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) >= zb0124 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution)[:zb0124] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0124) - } - for zb0012 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution", zb0012) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0126 []byte - var zb0127 int - zb0127, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - if zb0127 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0127), uint64(maxBitmaskSize)) - return - } - zb0126, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0126) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0128 []byte - var zb0129 int - zb0129, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - if zb0129 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0129), uint64(maxBitmaskSize)) - return - } - zb0128, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0128) - } - } - if zb0049 > 0 { - zb0049-- - var zb0130 int - zb0130, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - if zb0130 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0130), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0131 []byte - var zb0132 int - zb0132, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - if zb0132 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0132), uint64(maxBitmaskSize)) - return - } - zb0131, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0131) - } - } - if zb0049 > 0 { - zb0049-- - var zb0133 int - var zb0134 bool - zb0133, zb0134, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0133 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0133), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0134 { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedTxns.encodedPaymentTxnFields.Amount != nil && cap((*z).encodedTxns.encodedPaymentTxnFields.Amount) >= zb0133 { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = ((*z).encodedTxns.encodedPaymentTxnFields.Amount)[:zb0133] - } else { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0133) - } - for zb0013 := range (*z).encodedTxns.encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedTxns.encodedPaymentTxnFields.Amount[zb0013].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount", zb0013) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0135 []byte - var zb0136 int - zb0136, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - if zb0136 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0136), uint64(maxBitmaskSize)) - return - } - zb0135, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0135) - } - } - if zb0049 > 0 { - zb0049-- - var zb0137 int - zb0137, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - if zb0137 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0137), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0138 []byte - var zb0139 int - zb0139, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - if zb0139 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0139), uint64(maxBitmaskSize)) - return - } - zb0138, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0138) - } - } - if zb0049 > 0 { - zb0049-- - var zb0140 int - var zb0141 bool - zb0140, zb0141, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0140 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0140), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0141 { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) >= zb0140 { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset)[:zb0140] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0140) - } - for zb0014 := range (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset", zb0014) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0142 []byte - var zb0143 int - zb0143, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - if zb0143 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0143), uint64(maxBitmaskSize)) - return - } - zb0142, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0142) - } - } - if zb0049 > 0 { - zb0049-- - var zb0144 int - var zb0145 bool - zb0144, zb0145, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0144 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0144), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0145 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0144 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0144] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0144) - } - for zb0015 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total", zb0015) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0146 []byte - var zb0147 int - zb0147, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - if zb0147 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0147), uint64(maxBitmaskSize)) - return - } - zb0146, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0146) - } - } - if zb0049 > 0 { - zb0049-- - var zb0148 int - var zb0149 bool - zb0148, zb0149, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0148 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0148), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0149 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0148 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0148] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0148) - } - for zb0016 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals", zb0016) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0150 []byte - var zb0151 int - zb0151, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - if zb0151 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0151), uint64(maxBitmaskSize)) - return - } - zb0150, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0150) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0152 []byte - var zb0153 int - zb0153, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - if zb0153 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0153), uint64(maxBitmaskSize)) - return - } - zb0152, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0152) - } - } - if zb0049 > 0 { - zb0049-- - var zb0154 int - var zb0155 bool - zb0154, zb0155, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0154 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0154), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0155 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0154 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0154] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0154) - } - for zb0017 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName", zb0017) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0156 []byte - var zb0157 int - zb0157, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - if zb0157 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0157), uint64(maxBitmaskSize)) - return - } - zb0156, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0156) - } - } - if zb0049 > 0 { - zb0049-- - var zb0158 int - var zb0159 bool - zb0158, zb0159, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0158 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0158), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0159 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0158 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0158] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0158) - } - for zb0018 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName", zb0018) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0160 []byte - var zb0161 int - zb0161, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - if zb0161 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0161), uint64(maxBitmaskSize)) - return - } - zb0160, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0160) - } - } - if zb0049 > 0 { - zb0049-- - var zb0162 int - var zb0163 bool - zb0162, zb0163, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0162 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0162), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0163 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0162 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0162] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0162) - } - for zb0019 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL", zb0019) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0164 []byte - var zb0165 int - zb0165, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - if zb0165 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0165), uint64(maxBitmaskSize)) - return - } - zb0164, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0164) - } - } - if zb0049 > 0 { - zb0049-- - var zb0166 int - zb0166, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - if zb0166 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0166), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0167 []byte - var zb0168 int - zb0168, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - if zb0168 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0168), uint64(maxBitmaskSize)) - return - } - zb0167, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0167) - } - } - if zb0049 > 0 { - zb0049-- - var zb0169 int - zb0169, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - if zb0169 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0169), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0170 []byte - var zb0171 int - zb0171, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - if zb0171 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0171), uint64(maxBitmaskSize)) - return - } - zb0170, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0170) - } - } - if zb0049 > 0 { - zb0049-- - var zb0172 int - zb0172, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - if zb0172 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0172), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0173 []byte - var zb0174 int - zb0174, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - if zb0174 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0174), uint64(maxBitmaskSize)) - return - } - zb0173, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0173) - } - } - if zb0049 > 0 { - zb0049-- - var zb0175 int - zb0175, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - if zb0175 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0175), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0176 []byte - var zb0177 int - zb0177, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - if zb0177 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0177), uint64(maxBitmaskSize)) - return - } - zb0176, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0176) - } - } - if zb0049 > 0 { - zb0049-- - var zb0178 int - zb0178, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - if zb0178 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0178), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0179 []byte - var zb0180 int - zb0180, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - if zb0180 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0180), uint64(maxBitmaskSize)) - return - } - zb0179, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0179) - } - } - if zb0049 > 0 { - zb0049-- - var zb0181 int - var zb0182 bool - zb0181, zb0182, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0181 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0181), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0182 { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset) >= zb0181 { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = ((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset)[:zb0181] - } else { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0181) - } - for zb0020 := range (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset", zb0020) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0183 []byte - var zb0184 int - zb0184, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - if zb0184 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0184), uint64(maxBitmaskSize)) - return - } - zb0183, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0183) - } - } - if zb0049 > 0 { - zb0049-- - var zb0185 int - var zb0186 bool - zb0185, zb0186, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0185 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0185), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0186 { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount) >= zb0185 { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount)[:zb0185] - } else { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0185) - } - for zb0021 := range (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount", zb0021) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0187 []byte - var zb0188 int - zb0188, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - if zb0188 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0188), uint64(maxBitmaskSize)) - return - } - zb0187, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0187) - } - } - if zb0049 > 0 { - zb0049-- - var zb0189 int - zb0189, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - if zb0189 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0189), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0190 []byte - var zb0191 int - zb0191, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - if zb0191 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0191), uint64(maxBitmaskSize)) - return - } - zb0190, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0190) - } - } - if zb0049 > 0 { - zb0049-- - var zb0192 int - zb0192, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - if zb0192 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0192), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0193 []byte - var zb0194 int - zb0194, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - if zb0194 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0194), uint64(maxBitmaskSize)) - return - } - zb0193, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0193) - } - } - if zb0049 > 0 { - zb0049-- - var zb0195 int - zb0195, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - if zb0195 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0195), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0196 []byte - var zb0197 int - zb0197, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - if zb0197 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0197), uint64(maxBitmaskSize)) - return - } - zb0196, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0196) - } - } - if zb0049 > 0 { - zb0049-- - var zb0198 int - zb0198, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - if zb0198 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0198), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0199 []byte - var zb0200 int - zb0200, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - if zb0200 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0200), uint64(maxBitmaskSize)) - return - } - zb0199, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0199) - } - } - if zb0049 > 0 { - zb0049-- - var zb0201 int - var zb0202 bool - zb0201, zb0202, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0201 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0201), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0202 { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) >= zb0201 { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset)[:zb0201] - } else { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0201) - } - for zb0022 := range (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset", zb0022) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0203 []byte - var zb0204 int - zb0204, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - if zb0204 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0204), uint64(maxBitmaskSize)) - return - } - zb0203, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0203) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0205 []byte - var zb0206 int - zb0206, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - if zb0206 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0206), uint64(maxBitmaskSize)) - return - } - zb0205, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0205) - } - } - if zb0049 > 0 { - zb0049-- - var zb0207 int - var zb0208 bool - zb0207, zb0208, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0207 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0207), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0208 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID) >= zb0207 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID)[:zb0207] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0207) - } - for zb0023 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID", zb0023) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0209 []byte - var zb0210 int - zb0210, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - if zb0210 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0210), uint64(maxBitmaskSize)) - return - } - zb0209, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0209) - } - } - if zb0049 > 0 { - zb0049-- - var zb0211 int - zb0211, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - if zb0211 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0211), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0212 []byte - var zb0213 int - zb0213, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - if zb0213 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0213), uint64(maxBitmaskSize)) - return - } - zb0212, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0212) - } - } - if zb0049 > 0 { - zb0049-- - var zb0214 int - var zb0215 bool - zb0214, zb0215, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0214 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0214), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0215 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) >= zb0214 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs)[:zb0214] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0214) - } - for zb0024 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - var zb0216 int - var zb0217 bool - zb0216, zb0217, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024) - return - } - if zb0216 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0216), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024) - return - } - if zb0217 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]) >= zb0216 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024])[:zb0216] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = make(applicationArgs, zb0216) - } - for zb0025 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024, zb0025) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0218 []byte - var zb0219 int - zb0219, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - if zb0219 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0219), uint64(maxBitmaskSize)) - return - } - zb0218, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0218) - } - } - if zb0049 > 0 { - zb0049-- - var zb0220 int - var zb0221 bool - zb0220, zb0221, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0220 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0220), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0221 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts) >= zb0220 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = ((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts)[:zb0220] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0220) - } - for zb0026 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts { - var zb0222 int - var zb0223 bool - zb0222, zb0223, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026) - return - } - if zb0222 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0222), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026) - return - } - if zb0223 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]) >= zb0222 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = ((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026])[:zb0222] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = make(addresses, zb0222) - } - for zb0027 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026, zb0027) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0224 []byte - var zb0225 int - zb0225, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - if zb0225 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0225), uint64(maxBitmaskSize)) - return - } - zb0224, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0224) - } - } - if zb0049 > 0 { - zb0049-- - var zb0226 int - var zb0227 bool - zb0226, zb0227, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0226 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0226), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0227 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps) >= zb0226 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps)[:zb0226] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0226) - } - for zb0028 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - var zb0228 int - var zb0229 bool - zb0228, zb0229, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028) - return - } - if zb0228 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0228), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028) - return - } - if zb0229 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]) >= zb0228 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028])[:zb0228] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = make(appIndices, zb0228) - } - for zb0029 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028, zb0029) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0230 []byte - var zb0231 int - zb0231, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - if zb0231 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0231), uint64(maxBitmaskSize)) - return - } - zb0230, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0230) - } - } - if zb0049 > 0 { - zb0049-- - var zb0232 int - var zb0233 bool - zb0232, zb0233, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0232 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0232), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0233 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) >= zb0232 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets)[:zb0232] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0232) - } - for zb0030 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - var zb0234 int - var zb0235 bool - zb0234, zb0235, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030) - return - } - if zb0234 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0234), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030) - return - } - if zb0235 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]) >= zb0234 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030])[:zb0234] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = make(assetIndices, zb0234) - } - for zb0031 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030, zb0031) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0236 []byte - var zb0237 int - zb0237, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - if zb0237 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0237), uint64(maxBitmaskSize)) - return - } - zb0236, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0236) - } - } - if zb0049 > 0 { - zb0049-- - var zb0238 int - var zb0239 bool - zb0238, zb0239, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0238 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0238), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0239 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) >= zb0238 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint)[:zb0238] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0238) - } - for zb0032 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint", zb0032) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0240 []byte - var zb0241 int - zb0241, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - if zb0241 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0241), uint64(maxBitmaskSize)) - return - } - zb0240, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0240) - } - } - if zb0049 > 0 { - zb0049-- - var zb0242 int - var zb0243 bool - zb0242, zb0243, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0242 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0242), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0243 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0242 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0242] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0242) - } - for zb0033 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice", zb0033) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0244 []byte - var zb0245 int - zb0245, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - if zb0245 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0245), uint64(maxBitmaskSize)) - return - } - zb0244, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0244) - } - } - if zb0049 > 0 { - zb0049-- - var zb0246 int - var zb0247 bool - zb0246, zb0247, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0246 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0246), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0247 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) >= zb0246 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint)[:zb0246] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0246) - } - for zb0034 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint", zb0034) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0248 []byte - var zb0249 int - zb0249, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - if zb0249 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0249), uint64(maxBitmaskSize)) - return - } - zb0248, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0248) - } - } - if zb0049 > 0 { - zb0049-- - var zb0250 int - var zb0251 bool - zb0250, zb0251, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0250 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0250), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0251 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0250 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0250] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0250) - } - for zb0035 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice", zb0035) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0252 []byte - var zb0253 int - zb0253, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - if zb0253 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0253), uint64(maxBitmaskSize)) - return - } - zb0252, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0252) - } - } - if zb0049 > 0 { - zb0049-- - var zb0254 int - var zb0255 bool - zb0254, zb0255, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0254 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0254), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0255 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) >= zb0254 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram)[:zb0254] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0254) - } - for zb0036 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0256 []byte - var zb0257 int - zb0257, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0036) - return - } - if zb0257 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0257), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0256, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0036) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036] = program(zb0256) - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0258 []byte - var zb0259 int - zb0259, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - if zb0259 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0259), uint64(maxBitmaskSize)) - return - } - zb0258, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0258) - } - } - if zb0049 > 0 { - zb0049-- - var zb0260 int - var zb0261 bool - zb0260, zb0261, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0260 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0260), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0261 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) >= zb0260 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram)[:zb0260] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0260) - } - for zb0037 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0262 []byte - var zb0263 int - zb0263, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0037) - return - } - if zb0263 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0263), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0262, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0037) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037] = program(zb0262) - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0264 []byte - var zb0265 int - zb0265, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - if zb0265 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0265), uint64(maxBitmaskSize)) - return - } - zb0264, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0264) - } - } - if zb0049 > 0 { - zb0049-- - var zb0266 int - var zb0267 bool - zb0266, zb0267, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0266 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0266), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0267 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0266 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0266] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0266) - } - for zb0038 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages", zb0038) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0268 []byte - var zb0269 int - zb0269, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - if zb0269 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0269), uint64(maxBitmaskSize)) - return - } - zb0268, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0268) - } - } - if zb0049 > 0 { - zb0049-- - var zb0270 int - var zb0271 bool - zb0270, zb0271, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0270 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0270), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0271 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.CertRound) >= zb0270 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = ((*z).encodedTxns.encodedCompactCertTxnFields.CertRound)[:zb0270] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0270) - } - for zb0039 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound", zb0039) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0272 []byte - var zb0273 int - zb0273, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - if zb0273 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0273), uint64(maxBitmaskSize)) - return - } - zb0272, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0272) - } - } - if zb0049 > 0 { - zb0049-- - var zb0274 int - var zb0275 bool - zb0274, zb0275, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0274 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0274), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0275 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.CertType) >= zb0274 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = ((*z).encodedTxns.encodedCompactCertTxnFields.CertType)[:zb0274] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0274) - } - for zb0040 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType", zb0040) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0276 []byte - var zb0277 int - zb0277, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - if zb0277 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0277), uint64(maxBitmaskSize)) - return - } - zb0276, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0276) - } - } - if zb0049 > 0 { - zb0049-- - var zb0278 int - zb0278, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - if zb0278 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0278), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0279 []byte - var zb0280 int - zb0280, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - if zb0280 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0280), uint64(maxBitmaskSize)) - return - } - zb0279, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0279) - } - } - if zb0049 > 0 { - zb0049-- - var zb0281 int - var zb0282 bool - zb0281, zb0282, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0281 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0281), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0282 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0281 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0281] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0281) - } - for zb0041 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight", zb0041) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0283 []byte - var zb0284 int - zb0284, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - if zb0284 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0284), uint64(maxBitmaskSize)) - return - } - zb0283, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0283) - } - } - if zb0049 > 0 { - zb0049-- - var zb0285 int - var zb0286 bool - zb0285, zb0286, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0285 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0285), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0286 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0285 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0285] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0285) - } - for zb0042 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0287 int - var zb0288 bool - zb0287, zb0288, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042) - return - } - if zb0287 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0287), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042) - return - } - if zb0288 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]) >= zb0287 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042])[:zb0287] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = make(certProofs, zb0287) - } - for zb0043 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042, zb0043) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0289 []byte - var zb0290 int - zb0290, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - if zb0290 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0290), uint64(maxBitmaskSize)) - return - } - zb0289, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0289) - } - } - if zb0049 > 0 { - zb0049-- - var zb0291 int - var zb0292 bool - zb0291, zb0292, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0291 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0291), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0292 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0291 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0291] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0291) - } - for zb0044 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0293 int - var zb0294 bool - zb0293, zb0294, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044) - return - } - if zb0293 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0293), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044) - return - } - if zb0294 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]) >= zb0293 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044])[:zb0293] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = make(certProofs, zb0293) - } - for zb0045 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044, zb0045) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0295 []byte - var zb0296 int - zb0296, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - if zb0296 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0296), uint64(maxBitmaskSize)) - return - } - zb0295, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0295) - } - } - if zb0049 > 0 { - zb0049-- - var zb0297 int - var zb0298 bool - zb0297, zb0298, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0297 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0297), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0298 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0297 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0297] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0297) - } - for zb0046 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0299 int - var zb0300 bool - zb0299, zb0300, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - if zb0299 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0299), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - if zb0300 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = make(revealMap, zb0299) - } - for zb0299 > 0 { - var zb0047 uint64 - var zb0048 compactcert.Reveal - zb0299-- - zb0047, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - bts, err = zb0048.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046, zb0047) - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] = zb0048 - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0301 []byte - var zb0302 int - zb0302, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - if zb0302 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0302), uint64(maxBitmaskSize)) - return - } - zb0301, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0301) - } - } - if zb0049 > 0 { - err = msgp.ErrTooManyArrayFields(zb0049) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0050 { - (*z) = encodedSignedTxns{} - } - for zb0049 > 0 { - zb0049-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "sig": - var zb0303 int - zb0303, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sig") - return - } - if zb0303 > maxSignatureBytes { - err = msgp.ErrOverflow(uint64(zb0303), uint64(maxSignatureBytes)) - return - } - (*z).Sig, bts, err = msgp.ReadBytesBytes(bts, (*z).Sig) - if err != nil { - err = msgp.WrapError(err, "Sig") - return - } - case "sigbm": - { - var zb0304 []byte - var zb0305 int - zb0305, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSig") - return - } - if zb0305 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0305), uint64(maxBitmaskSize)) - return - } - zb0304, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSig)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSig") - return - } - (*z).BitmaskSig = bitmask(zb0304) - } - case "msigv": - var zb0306 int - zb0306, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - if zb0306 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0306), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedMsigs.Version, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedMsigs.Version) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - case "msigvbm": - { - var zb0307 []byte - var zb0308 int - zb0308, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - if zb0308 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0308), uint64(maxBitmaskSize)) - return - } - zb0307, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - (*z).encodedMsigs.BitmaskVersion = bitmask(zb0307) - } - case "msigthr": - var zb0309 int - zb0309, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - if zb0309 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0309), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedMsigs.Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedMsigs.Threshold) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - case "msigthrbm": - { - var zb0310 []byte - var zb0311 int - zb0311, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - if zb0311 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0311), uint64(maxBitmaskSize)) - return - } - zb0310, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - (*z).encodedMsigs.BitmaskThreshold = bitmask(zb0310) - } - case "subsig": - var zb0312 int - var zb0313 bool - zb0312, zb0313, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0312 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0312), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0313 { - (*z).encodedMsigs.Subsigs = nil - } else if (*z).encodedMsigs.Subsigs != nil && cap((*z).encodedMsigs.Subsigs) >= zb0312 { - (*z).encodedMsigs.Subsigs = ((*z).encodedMsigs.Subsigs)[:zb0312] - } else { - (*z).encodedMsigs.Subsigs = make([][]crypto.MultisigSubsig, zb0312) - } - for zb0001 := range (*z).encodedMsigs.Subsigs { - var zb0314 int - var zb0315 bool - zb0314, zb0315, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0314 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0314), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0315 { - (*z).encodedMsigs.Subsigs[zb0001] = nil - } else if (*z).encodedMsigs.Subsigs[zb0001] != nil && cap((*z).encodedMsigs.Subsigs[zb0001]) >= zb0314 { - (*z).encodedMsigs.Subsigs[zb0001] = ((*z).encodedMsigs.Subsigs[zb0001])[:zb0314] - } else { - (*z).encodedMsigs.Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0314) - } - for zb0002 := range (*z).encodedMsigs.Subsigs[zb0001] { - bts, err = (*z).encodedMsigs.Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001, zb0002) - return - } - } - } - case "subsigsbm": - { - var zb0316 []byte - var zb0317 int - zb0317, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - if zb0317 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0317), uint64(maxBitmaskSize)) - return - } - zb0316, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedMsigs.BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - (*z).encodedMsigs.BitmaskSubsigs = bitmask(zb0316) - } - case "lsigl": - var zb0318 int - var zb0319 bool - zb0318, zb0319, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Logic") - return - } - if zb0318 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0318), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Logic") - return - } - if zb0319 { - (*z).encodedLsigs.Logic = nil - } else if (*z).encodedLsigs.Logic != nil && cap((*z).encodedLsigs.Logic) >= zb0318 { - (*z).encodedLsigs.Logic = ((*z).encodedLsigs.Logic)[:zb0318] - } else { - (*z).encodedLsigs.Logic = make([][]byte, zb0318) - } - for zb0003 := range (*z).encodedLsigs.Logic { - var zb0320 int - zb0320, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0003) - return - } - if zb0320 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0320), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedLsigs.Logic[zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedLsigs.Logic[zb0003]) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0003) - return - } - } - case "lsiglbm": - { - var zb0321 []byte - var zb0322 int - zb0322, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - if zb0322 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0322), uint64(maxBitmaskSize)) - return - } - zb0321, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedLsigs.BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - (*z).encodedLsigs.BitmaskLogic = bitmask(zb0321) - } - case "lsigarg": - var zb0323 int - var zb0324 bool - zb0323, zb0324, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0323 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0323), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0324 { - (*z).encodedLsigs.LogicArgs = nil - } else if (*z).encodedLsigs.LogicArgs != nil && cap((*z).encodedLsigs.LogicArgs) >= zb0323 { - (*z).encodedLsigs.LogicArgs = ((*z).encodedLsigs.LogicArgs)[:zb0323] - } else { - (*z).encodedLsigs.LogicArgs = make([][][]byte, zb0323) - } - for zb0004 := range (*z).encodedLsigs.LogicArgs { - var zb0325 int - var zb0326 bool - zb0325, zb0326, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004) - return - } - if zb0325 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0325), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "LogicArgs", zb0004) - return - } - if zb0326 { - (*z).encodedLsigs.LogicArgs[zb0004] = nil - } else if (*z).encodedLsigs.LogicArgs[zb0004] != nil && cap((*z).encodedLsigs.LogicArgs[zb0004]) >= zb0325 { - (*z).encodedLsigs.LogicArgs[zb0004] = ((*z).encodedLsigs.LogicArgs[zb0004])[:zb0325] - } else { - (*z).encodedLsigs.LogicArgs[zb0004] = make([][]byte, zb0325) - } - for zb0005 := range (*z).encodedLsigs.LogicArgs[zb0004] { - var zb0327 int - zb0327, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004, zb0005) - return - } - if zb0327 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0327), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedLsigs.LogicArgs[zb0004][zb0005], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedLsigs.LogicArgs[zb0004][zb0005]) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004, zb0005) - return - } - } - } - case "lsigargbm": - { - var zb0328 []byte - var zb0329 int - zb0329, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - if zb0329 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0329), uint64(maxBitmaskSize)) - return - } - zb0328, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedLsigs.BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - (*z).encodedLsigs.BitmaskLogicArgs = bitmask(zb0328) - } - case "sgnr": - var zb0330 int - zb0330, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AuthAddr") - return - } - if zb0330 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0330), uint64(maxAddressBytes)) - return - } - (*z).AuthAddr, bts, err = msgp.ReadBytesBytes(bts, (*z).AuthAddr) - if err != nil { - err = msgp.WrapError(err, "AuthAddr") - return - } - case "sgnrbm": - { - var zb0331 []byte - var zb0332 int - zb0332, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAuthAddr") - return - } - if zb0332 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0332), uint64(maxBitmaskSize)) - return - } - zb0331, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskAuthAddr)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAuthAddr") - return - } - (*z).BitmaskAuthAddr = bitmask(zb0331) - } - case "type": - var zb0333 int - zb0333, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - if zb0333 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0333), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedTxns.TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.TxType) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - case "typebm": - { - var zb0334 []byte - var zb0335 int - zb0335, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - if zb0335 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0335), uint64(maxBitmaskSize)) - return - } - zb0334, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - (*z).encodedTxns.BitmaskTxType = bitmask(zb0334) - } - case "typeo": - (*z).encodedTxns.TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "TxTypeOffset") - return - } - case "snd": - var zb0336 int - zb0336, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - if zb0336 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0336), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - case "sndbm": - { - var zb0337 []byte - var zb0338 int - zb0338, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - if zb0338 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0338), uint64(maxBitmaskSize)) - return - } - zb0337, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskSender = bitmask(zb0337) - } - case "fee": - var zb0339 int - var zb0340 bool - zb0339, zb0340, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Fee") - return - } - if zb0339 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0339), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Fee") - return - } - if zb0340 { - (*z).encodedTxns.encodedTxnHeaders.Fee = nil - } else if (*z).encodedTxns.encodedTxnHeaders.Fee != nil && cap((*z).encodedTxns.encodedTxnHeaders.Fee) >= zb0339 { - (*z).encodedTxns.encodedTxnHeaders.Fee = ((*z).encodedTxns.encodedTxnHeaders.Fee)[:zb0339] - } else { - (*z).encodedTxns.encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0339) - } - for zb0006 := range (*z).encodedTxns.encodedTxnHeaders.Fee { - bts, err = (*z).encodedTxns.encodedTxnHeaders.Fee[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Fee", zb0006) - return - } - } - case "feebm": - { - var zb0341 []byte - var zb0342 int - zb0342, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - if zb0342 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0342), uint64(maxBitmaskSize)) - return - } - zb0341, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskFee = bitmask(zb0341) - } - case "fv": - var zb0343 int - var zb0344 bool - zb0343, zb0344, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0343 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0343), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0344 { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedTxns.encodedTxnHeaders.FirstValid != nil && cap((*z).encodedTxns.encodedTxnHeaders.FirstValid) >= zb0343 { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = ((*z).encodedTxns.encodedTxnHeaders.FirstValid)[:zb0343] - } else { - (*z).encodedTxns.encodedTxnHeaders.FirstValid = make([]basics.Round, zb0343) - } - for zb0007 := range (*z).encodedTxns.encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedTxns.encodedTxnHeaders.FirstValid[zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid", zb0007) - return - } - } - case "fvbm": - { - var zb0345 []byte - var zb0346 int - zb0346, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - if zb0346 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0346), uint64(maxBitmaskSize)) - return - } - zb0345, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0345) - } - case "lv": - var zb0347 int - var zb0348 bool - zb0347, zb0348, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid") - return - } - if zb0347 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0347), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LastValid") - return - } - if zb0348 { - (*z).encodedTxns.encodedTxnHeaders.LastValid = nil - } else if (*z).encodedTxns.encodedTxnHeaders.LastValid != nil && cap((*z).encodedTxns.encodedTxnHeaders.LastValid) >= zb0347 { - (*z).encodedTxns.encodedTxnHeaders.LastValid = ((*z).encodedTxns.encodedTxnHeaders.LastValid)[:zb0347] - } else { - (*z).encodedTxns.encodedTxnHeaders.LastValid = make([]basics.Round, zb0347) - } - for zb0008 := range (*z).encodedTxns.encodedTxnHeaders.LastValid { - bts, err = (*z).encodedTxns.encodedTxnHeaders.LastValid[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid", zb0008) - return - } - } - case "lvbm": - { - var zb0349 []byte - var zb0350 int - zb0350, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - if zb0350 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0350), uint64(maxBitmaskSize)) - return - } - zb0349, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid = bitmask(zb0349) - } - case "note": - var zb0351 int - var zb0352 bool - zb0351, zb0352, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Note") - return - } - if zb0351 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0351), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Note") - return - } - if zb0352 { - (*z).encodedTxns.encodedTxnHeaders.Note = nil - } else if (*z).encodedTxns.encodedTxnHeaders.Note != nil && cap((*z).encodedTxns.encodedTxnHeaders.Note) >= zb0351 { - (*z).encodedTxns.encodedTxnHeaders.Note = ((*z).encodedTxns.encodedTxnHeaders.Note)[:zb0351] - } else { - (*z).encodedTxns.encodedTxnHeaders.Note = make([][]byte, zb0351) - } - for zb0009 := range (*z).encodedTxns.encodedTxnHeaders.Note { - var zb0353 int - zb0353, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Note", zb0009) - return - } - if zb0353 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0353), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Note[zb0009], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Note[zb0009]) - if err != nil { - err = msgp.WrapError(err, "Note", zb0009) - return - } - } - case "notebm": - { - var zb0354 []byte - var zb0355 int - zb0355, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - if zb0355 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0355), uint64(maxBitmaskSize)) - return - } - zb0354, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskNote = bitmask(zb0354) - } - case "genbm": - { - var zb0356 []byte - var zb0357 int - zb0357, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - if zb0357 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0357), uint64(maxBitmaskSize)) - return - } - zb0356, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0356) - } - case "grpbm": - { - var zb0358 []byte - var zb0359 int - zb0359, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - if zb0359 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0359), uint64(maxBitmaskSize)) - return - } - zb0358, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskGroup = bitmask(zb0358) - } - case "lx": - var zb0360 int - zb0360, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - if zb0360 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0360), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - case "lxbm": - { - var zb0361 []byte - var zb0362 int - zb0362, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - if zb0362 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0362), uint64(maxBitmaskSize)) - return - } - zb0361, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskLease = bitmask(zb0361) - } - case "rekey": - var zb0363 int - zb0363, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - if zb0363 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0363), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - case "rekeybm": - { - var zb0364 []byte - var zb0365 int - zb0365, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - if zb0365 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0365), uint64(maxBitmaskSize)) - return - } - zb0364, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - (*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0364) - } - case "votekey": - var zb0366 int - zb0366, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - if zb0366 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0366), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - case "selkey": - var zb0367 int - zb0367, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - if zb0367 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0367), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - case "votefst": - var zb0368 int - var zb0369 bool - zb0368, zb0369, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0368 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0368), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0369 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst) >= zb0368 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = ((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst)[:zb0368] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0368) - } - for zb0010 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst", zb0010) - return - } - } - case "votefstbm": - { - var zb0370 []byte - var zb0371 int - zb0371, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - if zb0371 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0371), uint64(maxBitmaskSize)) - return - } - zb0370, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0370) - } - case "votelst": - var zb0372 int - var zb0373 bool - zb0372, zb0373, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0372 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0372), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0373 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteLast) >= zb0372 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = ((*z).encodedTxns.encodedKeyregTxnFields.VoteLast)[:zb0372] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0372) - } - for zb0011 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast", zb0011) - return - } - } - case "votelstbm": - { - var zb0374 []byte - var zb0375 int - zb0375, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - if zb0375 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0375), uint64(maxBitmaskSize)) - return - } - zb0374, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0374) - } - case "votekd": - var zb0376 int - var zb0377 bool - zb0376, zb0377, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0376 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0376), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0377 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) >= zb0376 { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution)[:zb0376] - } else { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0376) - } - for zb0012 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution", zb0012) - return - } - } - case "votekbm": - { - var zb0378 []byte - var zb0379 int - zb0379, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - if zb0379 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0379), uint64(maxBitmaskSize)) - return - } - zb0378, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0378) - } - case "nonpartbm": - { - var zb0380 []byte - var zb0381 int - zb0381, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - if zb0381 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0381), uint64(maxBitmaskSize)) - return - } - zb0380, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - (*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0380) - } - case "rcv": - var zb0382 int - zb0382, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - if zb0382 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0382), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - case "rcvbm": - { - var zb0383 []byte - var zb0384 int - zb0384, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - if zb0384 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0384), uint64(maxBitmaskSize)) - return - } - zb0383, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0383) - } - case "amt": - var zb0385 int - var zb0386 bool - zb0385, zb0386, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Amount") - return - } - if zb0385 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0385), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Amount") - return - } - if zb0386 { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedTxns.encodedPaymentTxnFields.Amount != nil && cap((*z).encodedTxns.encodedPaymentTxnFields.Amount) >= zb0385 { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = ((*z).encodedTxns.encodedPaymentTxnFields.Amount)[:zb0385] - } else { - (*z).encodedTxns.encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0385) - } - for zb0013 := range (*z).encodedTxns.encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedTxns.encodedPaymentTxnFields.Amount[zb0013].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Amount", zb0013) - return - } - } - case "amtbm": - { - var zb0387 []byte - var zb0388 int - zb0388, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - if zb0388 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0388), uint64(maxBitmaskSize)) - return - } - zb0387, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0387) - } - case "close": - var zb0389 int - zb0389, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - if zb0389 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0389), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - case "closebm": - { - var zb0390 []byte - var zb0391 int - zb0391, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - if zb0391 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0391), uint64(maxBitmaskSize)) - return - } - zb0390, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - (*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0390) - } - case "caid": - var zb0392 int - var zb0393 bool - zb0392, zb0393, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0392 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0392), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0393 { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) >= zb0392 { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset)[:zb0392] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0392) - } - for zb0014 := range (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset", zb0014) - return - } - } - case "caidbm": - { - var zb0394 []byte - var zb0395 int - zb0395, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - if zb0395 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0395), uint64(maxBitmaskSize)) - return - } - zb0394, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0394) - } - case "t": - var zb0396 int - var zb0397 bool - zb0396, zb0397, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total") - return - } - if zb0396 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0396), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Total") - return - } - if zb0397 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0396 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0396] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0396) - } - for zb0015 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total", zb0015) - return - } - } - case "tbm": - { - var zb0398 []byte - var zb0399 int - zb0399, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - if zb0399 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0399), uint64(maxBitmaskSize)) - return - } - zb0398, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0398) - } - case "dc": - var zb0400 int - var zb0401 bool - zb0400, zb0401, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals") - return - } - if zb0400 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0400), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Decimals") - return - } - if zb0401 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0400 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0400] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0400) - } - for zb0016 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals", zb0016) - return - } - } - case "dcbm": - { - var zb0402 []byte - var zb0403 int - zb0403, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - if zb0403 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0403), uint64(maxBitmaskSize)) - return - } - zb0402, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0402) - } - case "dfbm": - { - var zb0404 []byte - var zb0405 int - zb0405, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - if zb0405 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0405), uint64(maxBitmaskSize)) - return - } - zb0404, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0404) - } - case "un": - var zb0406 int - var zb0407 bool - zb0406, zb0407, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName") - return - } - if zb0406 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0406), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "UnitName") - return - } - if zb0407 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0406 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0406] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0406) - } - for zb0017 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName", zb0017) - return - } - } - case "unbm": - { - var zb0408 []byte - var zb0409 int - zb0409, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - if zb0409 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0409), uint64(maxBitmaskSize)) - return - } - zb0408, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0408) - } - case "an": - var zb0410 int - var zb0411 bool - zb0410, zb0411, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName") - return - } - if zb0410 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0410), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetName") - return - } - if zb0411 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0410 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0410] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0410) - } - for zb0018 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName", zb0018) - return - } - } - case "anbm": - { - var zb0412 []byte - var zb0413 int - zb0413, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - if zb0413 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0413), uint64(maxBitmaskSize)) - return - } - zb0412, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0412) - } - case "au": - var zb0414 int - var zb0415 bool - zb0414, zb0415, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL") - return - } - if zb0414 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0414), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "URL") - return - } - if zb0415 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0414 { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0414] - } else { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0414) - } - for zb0019 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL", zb0019) - return - } - } - case "aubm": - { - var zb0416 []byte - var zb0417 int - zb0417, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - if zb0417 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0417), uint64(maxBitmaskSize)) - return - } - zb0416, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0416) - } - case "am": - var zb0418 int - zb0418, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - if zb0418 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0418), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - case "ambm": - { - var zb0419 []byte - var zb0420 int - zb0420, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - if zb0420 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0420), uint64(maxBitmaskSize)) - return - } - zb0419, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0419) - } - case "m": - var zb0421 int - zb0421, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - if zb0421 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0421), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - case "mbm": - { - var zb0422 []byte - var zb0423 int - zb0423, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - if zb0423 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0423), uint64(maxBitmaskSize)) - return - } - zb0422, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0422) - } - case "r": - var zb0424 int - zb0424, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - if zb0424 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0424), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - case "rbm": - { - var zb0425 []byte - var zb0426 int - zb0426, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - if zb0426 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0426), uint64(maxBitmaskSize)) - return - } - zb0425, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0425) - } - case "f": - var zb0427 int - zb0427, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - if zb0427 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0427), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - case "fbm": - { - var zb0428 []byte - var zb0429 int - zb0429, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - if zb0429 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0429), uint64(maxBitmaskSize)) - return - } - zb0428, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0428) - } - case "c": - var zb0430 int - zb0430, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - if zb0430 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0430), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - case "cbm": - { - var zb0431 []byte - var zb0432 int - zb0432, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - if zb0432 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0432), uint64(maxBitmaskSize)) - return - } - zb0431, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0431) - } - case "xaid": - var zb0433 int - var zb0434 bool - zb0433, zb0434, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0433 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0433), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0434 { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset) >= zb0433 { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = ((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset)[:zb0433] - } else { - (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0433) - } - for zb0020 := range (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset", zb0020) - return - } - } - case "xaidbm": - { - var zb0435 []byte - var zb0436 int - zb0436, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - if zb0436 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0436), uint64(maxBitmaskSize)) - return - } - zb0435, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0435) - } - case "aamt": - var zb0437 int - var zb0438 bool - zb0437, zb0438, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0437 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0437), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0438 { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount) >= zb0437 { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount)[:zb0437] - } else { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0437) - } - for zb0021 := range (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount", zb0021) - return - } - } - case "aamtbm": - { - var zb0439 []byte - var zb0440 int - zb0440, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - if zb0440 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0440), uint64(maxBitmaskSize)) - return - } - zb0439, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0439) - } - case "asnd": - var zb0441 int - zb0441, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - if zb0441 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0441), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - case "asndbm": - { - var zb0442 []byte - var zb0443 int - zb0443, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - if zb0443 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0443), uint64(maxBitmaskSize)) - return - } - zb0442, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0442) - } - case "arcv": - var zb0444 int - zb0444, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - if zb0444 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0444), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - case "arcvbm": - { - var zb0445 []byte - var zb0446 int - zb0446, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - if zb0446 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0446), uint64(maxBitmaskSize)) - return - } - zb0445, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0445) - } - case "aclose": - var zb0447 int - zb0447, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - if zb0447 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0447), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - case "aclosebm": - { - var zb0448 []byte - var zb0449 int - zb0449, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - if zb0449 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0449), uint64(maxBitmaskSize)) - return - } - zb0448, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - (*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0448) - } - case "fadd": - var zb0450 int - zb0450, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - if zb0450 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0450), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - case "faddbm": - { - var zb0451 []byte - var zb0452 int - zb0452, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - if zb0452 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0452), uint64(maxBitmaskSize)) - return - } - zb0451, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0451) - } - case "faid": - var zb0453 int - var zb0454 bool - zb0453, zb0454, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0453 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0453), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0454 { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) >= zb0453 { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset)[:zb0453] - } else { - (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0453) - } - for zb0022 := range (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset", zb0022) - return - } - } - case "faidbm": - { - var zb0455 []byte - var zb0456 int - zb0456, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - if zb0456 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0456), uint64(maxBitmaskSize)) - return - } - zb0455, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0455) - } - case "afrzbm": - { - var zb0457 []byte - var zb0458 int - zb0458, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - if zb0458 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0458), uint64(maxBitmaskSize)) - return - } - zb0457, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - (*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0457) - } - case "apid": - var zb0459 int - var zb0460 bool - zb0459, zb0460, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0459 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0459), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0460 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID) >= zb0459 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID)[:zb0459] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0459) - } - for zb0023 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID", zb0023) - return - } - } - case "apidbm": - { - var zb0461 []byte - var zb0462 int - zb0462, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - if zb0462 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0462), uint64(maxBitmaskSize)) - return - } - zb0461, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0461) - } - case "apan": - var zb0463 int - zb0463, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - if zb0463 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0463), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - case "apanbm": - { - var zb0464 []byte - var zb0465 int - zb0465, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - if zb0465 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0465), uint64(maxBitmaskSize)) - return - } - zb0464, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0464) - } - case "apaa": - var zb0466 int - var zb0467 bool - zb0466, zb0467, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0466 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0466), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0467 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) >= zb0466 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs)[:zb0466] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0466) - } - for zb0024 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - var zb0468 int - var zb0469 bool - zb0468, zb0469, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0024) - return - } - if zb0468 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0468), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "ApplicationArgs", zb0024) - return - } - if zb0469 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]) >= zb0468 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024])[:zb0468] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = make(applicationArgs, zb0468) - } - for zb0025 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0024, zb0025) - return - } - } - } - case "apaabm": - { - var zb0470 []byte - var zb0471 int - zb0471, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - if zb0471 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0471), uint64(maxBitmaskSize)) - return - } - zb0470, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0470) - } - case "apat": - var zb0472 int - var zb0473 bool - zb0472, zb0473, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts") - return - } - if zb0472 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0472), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Accounts") - return - } - if zb0473 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts) >= zb0472 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = ((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts)[:zb0472] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0472) - } - for zb0026 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts { - var zb0474 int - var zb0475 bool - zb0474, zb0475, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0026) - return - } - if zb0474 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0474), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "Accounts", zb0026) - return - } - if zb0475 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]) >= zb0474 { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = ((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026])[:zb0474] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = make(addresses, zb0474) - } - for zb0027 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0026, zb0027) - return - } - } - } - case "apatbm": - { - var zb0476 []byte - var zb0477 int - zb0477, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - if zb0477 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0477), uint64(maxBitmaskSize)) - return - } - zb0476, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0476) - } - case "apfa": - var zb0478 int - var zb0479 bool - zb0478, zb0479, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0478 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0478), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0479 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps) >= zb0478 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps)[:zb0478] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0478) - } - for zb0028 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - var zb0480 int - var zb0481 bool - zb0480, zb0481, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0028) - return - } - if zb0480 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0480), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "ForeignApps", zb0028) - return - } - if zb0481 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]) >= zb0480 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028])[:zb0480] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = make(appIndices, zb0480) - } - for zb0029 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0028, zb0029) - return - } - } - } - case "apfabm": - { - var zb0482 []byte - var zb0483 int - zb0483, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - if zb0483 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0483), uint64(maxBitmaskSize)) - return - } - zb0482, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0482) - } - case "apas": - var zb0484 int - var zb0485 bool - zb0484, zb0485, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0484 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0484), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0485 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) >= zb0484 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets)[:zb0484] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0484) - } - for zb0030 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - var zb0486 int - var zb0487 bool - zb0486, zb0487, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0030) - return - } - if zb0486 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0486), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "ForeignAssets", zb0030) - return - } - if zb0487 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]) >= zb0486 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = ((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030])[:zb0486] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = make(assetIndices, zb0486) - } - for zb0031 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - bts, err = (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0030, zb0031) - return - } - } - } - case "apasbm": - { - var zb0488 []byte - var zb0489 int - zb0489, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - if zb0489 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0489), uint64(maxBitmaskSize)) - return - } - zb0488, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0488) - } - case "lnui": - var zb0490 int - var zb0491 bool - zb0490, zb0491, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0490 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0490), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0491 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) >= zb0490 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint)[:zb0490] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0490) - } - for zb0032 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint", zb0032) - return - } - } - case "lnuibm": - { - var zb0492 []byte - var zb0493 int - zb0493, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - if zb0493 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0493), uint64(maxBitmaskSize)) - return - } - zb0492, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0492) - } - case "lnbs": - var zb0494 int - var zb0495 bool - zb0494, zb0495, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0494 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0494), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0495 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0494 { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0494] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0494) - } - for zb0033 := range (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice", zb0033) - return - } - } - case "lnbsbm": - { - var zb0496 []byte - var zb0497 int - zb0497, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - if zb0497 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0497), uint64(maxBitmaskSize)) - return - } - zb0496, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0496) - } - case "gnui": - var zb0498 int - var zb0499 bool - zb0498, zb0499, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0498 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0498), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0499 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) >= zb0498 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint)[:zb0498] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0498) - } - for zb0034 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint", zb0034) - return - } - } - case "gnuibm": - { - var zb0500 []byte - var zb0501 int - zb0501, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - if zb0501 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0501), uint64(maxBitmaskSize)) - return - } - zb0500, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0500) - } - case "gnbs": - var zb0502 int - var zb0503 bool - zb0502, zb0503, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0502 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0502), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0503 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0502 { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0502] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0502) - } - for zb0035 := range (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice", zb0035) - return - } - } - case "gnbsbm": - { - var zb0504 []byte - var zb0505 int - zb0505, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - if zb0505 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0505), uint64(maxBitmaskSize)) - return - } - zb0504, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0504) - } - case "apap": - var zb0506 int - var zb0507 bool - zb0506, zb0507, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0506 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0506), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0507 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) >= zb0506 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram)[:zb0506] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0506) - } - for zb0036 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0508 []byte - var zb0509 int - zb0509, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0036) - return - } - if zb0509 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0509), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0508, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0036) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036] = program(zb0508) - } - } - case "apapbm": - { - var zb0510 []byte - var zb0511 int - zb0511, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - if zb0511 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0511), uint64(maxBitmaskSize)) - return - } - zb0510, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0510) - } - case "apsu": - var zb0512 int - var zb0513 bool - zb0512, zb0513, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0512 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0512), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0513 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) >= zb0512 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram)[:zb0512] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0512) - } - for zb0037 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0514 []byte - var zb0515 int - zb0515, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0037) - return - } - if zb0515 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0515), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0514, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0037) - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037] = program(zb0514) - } - } - case "apsubm": - { - var zb0516 []byte - var zb0517 int - zb0517, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - if zb0517 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0517), uint64(maxBitmaskSize)) - return - } - zb0516, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0516) - } - case "apep": - var zb0518 int - var zb0519 bool - zb0518, zb0519, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0518 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0518), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0519 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0518 { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0518] - } else { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0518) - } - for zb0038 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages", zb0038) - return - } - } - case "apepbm": - { - var zb0520 []byte - var zb0521 int - zb0521, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - if zb0521 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0521), uint64(maxBitmaskSize)) - return - } - zb0520, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - (*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0520) - } - case "certrnd": - var zb0522 int - var zb0523 bool - zb0522, zb0523, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound") - return - } - if zb0522 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0522), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertRound") - return - } - if zb0523 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.CertRound) >= zb0522 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = ((*z).encodedTxns.encodedCompactCertTxnFields.CertRound)[:zb0522] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0522) - } - for zb0039 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound", zb0039) - return - } - } - case "certrndbm": - { - var zb0524 []byte - var zb0525 int - zb0525, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - if zb0525 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0525), uint64(maxBitmaskSize)) - return - } - zb0524, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0524) - } - case "certtype": - var zb0526 int - var zb0527 bool - zb0526, zb0527, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertType") - return - } - if zb0526 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0526), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertType") - return - } - if zb0527 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.CertType) >= zb0526 { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = ((*z).encodedTxns.encodedCompactCertTxnFields.CertType)[:zb0526] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0526) - } - for zb0040 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertType", zb0040) - return - } - } - case "certtypebm": - { - var zb0528 []byte - var zb0529 int - zb0529, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - if zb0529 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0529), uint64(maxBitmaskSize)) - return - } - zb0528, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0528) - } - case "certc": - var zb0530 int - zb0530, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - if zb0530 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0530), uint64(maxAddressBytes)) - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - case "certcbm": - { - var zb0531 []byte - var zb0532 int - zb0532, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - if zb0532 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0532), uint64(maxBitmaskSize)) - return - } - zb0531, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0531) - } - case "certw": - var zb0533 int - var zb0534 bool - zb0533, zb0534, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0533 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0533), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0534 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0533 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0533] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0533) - } - for zb0041 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight", zb0041) - return - } - } - case "certwbm": - { - var zb0535 []byte - var zb0536 int - zb0536, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - if zb0536 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0536), uint64(maxBitmaskSize)) - return - } - zb0535, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0535) - } - case "certS": - var zb0537 int - var zb0538 bool - zb0537, zb0538, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0537 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0537), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0538 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0537 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0537] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0537) - } - for zb0042 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0539 int - var zb0540 bool - zb0539, zb0540, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0042) - return - } - if zb0539 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0539), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "SigProofs", zb0042) - return - } - if zb0540 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]) >= zb0539 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042])[:zb0539] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = make(certProofs, zb0539) - } - for zb0043 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0042, zb0043) - return - } - } - } - case "certSbm": - { - var zb0541 []byte - var zb0542 int - zb0542, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - if zb0542 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0542), uint64(maxBitmaskSize)) - return - } - zb0541, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0541) - } - case "certP": - var zb0543 int - var zb0544 bool - zb0543, zb0544, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0543 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0543), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0544 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0543 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0543] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0543) - } - for zb0044 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0545 int - var zb0546 bool - zb0545, zb0546, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0044) - return - } - if zb0545 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0545), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "PartProofs", zb0044) - return - } - if zb0546 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]) >= zb0545 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044])[:zb0545] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = make(certProofs, zb0545) - } - for zb0045 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - bts, err = (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0044, zb0045) - return - } - } - } - case "certPbm": - { - var zb0547 []byte - var zb0548 int - zb0548, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - if zb0548 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0548), uint64(maxBitmaskSize)) - return - } - zb0547, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0547) - } - case "certr": - var zb0549 int - var zb0550 bool - zb0549, zb0550, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals") - return - } - if zb0549 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0549), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Reveals") - return - } - if zb0550 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0549 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0549] - } else { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0549) - } - for zb0046 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0551 int - var zb0552 bool - zb0551, zb0552, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - if zb0551 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0551), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - if zb0552 { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = nil - } else if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = make(revealMap, zb0551) - } - for zb0551 > 0 { - var zb0047 uint64 - var zb0048 compactcert.Reveal - zb0551-- - zb0047, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - bts, err = zb0048.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046, zb0047) - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] = zb0048 - } - } - case "certrbm": - { - var zb0553 []byte - var zb0554 int - zb0554, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - if zb0554 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0554), uint64(maxBitmaskSize)) - return - } - zb0553, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0553) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedSignedTxns) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedSignedTxns) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedSignedTxns) Msgsize() (s int) { - s = 3 + 4 + msgp.BytesPrefixSize + len((*z).Sig) + 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSig)) + 6 + msgp.BytesPrefixSize + len((*z).encodedMsigs.Version) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedMsigs.BitmaskVersion)) + 8 + msgp.BytesPrefixSize + len((*z).encodedMsigs.Threshold) + 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedMsigs.BitmaskThreshold)) + 7 + msgp.ArrayHeaderSize - for zb0001 := range (*z).encodedMsigs.Subsigs { - s += msgp.ArrayHeaderSize - for zb0002 := range (*z).encodedMsigs.Subsigs[zb0001] { - s += (*z).encodedMsigs.Subsigs[zb0001][zb0002].Msgsize() - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedMsigs.BitmaskSubsigs)) + 6 + msgp.ArrayHeaderSize - for zb0003 := range (*z).encodedLsigs.Logic { - s += msgp.BytesPrefixSize + len((*z).encodedLsigs.Logic[zb0003]) - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedLsigs.BitmaskLogic)) + 8 + msgp.ArrayHeaderSize - for zb0004 := range (*z).encodedLsigs.LogicArgs { - s += msgp.ArrayHeaderSize - for zb0005 := range (*z).encodedLsigs.LogicArgs[zb0004] { - s += msgp.BytesPrefixSize + len((*z).encodedLsigs.LogicArgs[zb0004][zb0005]) - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedLsigs.BitmaskLogicArgs)) + 5 + msgp.BytesPrefixSize + len((*z).AuthAddr) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskAuthAddr)) + 5 + msgp.BytesPrefixSize + len((*z).encodedTxns.TxType) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.BitmaskTxType)) + 6 + msgp.ByteSize + 4 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedTxnHeaders.Sender) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskSender)) + 4 + msgp.ArrayHeaderSize - for zb0006 := range (*z).encodedTxns.encodedTxnHeaders.Fee { - s += (*z).encodedTxns.encodedTxnHeaders.Fee[zb0006].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFee)) + 3 + msgp.ArrayHeaderSize - for zb0007 := range (*z).encodedTxns.encodedTxnHeaders.FirstValid { - s += (*z).encodedTxns.encodedTxnHeaders.FirstValid[zb0007].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) + 3 + msgp.ArrayHeaderSize - for zb0008 := range (*z).encodedTxns.encodedTxnHeaders.LastValid { - s += (*z).encodedTxns.encodedTxnHeaders.LastValid[zb0008].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid)) + 5 + msgp.ArrayHeaderSize - for zb0009 := range (*z).encodedTxns.encodedTxnHeaders.Note { - s += msgp.BytesPrefixSize + len((*z).encodedTxns.encodedTxnHeaders.Note[zb0009]) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskNote)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup)) + 3 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedTxnHeaders.Lease) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskLease)) + 6 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedTxnHeaders.RekeyTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) + 8 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedKeyregTxnFields.VotePK) + 7 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) + 8 + msgp.ArrayHeaderSize - for zb0010 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst { - s += (*z).encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) + 8 + msgp.ArrayHeaderSize - for zb0011 := range (*z).encodedTxns.encodedKeyregTxnFields.VoteLast { - s += (*z).encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) + 7 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) + 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) + 4 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedPaymentTxnFields.Receiver) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) + 4 + msgp.ArrayHeaderSize - for zb0013 := range (*z).encodedTxns.encodedPaymentTxnFields.Amount { - s += (*z).encodedTxns.encodedPaymentTxnFields.Amount[zb0013].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) + 6 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) + 5 + msgp.ArrayHeaderSize - for zb0014 := range (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - s += (*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) + 2 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) * (msgp.Uint64Size)) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) + 3 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) * (msgp.Uint32Size)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) + 3 + msgp.ArrayHeaderSize - for zb0017 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - s += msgp.StringPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) + 3 + msgp.ArrayHeaderSize - for zb0018 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - s += msgp.StringPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) + 3 + msgp.ArrayHeaderSize - for zb0019 := range (*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - s += msgp.StringPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) + 3 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) + 2 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) + 2 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) + 2 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) + 2 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) + 5 + msgp.ArrayHeaderSize - for zb0020 := range (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset { - s += (*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) + 5 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) + 5 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) + 7 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) + 9 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) + 5 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) + 5 + msgp.ArrayHeaderSize - for zb0022 := range (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - s += (*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) + 5 + msgp.ArrayHeaderSize - for zb0023 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - s += (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) + 5 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) + 5 + msgp.ArrayHeaderSize - for zb0024 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - s += msgp.ArrayHeaderSize - for zb0025 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - s += msgp.BytesPrefixSize + len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) + 5 + msgp.ArrayHeaderSize - for zb0026 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts { - s += msgp.ArrayHeaderSize - for zb0027 := range (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - s += (*z).encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) + 5 + msgp.ArrayHeaderSize - for zb0028 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - s += msgp.ArrayHeaderSize - for zb0029 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - s += (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) + 5 + msgp.ArrayHeaderSize - for zb0030 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - s += msgp.ArrayHeaderSize - for zb0031 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - s += (*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) + 5 + msgp.ArrayHeaderSize - for zb0036 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) + 5 + msgp.ArrayHeaderSize - for zb0037 := range (*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) * (msgp.Uint32Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) + 8 + msgp.ArrayHeaderSize - for zb0039 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertRound { - s += (*z).encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) + 9 + msgp.ArrayHeaderSize - for zb0040 := range (*z).encodedTxns.encodedCompactCertTxnFields.CertType { - s += (*z).encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].Msgsize() - } - s += 11 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) + 6 + msgp.BytesPrefixSize + len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) + 6 + msgp.ArrayHeaderSize + (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) + 6 + msgp.ArrayHeaderSize - for zb0042 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - s += msgp.ArrayHeaderSize - for zb0043 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - s += (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) + 6 + msgp.ArrayHeaderSize - for zb0044 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - s += msgp.ArrayHeaderSize - for zb0045 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - s += (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) + 6 + msgp.ArrayHeaderSize - for zb0046 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - s += msgp.MapHeaderSize - if (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] != nil { - for zb0047, zb0048 := range (*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] { - _ = zb0047 - _ = zb0048 - s += 0 + msgp.Uint64Size + zb0048.Msgsize() - } - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedSignedTxns) MsgIsZero() bool { - return (len((*z).Sig) == 0) && (len((*z).BitmaskSig) == 0) && (len((*z).encodedMsigs.Version) == 0) && (len((*z).encodedMsigs.BitmaskVersion) == 0) && (len((*z).encodedMsigs.Threshold) == 0) && (len((*z).encodedMsigs.BitmaskThreshold) == 0) && (len((*z).encodedMsigs.Subsigs) == 0) && (len((*z).encodedMsigs.BitmaskSubsigs) == 0) && (len((*z).encodedLsigs.Logic) == 0) && (len((*z).encodedLsigs.BitmaskLogic) == 0) && (len((*z).encodedLsigs.LogicArgs) == 0) && (len((*z).encodedLsigs.BitmaskLogicArgs) == 0) && (len((*z).AuthAddr) == 0) && (len((*z).BitmaskAuthAddr) == 0) && (len((*z).encodedTxns.TxType) == 0) && (len((*z).encodedTxns.BitmaskTxType) == 0) && ((*z).encodedTxns.TxTypeOffset == 0) && (len((*z).encodedTxns.encodedTxnHeaders.Sender) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskSender) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.Fee) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskFee) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.FirstValid) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskFirstValid) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.LastValid) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskLastValid) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.Note) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskNote) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskGenesisID) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskGroup) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.Lease) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskLease) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.RekeyTo) == 0) && (len((*z).encodedTxns.encodedTxnHeaders.BitmaskRekeyTo) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.VotePK) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.SelectionPK) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.VoteFirst) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.VoteLast) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskKeys) == 0) && (len((*z).encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.Receiver) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskReceiver) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.Amount) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskAmount) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) == 0) && (len((*z).encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0) && (len((*z).encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.XferAsset) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetAmount) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetSender) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) == 0) && (len((*z).encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0) && (len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) == 0) && (len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0) && (len((*z).encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) == 0) && (len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0) && (len((*z).encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationID) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.OnCompletion) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.Accounts) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) == 0) && (len((*z).encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.CertRound) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.CertType) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.BitmaskCertType) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) == 0) && (len((*z).encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedTxnHeaders) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0005Len := uint32(16) - var zb0005Mask uint32 /* 17 bits */ - if len((*z).Fee) == 0 { - zb0005Len-- - zb0005Mask |= 0x2 - } - if len((*z).BitmaskFee) == 0 { - zb0005Len-- - zb0005Mask |= 0x4 - } - if len((*z).FirstValid) == 0 { - zb0005Len-- - zb0005Mask |= 0x8 - } - if len((*z).BitmaskFirstValid) == 0 { - zb0005Len-- - zb0005Mask |= 0x10 - } - if len((*z).BitmaskGenesisID) == 0 { - zb0005Len-- - zb0005Mask |= 0x20 - } - if len((*z).BitmaskGroup) == 0 { - zb0005Len-- - zb0005Mask |= 0x40 - } - if len((*z).LastValid) == 0 { - zb0005Len-- - zb0005Mask |= 0x80 - } - if len((*z).BitmaskLastValid) == 0 { - zb0005Len-- - zb0005Mask |= 0x100 - } - if len((*z).Lease) == 0 { - zb0005Len-- - zb0005Mask |= 0x200 - } - if len((*z).BitmaskLease) == 0 { - zb0005Len-- - zb0005Mask |= 0x400 - } - if len((*z).Note) == 0 { - zb0005Len-- - zb0005Mask |= 0x800 - } - if len((*z).BitmaskNote) == 0 { - zb0005Len-- - zb0005Mask |= 0x1000 - } - if len((*z).RekeyTo) == 0 { - zb0005Len-- - zb0005Mask |= 0x2000 - } - if len((*z).BitmaskRekeyTo) == 0 { - zb0005Len-- - zb0005Mask |= 0x4000 - } - if len((*z).Sender) == 0 { - zb0005Len-- - zb0005Mask |= 0x8000 - } - if len((*z).BitmaskSender) == 0 { - zb0005Len-- - zb0005Mask |= 0x10000 - } - // variable map header, size zb0005Len - o = msgp.AppendMapHeader(o, zb0005Len) - if zb0005Len != 0 { - if (zb0005Mask & 0x2) == 0 { // if not empty - // string "fee" - o = append(o, 0xa3, 0x66, 0x65, 0x65) - if (*z).Fee == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Fee))) - } - for zb0001 := range (*z).Fee { - o = (*z).Fee[zb0001].MarshalMsg(o) - } - } - if (zb0005Mask & 0x4) == 0 { // if not empty - // string "feebm" - o = append(o, 0xa5, 0x66, 0x65, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskFee)) - } - if (zb0005Mask & 0x8) == 0 { // if not empty - // string "fv" - o = append(o, 0xa2, 0x66, 0x76) - if (*z).FirstValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).FirstValid))) - } - for zb0002 := range (*z).FirstValid { - o = (*z).FirstValid[zb0002].MarshalMsg(o) - } - } - if (zb0005Mask & 0x10) == 0 { // if not empty - // string "fvbm" - o = append(o, 0xa4, 0x66, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskFirstValid)) - } - if (zb0005Mask & 0x20) == 0 { // if not empty - // string "genbm" - o = append(o, 0xa5, 0x67, 0x65, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskGenesisID)) - } - if (zb0005Mask & 0x40) == 0 { // if not empty - // string "grpbm" - o = append(o, 0xa5, 0x67, 0x72, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskGroup)) - } - if (zb0005Mask & 0x80) == 0 { // if not empty - // string "lv" - o = append(o, 0xa2, 0x6c, 0x76) - if (*z).LastValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).LastValid))) - } - for zb0003 := range (*z).LastValid { - o = (*z).LastValid[zb0003].MarshalMsg(o) - } - } - if (zb0005Mask & 0x100) == 0 { // if not empty - // string "lvbm" - o = append(o, 0xa4, 0x6c, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLastValid)) - } - if (zb0005Mask & 0x200) == 0 { // if not empty - // string "lx" - o = append(o, 0xa2, 0x6c, 0x78) - o = msgp.AppendBytes(o, (*z).Lease) - } - if (zb0005Mask & 0x400) == 0 { // if not empty - // string "lxbm" - o = append(o, 0xa4, 0x6c, 0x78, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskLease)) - } - if (zb0005Mask & 0x800) == 0 { // if not empty - // string "note" - o = append(o, 0xa4, 0x6e, 0x6f, 0x74, 0x65) - if (*z).Note == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).Note))) - } - for zb0004 := range (*z).Note { - o = msgp.AppendBytes(o, (*z).Note[zb0004]) - } - } - if (zb0005Mask & 0x1000) == 0 { // if not empty - // string "notebm" - o = append(o, 0xa6, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskNote)) - } - if (zb0005Mask & 0x2000) == 0 { // if not empty - // string "rekey" - o = append(o, 0xa5, 0x72, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).RekeyTo) - } - if (zb0005Mask & 0x4000) == 0 { // if not empty - // string "rekeybm" - o = append(o, 0xa7, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskRekeyTo)) - } - if (zb0005Mask & 0x8000) == 0 { // if not empty - // string "snd" - o = append(o, 0xa3, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).Sender) - } - if (zb0005Mask & 0x10000) == 0 { // if not empty - // string "sndbm" - o = append(o, 0xa5, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskSender)) - } - } - return -} - -func (_ *encodedTxnHeaders) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedTxnHeaders) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedTxnHeaders) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0005 int - var zb0006 bool - zb0005, zb0006, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0005 > 0 { - zb0005-- - var zb0007 int - zb0007, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - if zb0007 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxAddressBytes)) - return - } - (*z).Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).Sender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0008 []byte - var zb0009 int - zb0009, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - if zb0009 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0009), uint64(maxBitmaskSize)) - return - } - zb0008, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - (*z).BitmaskSender = bitmask(zb0008) - } - } - if zb0005 > 0 { - zb0005-- - var zb0010 int - var zb0011 bool - zb0010, zb0011, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0010 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0010), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0011 { - (*z).Fee = nil - } else if (*z).Fee != nil && cap((*z).Fee) >= zb0010 { - (*z).Fee = ((*z).Fee)[:zb0010] - } else { - (*z).Fee = make([]basics.MicroAlgos, zb0010) - } - for zb0001 := range (*z).Fee { - bts, err = (*z).Fee[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee", zb0001) - return - } - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0012 []byte - var zb0013 int - zb0013, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - if zb0013 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxBitmaskSize)) - return - } - zb0012, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - (*z).BitmaskFee = bitmask(zb0012) - } - } - if zb0005 > 0 { - zb0005-- - var zb0014 int - var zb0015 bool - zb0014, zb0015, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0014 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0014), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0015 { - (*z).FirstValid = nil - } else if (*z).FirstValid != nil && cap((*z).FirstValid) >= zb0014 { - (*z).FirstValid = ((*z).FirstValid)[:zb0014] - } else { - (*z).FirstValid = make([]basics.Round, zb0014) - } - for zb0002 := range (*z).FirstValid { - bts, err = (*z).FirstValid[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid", zb0002) - return - } - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0016 []byte - var zb0017 int - zb0017, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - if zb0017 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxBitmaskSize)) - return - } - zb0016, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - (*z).BitmaskFirstValid = bitmask(zb0016) - } - } - if zb0005 > 0 { - zb0005-- - var zb0018 int - var zb0019 bool - zb0018, zb0019, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0018 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0018), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0019 { - (*z).LastValid = nil - } else if (*z).LastValid != nil && cap((*z).LastValid) >= zb0018 { - (*z).LastValid = ((*z).LastValid)[:zb0018] - } else { - (*z).LastValid = make([]basics.Round, zb0018) - } - for zb0003 := range (*z).LastValid { - bts, err = (*z).LastValid[zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid", zb0003) - return - } - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0020 []byte - var zb0021 int - zb0021, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - if zb0021 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0021), uint64(maxBitmaskSize)) - return - } - zb0020, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - (*z).BitmaskLastValid = bitmask(zb0020) - } - } - if zb0005 > 0 { - zb0005-- - var zb0022 int - var zb0023 bool - zb0022, zb0023, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0022 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0022), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0023 { - (*z).Note = nil - } else if (*z).Note != nil && cap((*z).Note) >= zb0022 { - (*z).Note = ((*z).Note)[:zb0022] - } else { - (*z).Note = make([][]byte, zb0022) - } - for zb0004 := range (*z).Note { - var zb0024 int - zb0024, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0004) - return - } - if zb0024 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0024), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).Note[zb0004], bts, err = msgp.ReadBytesBytes(bts, (*z).Note[zb0004]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0004) - return - } - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0025 []byte - var zb0026 int - zb0026, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - if zb0026 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0026), uint64(maxBitmaskSize)) - return - } - zb0025, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - (*z).BitmaskNote = bitmask(zb0025) - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0027 []byte - var zb0028 int - zb0028, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - if zb0028 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0028), uint64(maxBitmaskSize)) - return - } - zb0027, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - (*z).BitmaskGenesisID = bitmask(zb0027) - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0029 []byte - var zb0030 int - zb0030, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - if zb0030 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0030), uint64(maxBitmaskSize)) - return - } - zb0029, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - (*z).BitmaskGroup = bitmask(zb0029) - } - } - if zb0005 > 0 { - zb0005-- - var zb0031 int - zb0031, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - if zb0031 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0031), uint64(maxAddressBytes)) - return - } - (*z).Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).Lease) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0032 []byte - var zb0033 int - zb0033, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - if zb0033 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0033), uint64(maxBitmaskSize)) - return - } - zb0032, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - (*z).BitmaskLease = bitmask(zb0032) - } - } - if zb0005 > 0 { - zb0005-- - var zb0034 int - zb0034, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - if zb0034 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0034), uint64(maxAddressBytes)) - return - } - (*z).RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).RekeyTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - } - if zb0005 > 0 { - zb0005-- - { - var zb0035 []byte - var zb0036 int - zb0036, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - if zb0036 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0036), uint64(maxBitmaskSize)) - return - } - zb0035, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - (*z).BitmaskRekeyTo = bitmask(zb0035) - } - } - if zb0005 > 0 { - err = msgp.ErrTooManyArrayFields(zb0005) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0006 { - (*z) = encodedTxnHeaders{} - } - for zb0005 > 0 { - zb0005-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "snd": - var zb0037 int - zb0037, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - if zb0037 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0037), uint64(maxAddressBytes)) - return - } - (*z).Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).Sender) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - case "sndbm": - { - var zb0038 []byte - var zb0039 int - zb0039, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - if zb0039 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0039), uint64(maxBitmaskSize)) - return - } - zb0038, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - (*z).BitmaskSender = bitmask(zb0038) - } - case "fee": - var zb0040 int - var zb0041 bool - zb0040, zb0041, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Fee") - return - } - if zb0040 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0040), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Fee") - return - } - if zb0041 { - (*z).Fee = nil - } else if (*z).Fee != nil && cap((*z).Fee) >= zb0040 { - (*z).Fee = ((*z).Fee)[:zb0040] - } else { - (*z).Fee = make([]basics.MicroAlgos, zb0040) - } - for zb0001 := range (*z).Fee { - bts, err = (*z).Fee[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Fee", zb0001) - return - } - } - case "feebm": - { - var zb0042 []byte - var zb0043 int - zb0043, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - if zb0043 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0043), uint64(maxBitmaskSize)) - return - } - zb0042, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - (*z).BitmaskFee = bitmask(zb0042) - } - case "fv": - var zb0044 int - var zb0045 bool - zb0044, zb0045, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0044 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0044), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0045 { - (*z).FirstValid = nil - } else if (*z).FirstValid != nil && cap((*z).FirstValid) >= zb0044 { - (*z).FirstValid = ((*z).FirstValid)[:zb0044] - } else { - (*z).FirstValid = make([]basics.Round, zb0044) - } - for zb0002 := range (*z).FirstValid { - bts, err = (*z).FirstValid[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid", zb0002) - return - } - } - case "fvbm": - { - var zb0046 []byte - var zb0047 int - zb0047, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - if zb0047 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0047), uint64(maxBitmaskSize)) - return - } - zb0046, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - (*z).BitmaskFirstValid = bitmask(zb0046) - } - case "lv": - var zb0048 int - var zb0049 bool - zb0048, zb0049, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid") - return - } - if zb0048 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0048), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LastValid") - return - } - if zb0049 { - (*z).LastValid = nil - } else if (*z).LastValid != nil && cap((*z).LastValid) >= zb0048 { - (*z).LastValid = ((*z).LastValid)[:zb0048] - } else { - (*z).LastValid = make([]basics.Round, zb0048) - } - for zb0003 := range (*z).LastValid { - bts, err = (*z).LastValid[zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid", zb0003) - return - } - } - case "lvbm": - { - var zb0050 []byte - var zb0051 int - zb0051, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - if zb0051 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0051), uint64(maxBitmaskSize)) - return - } - zb0050, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - (*z).BitmaskLastValid = bitmask(zb0050) - } - case "note": - var zb0052 int - var zb0053 bool - zb0052, zb0053, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Note") - return - } - if zb0052 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0052), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Note") - return - } - if zb0053 { - (*z).Note = nil - } else if (*z).Note != nil && cap((*z).Note) >= zb0052 { - (*z).Note = ((*z).Note)[:zb0052] - } else { - (*z).Note = make([][]byte, zb0052) - } - for zb0004 := range (*z).Note { - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Note", zb0004) - return - } - if zb0054 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0054), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).Note[zb0004], bts, err = msgp.ReadBytesBytes(bts, (*z).Note[zb0004]) - if err != nil { - err = msgp.WrapError(err, "Note", zb0004) - return - } - } - case "notebm": - { - var zb0055 []byte - var zb0056 int - zb0056, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - if zb0056 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0056), uint64(maxBitmaskSize)) - return - } - zb0055, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - (*z).BitmaskNote = bitmask(zb0055) - } - case "genbm": - { - var zb0057 []byte - var zb0058 int - zb0058, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - if zb0058 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0058), uint64(maxBitmaskSize)) - return - } - zb0057, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - (*z).BitmaskGenesisID = bitmask(zb0057) - } - case "grpbm": - { - var zb0059 []byte - var zb0060 int - zb0060, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - if zb0060 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxBitmaskSize)) - return - } - zb0059, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - (*z).BitmaskGroup = bitmask(zb0059) - } - case "lx": - var zb0061 int - zb0061, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - if zb0061 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0061), uint64(maxAddressBytes)) - return - } - (*z).Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).Lease) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - case "lxbm": - { - var zb0062 []byte - var zb0063 int - zb0063, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - if zb0063 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0063), uint64(maxBitmaskSize)) - return - } - zb0062, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - (*z).BitmaskLease = bitmask(zb0062) - } - case "rekey": - var zb0064 int - zb0064, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - if zb0064 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0064), uint64(maxAddressBytes)) - return - } - (*z).RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).RekeyTo) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - case "rekeybm": - { - var zb0065 []byte - var zb0066 int - zb0066, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - if zb0066 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxBitmaskSize)) - return - } - zb0065, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - (*z).BitmaskRekeyTo = bitmask(zb0065) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedTxnHeaders) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedTxnHeaders) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedTxnHeaders) Msgsize() (s int) { - s = 3 + 4 + msgp.BytesPrefixSize + len((*z).Sender) + 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskSender)) + 4 + msgp.ArrayHeaderSize - for zb0001 := range (*z).Fee { - s += (*z).Fee[zb0001].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskFee)) + 3 + msgp.ArrayHeaderSize - for zb0002 := range (*z).FirstValid { - s += (*z).FirstValid[zb0002].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskFirstValid)) + 3 + msgp.ArrayHeaderSize - for zb0003 := range (*z).LastValid { - s += (*z).LastValid[zb0003].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLastValid)) + 5 + msgp.ArrayHeaderSize - for zb0004 := range (*z).Note { - s += msgp.BytesPrefixSize + len((*z).Note[zb0004]) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskNote)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskGenesisID)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskGroup)) + 3 + msgp.BytesPrefixSize + len((*z).Lease) + 5 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskLease)) + 6 + msgp.BytesPrefixSize + len((*z).RekeyTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskRekeyTo)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedTxnHeaders) MsgIsZero() bool { - return (len((*z).Sender) == 0) && (len((*z).BitmaskSender) == 0) && (len((*z).Fee) == 0) && (len((*z).BitmaskFee) == 0) && (len((*z).FirstValid) == 0) && (len((*z).BitmaskFirstValid) == 0) && (len((*z).LastValid) == 0) && (len((*z).BitmaskLastValid) == 0) && (len((*z).Note) == 0) && (len((*z).BitmaskNote) == 0) && (len((*z).BitmaskGenesisID) == 0) && (len((*z).BitmaskGroup) == 0) && (len((*z).Lease) == 0) && (len((*z).BitmaskLease) == 0) && (len((*z).RekeyTo) == 0) && (len((*z).BitmaskRekeyTo) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *encodedTxns) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0044Len := uint32(112) - var zb0044Mask [2]uint64 /* 123 bits */ - if len((*z).encodedAssetTransferTxnFields.AssetAmount) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x800 - } - if len((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x1000 - } - if len((*z).encodedAssetTransferTxnFields.AssetCloseTo) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x2000 - } - if len((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x4000 - } - if len((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x8000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x10000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x20000 - } - if len((*z).encodedPaymentTxnFields.Amount) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x40000 - } - if len((*z).encodedPaymentTxnFields.BitmaskAmount) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x80000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x100000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x200000 - } - if len((*z).encodedApplicationCallTxnFields.ApplicationArgs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x400000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x800000 - } - if len((*z).encodedApplicationCallTxnFields.OnCompletion) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x1000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x2000000 - } - if len((*z).encodedApplicationCallTxnFields.ApprovalProgram) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x4000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x8000000 - } - if len((*z).encodedApplicationCallTxnFields.ForeignAssets) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x10000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x20000000 - } - if len((*z).encodedApplicationCallTxnFields.Accounts) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x40000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskAccounts) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x80000000 - } - if len((*z).encodedApplicationCallTxnFields.ExtraProgramPages) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x100000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x200000000 - } - if len((*z).encodedApplicationCallTxnFields.ForeignApps) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x400000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskForeignApps) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x800000000 - } - if len((*z).encodedApplicationCallTxnFields.ApplicationID) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x1000000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskApplicationID) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x2000000000 - } - if len((*z).encodedApplicationCallTxnFields.ClearStateProgram) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x4000000000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x8000000000 - } - if len((*z).encodedAssetTransferTxnFields.AssetReceiver) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x10000000000 - } - if len((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x20000000000 - } - if len((*z).encodedAssetTransferTxnFields.AssetSender) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x40000000000 - } - if len((*z).encodedAssetTransferTxnFields.BitmaskAssetSender) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x80000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x100000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x200000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x400000000000 - } - if len((*z).encodedAssetConfigTxnFields.ConfigAsset) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x800000000000 - } - if len((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x1000000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x2000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.PartProofs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x4000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x8000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.SigProofs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x10000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x20000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.SigCommit) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x40000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x80000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.Reveals) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x100000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x200000000000000 - } - if len((*z).encodedCompactCertTxnFields.CertRound) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x400000000000000 - } - if len((*z).encodedCompactCertTxnFields.BitmaskCertRound) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x800000000000000 - } - if len((*z).encodedCompactCertTxnFields.CertType) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x1000000000000000 - } - if len((*z).encodedCompactCertTxnFields.BitmaskCertType) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x2000000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x4000000000000000 - } - if len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0 { - zb0044Len-- - zb0044Mask[0] |= 0x8000000000000000 - } - if len((*z).encodedPaymentTxnFields.CloseRemainderTo) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x1 - } - if len((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x2 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x4 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x8 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x10 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x20 - } - if len((*z).encodedAssetFreezeTxnFields.FreezeAccount) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x40 - } - if len((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x80 - } - if len((*z).encodedAssetFreezeTxnFields.FreezeAsset) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x100 - } - if len((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x200 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x400 - } - if len((*z).encodedTxnHeaders.Fee) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x800 - } - if len((*z).encodedTxnHeaders.BitmaskFee) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x1000 - } - if len((*z).encodedTxnHeaders.FirstValid) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x2000 - } - if len((*z).encodedTxnHeaders.BitmaskFirstValid) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x4000 - } - if len((*z).encodedTxnHeaders.BitmaskGenesisID) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x8000 - } - if len((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x10000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x20000 - } - if len((*z).encodedApplicationCallTxnFields.GlobalNumUint) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x40000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x80000 - } - if len((*z).encodedTxnHeaders.BitmaskGroup) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x100000 - } - if len((*z).encodedApplicationCallTxnFields.LocalNumByteSlice) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x200000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x400000 - } - if len((*z).encodedApplicationCallTxnFields.LocalNumUint) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x800000 - } - if len((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x1000000 - } - if len((*z).encodedTxnHeaders.LastValid) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x2000000 - } - if len((*z).encodedTxnHeaders.BitmaskLastValid) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x4000000 - } - if len((*z).encodedTxnHeaders.Lease) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x8000000 - } - if len((*z).encodedTxnHeaders.BitmaskLease) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x10000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x20000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x40000000 - } - if len((*z).encodedKeyregTxnFields.BitmaskNonparticipation) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x80000000 - } - if len((*z).encodedTxnHeaders.Note) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x100000000 - } - if len((*z).encodedTxnHeaders.BitmaskNote) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x200000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x400000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x800000000 - } - if len((*z).encodedPaymentTxnFields.Receiver) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x1000000000 - } - if len((*z).encodedPaymentTxnFields.BitmaskReceiver) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x2000000000 - } - if len((*z).encodedTxnHeaders.RekeyTo) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x4000000000 - } - if len((*z).encodedTxnHeaders.BitmaskRekeyTo) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x8000000000 - } - if len((*z).encodedKeyregTxnFields.SelectionPK) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x10000000000 - } - if len((*z).encodedTxnHeaders.Sender) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x20000000000 - } - if len((*z).encodedTxnHeaders.BitmaskSender) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x40000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x80000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x100000000000 - } - if len((*z).TxType) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x200000000000 - } - if len((*z).BitmaskTxType) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x400000000000 - } - if (*z).TxTypeOffset == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x800000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x1000000000000 - } - if len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x2000000000000 - } - if len((*z).encodedKeyregTxnFields.VoteFirst) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x4000000000000 - } - if len((*z).encodedKeyregTxnFields.BitmaskVoteFirst) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x8000000000000 - } - if len((*z).encodedKeyregTxnFields.BitmaskKeys) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x10000000000000 - } - if len((*z).encodedKeyregTxnFields.VoteKeyDilution) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x20000000000000 - } - if len((*z).encodedKeyregTxnFields.VotePK) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x40000000000000 - } - if len((*z).encodedKeyregTxnFields.VoteLast) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x80000000000000 - } - if len((*z).encodedKeyregTxnFields.BitmaskVoteLast) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x100000000000000 - } - if len((*z).encodedAssetTransferTxnFields.XferAsset) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x200000000000000 - } - if len((*z).encodedAssetTransferTxnFields.BitmaskXferAsset) == 0 { - zb0044Len-- - zb0044Mask[1] |= 0x400000000000000 - } - // variable map header, size zb0044Len - o = msgp.AppendMapHeader(o, zb0044Len) - if zb0044Len != 0 { - if (zb0044Mask[0] & 0x800) == 0 { // if not empty - // string "aamt" - o = append(o, 0xa4, 0x61, 0x61, 0x6d, 0x74) - if (*z).encodedAssetTransferTxnFields.AssetAmount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetTransferTxnFields.AssetAmount))) - } - for zb0016 := range (*z).encodedAssetTransferTxnFields.AssetAmount { - o = msgp.AppendUint64(o, (*z).encodedAssetTransferTxnFields.AssetAmount[zb0016]) - } - } - if (zb0044Mask[0] & 0x1000) == 0 { // if not empty - // string "aamtbm" - o = append(o, 0xa6, 0x61, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount)) - } - if (zb0044Mask[0] & 0x2000) == 0 { // if not empty - // string "aclose" - o = append(o, 0xa6, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedAssetTransferTxnFields.AssetCloseTo) - } - if (zb0044Mask[0] & 0x4000) == 0 { // if not empty - // string "aclosebm" - o = append(o, 0xa8, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - } - if (zb0044Mask[0] & 0x8000) == 0 { // if not empty - // string "afrzbm" - o = append(o, 0xa6, 0x61, 0x66, 0x72, 0x7a, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - } - if (zb0044Mask[0] & 0x10000) == 0 { // if not empty - // string "am" - o = append(o, 0xa2, 0x61, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - } - if (zb0044Mask[0] & 0x20000) == 0 { // if not empty - // string "ambm" - o = append(o, 0xa4, 0x61, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - } - if (zb0044Mask[0] & 0x40000) == 0 { // if not empty - // string "amt" - o = append(o, 0xa3, 0x61, 0x6d, 0x74) - if (*z).encodedPaymentTxnFields.Amount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedPaymentTxnFields.Amount))) - } - for zb0008 := range (*z).encodedPaymentTxnFields.Amount { - o = (*z).encodedPaymentTxnFields.Amount[zb0008].MarshalMsg(o) - } - } - if (zb0044Mask[0] & 0x80000) == 0 { // if not empty - // string "amtbm" - o = append(o, 0xa5, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedPaymentTxnFields.BitmaskAmount)) - } - if (zb0044Mask[0] & 0x100000) == 0 { // if not empty - // string "an" - o = append(o, 0xa2, 0x61, 0x6e) - if (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName))) - } - for zb0013 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - o = msgp.AppendString(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0013]) - } - } - if (zb0044Mask[0] & 0x200000) == 0 { // if not empty - // string "anbm" - o = append(o, 0xa4, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - } - if (zb0044Mask[0] & 0x400000) == 0 { // if not empty - // string "apaa" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x61) - if (*z).encodedApplicationCallTxnFields.ApplicationArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ApplicationArgs))) - } - for zb0019 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs { - if (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019]))) - } - for zb0020 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] { - o = msgp.AppendBytes(o, (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020]) - } - } - } - if (zb0044Mask[0] & 0x800000) == 0 { // if not empty - // string "apaabm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - } - if (zb0044Mask[0] & 0x1000000) == 0 { // if not empty - // string "apan" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x6e) - o = msgp.AppendBytes(o, (*z).encodedApplicationCallTxnFields.OnCompletion) - } - if (zb0044Mask[0] & 0x2000000) == 0 { // if not empty - // string "apanbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion)) - } - if (zb0044Mask[0] & 0x4000000) == 0 { // if not empty - // string "apap" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x70) - if (*z).encodedApplicationCallTxnFields.ApprovalProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ApprovalProgram))) - } - for zb0031 := range (*z).encodedApplicationCallTxnFields.ApprovalProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031])) - } - } - if (zb0044Mask[0] & 0x8000000) == 0 { // if not empty - // string "apapbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - } - if (zb0044Mask[0] & 0x10000000) == 0 { // if not empty - // string "apas" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x73) - if (*z).encodedApplicationCallTxnFields.ForeignAssets == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ForeignAssets))) - } - for zb0025 := range (*z).encodedApplicationCallTxnFields.ForeignAssets { - if (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025]))) - } - for zb0026 := range (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] { - o = (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025][zb0026].MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x20000000) == 0 { // if not empty - // string "apasbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets)) - } - if (zb0044Mask[0] & 0x40000000) == 0 { // if not empty - // string "apat" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x74) - if (*z).encodedApplicationCallTxnFields.Accounts == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.Accounts))) - } - for zb0021 := range (*z).encodedApplicationCallTxnFields.Accounts { - if (*z).encodedApplicationCallTxnFields.Accounts[zb0021] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.Accounts[zb0021]))) - } - for zb0022 := range (*z).encodedApplicationCallTxnFields.Accounts[zb0021] { - o = (*z).encodedApplicationCallTxnFields.Accounts[zb0021][zb0022].MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x80000000) == 0 { // if not empty - // string "apatbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskAccounts)) - } - if (zb0044Mask[0] & 0x100000000) == 0 { // if not empty - // string "apep" - o = append(o, 0xa4, 0x61, 0x70, 0x65, 0x70) - if (*z).encodedApplicationCallTxnFields.ExtraProgramPages == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ExtraProgramPages))) - } - for zb0033 := range (*z).encodedApplicationCallTxnFields.ExtraProgramPages { - o = msgp.AppendUint32(o, (*z).encodedApplicationCallTxnFields.ExtraProgramPages[zb0033]) - } - } - if (zb0044Mask[0] & 0x200000000) == 0 { // if not empty - // string "apepbm" - o = append(o, 0xa6, 0x61, 0x70, 0x65, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - } - if (zb0044Mask[0] & 0x400000000) == 0 { // if not empty - // string "apfa" - o = append(o, 0xa4, 0x61, 0x70, 0x66, 0x61) - if (*z).encodedApplicationCallTxnFields.ForeignApps == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ForeignApps))) - } - for zb0023 := range (*z).encodedApplicationCallTxnFields.ForeignApps { - if (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ForeignApps[zb0023]))) - } - for zb0024 := range (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] { - o = (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023][zb0024].MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x800000000) == 0 { // if not empty - // string "apfabm" - o = append(o, 0xa6, 0x61, 0x70, 0x66, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignApps)) - } - if (zb0044Mask[0] & 0x1000000000) == 0 { // if not empty - // string "apid" - o = append(o, 0xa4, 0x61, 0x70, 0x69, 0x64) - if (*z).encodedApplicationCallTxnFields.ApplicationID == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ApplicationID))) - } - for zb0018 := range (*z).encodedApplicationCallTxnFields.ApplicationID { - o = (*z).encodedApplicationCallTxnFields.ApplicationID[zb0018].MarshalMsg(o) - } - } - if (zb0044Mask[0] & 0x2000000000) == 0 { // if not empty - // string "apidbm" - o = append(o, 0xa6, 0x61, 0x70, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationID)) - } - if (zb0044Mask[0] & 0x4000000000) == 0 { // if not empty - // string "apsu" - o = append(o, 0xa4, 0x61, 0x70, 0x73, 0x75) - if (*z).encodedApplicationCallTxnFields.ClearStateProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.ClearStateProgram))) - } - for zb0032 := range (*z).encodedApplicationCallTxnFields.ClearStateProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032])) - } - } - if (zb0044Mask[0] & 0x8000000000) == 0 { // if not empty - // string "apsubm" - o = append(o, 0xa6, 0x61, 0x70, 0x73, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - } - if (zb0044Mask[0] & 0x10000000000) == 0 { // if not empty - // string "arcv" - o = append(o, 0xa4, 0x61, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedAssetTransferTxnFields.AssetReceiver) - } - if (zb0044Mask[0] & 0x20000000000) == 0 { // if not empty - // string "arcvbm" - o = append(o, 0xa6, 0x61, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - } - if (zb0044Mask[0] & 0x40000000000) == 0 { // if not empty - // string "asnd" - o = append(o, 0xa4, 0x61, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedAssetTransferTxnFields.AssetSender) - } - if (zb0044Mask[0] & 0x80000000000) == 0 { // if not empty - // string "asndbm" - o = append(o, 0xa6, 0x61, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetSender)) - } - if (zb0044Mask[0] & 0x100000000000) == 0 { // if not empty - // string "au" - o = append(o, 0xa2, 0x61, 0x75) - if (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL))) - } - for zb0014 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL { - o = msgp.AppendString(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0014]) - } - } - if (zb0044Mask[0] & 0x200000000000) == 0 { // if not empty - // string "aubm" - o = append(o, 0xa4, 0x61, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - } - if (zb0044Mask[0] & 0x400000000000) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendBytes(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - } - if (zb0044Mask[0] & 0x800000000000) == 0 { // if not empty - // string "caid" - o = append(o, 0xa4, 0x63, 0x61, 0x69, 0x64) - if (*z).encodedAssetConfigTxnFields.ConfigAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.ConfigAsset))) - } - for zb0009 := range (*z).encodedAssetConfigTxnFields.ConfigAsset { - o = (*z).encodedAssetConfigTxnFields.ConfigAsset[zb0009].MarshalMsg(o) - } - } - if (zb0044Mask[0] & 0x1000000000000) == 0 { // if not empty - // string "caidbm" - o = append(o, 0xa6, 0x63, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset)) - } - if (zb0044Mask[0] & 0x2000000000000) == 0 { // if not empty - // string "cbm" - o = append(o, 0xa3, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - } - if (zb0044Mask[0] & 0x4000000000000) == 0 { // if not empty - // string "certP" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x50) - if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.PartProofs))) - } - for zb0039 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs { - if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039]))) - } - for zb0040 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] { - o = (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039][zb0040].MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x8000000000000) == 0 { // if not empty - // string "certPbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x50, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - } - if (zb0044Mask[0] & 0x10000000000000) == 0 { // if not empty - // string "certS" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x53) - if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.SigProofs))) - } - for zb0037 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs { - if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037]))) - } - for zb0038 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] { - o = (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037][zb0038].MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x20000000000000) == 0 { // if not empty - // string "certSbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x53, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - } - if (zb0044Mask[0] & 0x40000000000000) == 0 { // if not empty - // string "certc" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x63) - o = msgp.AppendBytes(o, (*z).encodedCompactCertTxnFields.encodedCert.SigCommit) - } - if (zb0044Mask[0] & 0x80000000000000) == 0 { // if not empty - // string "certcbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - } - if (zb0044Mask[0] & 0x100000000000000) == 0 { // if not empty - // string "certr" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x72) - if (*z).encodedCompactCertTxnFields.encodedCert.Reveals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.Reveals))) - } - for zb0041 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals { - if (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041]))) - } - zb0042_keys := make([]uint64, 0, len((*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041])) - for zb0042 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] { - zb0042_keys = append(zb0042_keys, zb0042) - } - sort.Sort(SortUint64(zb0042_keys)) - for _, zb0042 := range zb0042_keys { - zb0043 := (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041][zb0042] - _ = zb0043 - o = msgp.AppendUint64(o, zb0042) - o = zb0043.MarshalMsg(o) - } - } - } - if (zb0044Mask[0] & 0x200000000000000) == 0 { // if not empty - // string "certrbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - } - if (zb0044Mask[0] & 0x400000000000000) == 0 { // if not empty - // string "certrnd" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64) - if (*z).encodedCompactCertTxnFields.CertRound == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.CertRound))) - } - for zb0034 := range (*z).encodedCompactCertTxnFields.CertRound { - o = (*z).encodedCompactCertTxnFields.CertRound[zb0034].MarshalMsg(o) - } - } - if (zb0044Mask[0] & 0x800000000000000) == 0 { // if not empty - // string "certrndbm" - o = append(o, 0xa9, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.BitmaskCertRound)) - } - if (zb0044Mask[0] & 0x1000000000000000) == 0 { // if not empty - // string "certtype" - o = append(o, 0xa8, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65) - if (*z).encodedCompactCertTxnFields.CertType == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.CertType))) - } - for zb0035 := range (*z).encodedCompactCertTxnFields.CertType { - o = (*z).encodedCompactCertTxnFields.CertType[zb0035].MarshalMsg(o) - } - } - if (zb0044Mask[0] & 0x2000000000000000) == 0 { // if not empty - // string "certtypebm" - o = append(o, 0xaa, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.BitmaskCertType)) - } - if (zb0044Mask[0] & 0x4000000000000000) == 0 { // if not empty - // string "certw" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x77) - if (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight))) - } - for zb0036 := range (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight { - o = msgp.AppendUint64(o, (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0036]) - } - } - if (zb0044Mask[0] & 0x8000000000000000) == 0 { // if not empty - // string "certwbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x77, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - } - if (zb0044Mask[1] & 0x1) == 0 { // if not empty - // string "close" - o = append(o, 0xa5, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedPaymentTxnFields.CloseRemainderTo) - } - if (zb0044Mask[1] & 0x2) == 0 { // if not empty - // string "closebm" - o = append(o, 0xa7, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - } - if (zb0044Mask[1] & 0x4) == 0 { // if not empty - // string "dc" - o = append(o, 0xa2, 0x64, 0x63) - if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals))) - } - for zb0011 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - o = msgp.AppendUint32(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0011]) - } - } - if (zb0044Mask[1] & 0x8) == 0 { // if not empty - // string "dcbm" - o = append(o, 0xa4, 0x64, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - } - if (zb0044Mask[1] & 0x10) == 0 { // if not empty - // string "dfbm" - o = append(o, 0xa4, 0x64, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - } - if (zb0044Mask[1] & 0x20) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - } - if (zb0044Mask[1] & 0x40) == 0 { // if not empty - // string "fadd" - o = append(o, 0xa4, 0x66, 0x61, 0x64, 0x64) - o = msgp.AppendBytes(o, (*z).encodedAssetFreezeTxnFields.FreezeAccount) - } - if (zb0044Mask[1] & 0x80) == 0 { // if not empty - // string "faddbm" - o = append(o, 0xa6, 0x66, 0x61, 0x64, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - } - if (zb0044Mask[1] & 0x100) == 0 { // if not empty - // string "faid" - o = append(o, 0xa4, 0x66, 0x61, 0x69, 0x64) - if (*z).encodedAssetFreezeTxnFields.FreezeAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetFreezeTxnFields.FreezeAsset))) - } - for zb0017 := range (*z).encodedAssetFreezeTxnFields.FreezeAsset { - o = (*z).encodedAssetFreezeTxnFields.FreezeAsset[zb0017].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x200) == 0 { // if not empty - // string "faidbm" - o = append(o, 0xa6, 0x66, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - } - if (zb0044Mask[1] & 0x400) == 0 { // if not empty - // string "fbm" - o = append(o, 0xa3, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - } - if (zb0044Mask[1] & 0x800) == 0 { // if not empty - // string "fee" - o = append(o, 0xa3, 0x66, 0x65, 0x65) - if (*z).encodedTxnHeaders.Fee == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxnHeaders.Fee))) - } - for zb0001 := range (*z).encodedTxnHeaders.Fee { - o = (*z).encodedTxnHeaders.Fee[zb0001].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x1000) == 0 { // if not empty - // string "feebm" - o = append(o, 0xa5, 0x66, 0x65, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskFee)) - } - if (zb0044Mask[1] & 0x2000) == 0 { // if not empty - // string "fv" - o = append(o, 0xa2, 0x66, 0x76) - if (*z).encodedTxnHeaders.FirstValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxnHeaders.FirstValid))) - } - for zb0002 := range (*z).encodedTxnHeaders.FirstValid { - o = (*z).encodedTxnHeaders.FirstValid[zb0002].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x4000) == 0 { // if not empty - // string "fvbm" - o = append(o, 0xa4, 0x66, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskFirstValid)) - } - if (zb0044Mask[1] & 0x8000) == 0 { // if not empty - // string "genbm" - o = append(o, 0xa5, 0x67, 0x65, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskGenesisID)) - } - if (zb0044Mask[1] & 0x10000) == 0 { // if not empty - // string "gnbs" - o = append(o, 0xa4, 0x67, 0x6e, 0x62, 0x73) - if (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice))) - } - for zb0030 := range (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0030]) - } - } - if (zb0044Mask[1] & 0x20000) == 0 { // if not empty - // string "gnbsbm" - o = append(o, 0xa6, 0x67, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - } - if (zb0044Mask[1] & 0x40000) == 0 { // if not empty - // string "gnui" - o = append(o, 0xa4, 0x67, 0x6e, 0x75, 0x69) - if (*z).encodedApplicationCallTxnFields.GlobalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.GlobalNumUint))) - } - for zb0029 := range (*z).encodedApplicationCallTxnFields.GlobalNumUint { - o = msgp.AppendUint64(o, (*z).encodedApplicationCallTxnFields.GlobalNumUint[zb0029]) - } - } - if (zb0044Mask[1] & 0x80000) == 0 { // if not empty - // string "gnuibm" - o = append(o, 0xa6, 0x67, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - } - if (zb0044Mask[1] & 0x100000) == 0 { // if not empty - // string "grpbm" - o = append(o, 0xa5, 0x67, 0x72, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskGroup)) - } - if (zb0044Mask[1] & 0x200000) == 0 { // if not empty - // string "lnbs" - o = append(o, 0xa4, 0x6c, 0x6e, 0x62, 0x73) - if (*z).encodedApplicationCallTxnFields.LocalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.LocalNumByteSlice))) - } - for zb0028 := range (*z).encodedApplicationCallTxnFields.LocalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedApplicationCallTxnFields.LocalNumByteSlice[zb0028]) - } - } - if (zb0044Mask[1] & 0x400000) == 0 { // if not empty - // string "lnbsbm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - } - if (zb0044Mask[1] & 0x800000) == 0 { // if not empty - // string "lnui" - o = append(o, 0xa4, 0x6c, 0x6e, 0x75, 0x69) - if (*z).encodedApplicationCallTxnFields.LocalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedApplicationCallTxnFields.LocalNumUint))) - } - for zb0027 := range (*z).encodedApplicationCallTxnFields.LocalNumUint { - o = msgp.AppendUint64(o, (*z).encodedApplicationCallTxnFields.LocalNumUint[zb0027]) - } - } - if (zb0044Mask[1] & 0x1000000) == 0 { // if not empty - // string "lnuibm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - } - if (zb0044Mask[1] & 0x2000000) == 0 { // if not empty - // string "lv" - o = append(o, 0xa2, 0x6c, 0x76) - if (*z).encodedTxnHeaders.LastValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxnHeaders.LastValid))) - } - for zb0003 := range (*z).encodedTxnHeaders.LastValid { - o = (*z).encodedTxnHeaders.LastValid[zb0003].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x4000000) == 0 { // if not empty - // string "lvbm" - o = append(o, 0xa4, 0x6c, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskLastValid)) - } - if (zb0044Mask[1] & 0x8000000) == 0 { // if not empty - // string "lx" - o = append(o, 0xa2, 0x6c, 0x78) - o = msgp.AppendBytes(o, (*z).encodedTxnHeaders.Lease) - } - if (zb0044Mask[1] & 0x10000000) == 0 { // if not empty - // string "lxbm" - o = append(o, 0xa4, 0x6c, 0x78, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskLease)) - } - if (zb0044Mask[1] & 0x20000000) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) - } - if (zb0044Mask[1] & 0x40000000) == 0 { // if not empty - // string "mbm" - o = append(o, 0xa3, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - } - if (zb0044Mask[1] & 0x80000000) == 0 { // if not empty - // string "nonpartbm" - o = append(o, 0xa9, 0x6e, 0x6f, 0x6e, 0x70, 0x61, 0x72, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedKeyregTxnFields.BitmaskNonparticipation)) - } - if (zb0044Mask[1] & 0x100000000) == 0 { // if not empty - // string "note" - o = append(o, 0xa4, 0x6e, 0x6f, 0x74, 0x65) - if (*z).encodedTxnHeaders.Note == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedTxnHeaders.Note))) - } - for zb0004 := range (*z).encodedTxnHeaders.Note { - o = msgp.AppendBytes(o, (*z).encodedTxnHeaders.Note[zb0004]) - } - } - if (zb0044Mask[1] & 0x200000000) == 0 { // if not empty - // string "notebm" - o = append(o, 0xa6, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskNote)) - } - if (zb0044Mask[1] & 0x400000000) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendBytes(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - } - if (zb0044Mask[1] & 0x800000000) == 0 { // if not empty - // string "rbm" - o = append(o, 0xa3, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - } - if (zb0044Mask[1] & 0x1000000000) == 0 { // if not empty - // string "rcv" - o = append(o, 0xa3, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedPaymentTxnFields.Receiver) - } - if (zb0044Mask[1] & 0x2000000000) == 0 { // if not empty - // string "rcvbm" - o = append(o, 0xa5, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedPaymentTxnFields.BitmaskReceiver)) - } - if (zb0044Mask[1] & 0x4000000000) == 0 { // if not empty - // string "rekey" - o = append(o, 0xa5, 0x72, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedTxnHeaders.RekeyTo) - } - if (zb0044Mask[1] & 0x8000000000) == 0 { // if not empty - // string "rekeybm" - o = append(o, 0xa7, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskRekeyTo)) - } - if (zb0044Mask[1] & 0x10000000000) == 0 { // if not empty - // string "selkey" - o = append(o, 0xa6, 0x73, 0x65, 0x6c, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedKeyregTxnFields.SelectionPK) - } - if (zb0044Mask[1] & 0x20000000000) == 0 { // if not empty - // string "snd" - o = append(o, 0xa3, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedTxnHeaders.Sender) - } - if (zb0044Mask[1] & 0x40000000000) == 0 { // if not empty - // string "sndbm" - o = append(o, 0xa5, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedTxnHeaders.BitmaskSender)) - } - if (zb0044Mask[1] & 0x80000000000) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total))) - } - for zb0010 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total { - o = msgp.AppendUint64(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0010]) - } - } - if (zb0044Mask[1] & 0x100000000000) == 0 { // if not empty - // string "tbm" - o = append(o, 0xa3, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - } - if (zb0044Mask[1] & 0x200000000000) == 0 { // if not empty - // string "type" - o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) - o = msgp.AppendBytes(o, (*z).TxType) - } - if (zb0044Mask[1] & 0x400000000000) == 0 { // if not empty - // string "typebm" - o = append(o, 0xa6, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).BitmaskTxType)) - } - if (zb0044Mask[1] & 0x800000000000) == 0 { // if not empty - // string "typeo" - o = append(o, 0xa5, 0x74, 0x79, 0x70, 0x65, 0x6f) - o = msgp.AppendByte(o, (*z).TxTypeOffset) - } - if (zb0044Mask[1] & 0x1000000000000) == 0 { // if not empty - // string "un" - o = append(o, 0xa2, 0x75, 0x6e) - if (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName))) - } - for zb0012 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - o = msgp.AppendString(o, (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0012]) - } - } - if (zb0044Mask[1] & 0x2000000000000) == 0 { // if not empty - // string "unbm" - o = append(o, 0xa4, 0x75, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - } - if (zb0044Mask[1] & 0x4000000000000) == 0 { // if not empty - // string "votefst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) - if (*z).encodedKeyregTxnFields.VoteFirst == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedKeyregTxnFields.VoteFirst))) - } - for zb0005 := range (*z).encodedKeyregTxnFields.VoteFirst { - o = (*z).encodedKeyregTxnFields.VoteFirst[zb0005].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x8000000000000) == 0 { // if not empty - // string "votefstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedKeyregTxnFields.BitmaskVoteFirst)) - } - if (zb0044Mask[1] & 0x10000000000000) == 0 { // if not empty - // string "votekbm" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedKeyregTxnFields.BitmaskKeys)) - } - if (zb0044Mask[1] & 0x20000000000000) == 0 { // if not empty - // string "votekd" - o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) - if (*z).encodedKeyregTxnFields.VoteKeyDilution == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedKeyregTxnFields.VoteKeyDilution))) - } - for zb0007 := range (*z).encodedKeyregTxnFields.VoteKeyDilution { - o = msgp.AppendUint64(o, (*z).encodedKeyregTxnFields.VoteKeyDilution[zb0007]) - } - } - if (zb0044Mask[1] & 0x40000000000000) == 0 { // if not empty - // string "votekey" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedKeyregTxnFields.VotePK) - } - if (zb0044Mask[1] & 0x80000000000000) == 0 { // if not empty - // string "votelst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) - if (*z).encodedKeyregTxnFields.VoteLast == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedKeyregTxnFields.VoteLast))) - } - for zb0006 := range (*z).encodedKeyregTxnFields.VoteLast { - o = (*z).encodedKeyregTxnFields.VoteLast[zb0006].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x100000000000000) == 0 { // if not empty - // string "votelstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedKeyregTxnFields.BitmaskVoteLast)) - } - if (zb0044Mask[1] & 0x200000000000000) == 0 { // if not empty - // string "xaid" - o = append(o, 0xa4, 0x78, 0x61, 0x69, 0x64) - if (*z).encodedAssetTransferTxnFields.XferAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedAssetTransferTxnFields.XferAsset))) - } - for zb0015 := range (*z).encodedAssetTransferTxnFields.XferAsset { - o = (*z).encodedAssetTransferTxnFields.XferAsset[zb0015].MarshalMsg(o) - } - } - if (zb0044Mask[1] & 0x400000000000000) == 0 { // if not empty - // string "xaidbm" - o = append(o, 0xa6, 0x78, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedAssetTransferTxnFields.BitmaskXferAsset)) - } - } - return -} - -func (_ *encodedTxns) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedTxns) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *encodedTxns) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0044 int - var zb0045 bool - zb0044, zb0045, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0044, zb0045, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0044 > 0 { - zb0044-- - var zb0046 int - zb0046, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - if zb0046 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0046), uint64(maxEncodedTransactionGroups)) - return - } - (*z).TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).TxType) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0047 []byte - var zb0048 int - zb0048, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - if zb0048 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0048), uint64(maxBitmaskSize)) - return - } - zb0047, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - (*z).BitmaskTxType = bitmask(zb0047) - } - } - if zb0044 > 0 { - zb0044-- - (*z).TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxTypeOffset") - return - } - } - if zb0044 > 0 { - zb0044-- - var zb0049 int - zb0049, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - if zb0049 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0049), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0050 []byte - var zb0051 int - zb0051, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - if zb0051 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0051), uint64(maxBitmaskSize)) - return - } - zb0050, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - (*z).encodedTxnHeaders.BitmaskSender = bitmask(zb0050) - } - } - if zb0044 > 0 { - zb0044-- - var zb0052 int - var zb0053 bool - zb0052, zb0053, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0052 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0052), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0053 { - (*z).encodedTxnHeaders.Fee = nil - } else if (*z).encodedTxnHeaders.Fee != nil && cap((*z).encodedTxnHeaders.Fee) >= zb0052 { - (*z).encodedTxnHeaders.Fee = ((*z).encodedTxnHeaders.Fee)[:zb0052] - } else { - (*z).encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0052) - } - for zb0001 := range (*z).encodedTxnHeaders.Fee { - bts, err = (*z).encodedTxnHeaders.Fee[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee", zb0001) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0054 []byte - var zb0055 int - zb0055, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - if zb0055 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0055), uint64(maxBitmaskSize)) - return - } - zb0054, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - (*z).encodedTxnHeaders.BitmaskFee = bitmask(zb0054) - } - } - if zb0044 > 0 { - zb0044-- - var zb0056 int - var zb0057 bool - zb0056, zb0057, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0056 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0056), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0057 { - (*z).encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedTxnHeaders.FirstValid != nil && cap((*z).encodedTxnHeaders.FirstValid) >= zb0056 { - (*z).encodedTxnHeaders.FirstValid = ((*z).encodedTxnHeaders.FirstValid)[:zb0056] - } else { - (*z).encodedTxnHeaders.FirstValid = make([]basics.Round, zb0056) - } - for zb0002 := range (*z).encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedTxnHeaders.FirstValid[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid", zb0002) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0058 []byte - var zb0059 int - zb0059, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - if zb0059 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0059), uint64(maxBitmaskSize)) - return - } - zb0058, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - (*z).encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0058) - } - } - if zb0044 > 0 { - zb0044-- - var zb0060 int - var zb0061 bool - zb0060, zb0061, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0060 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0061 { - (*z).encodedTxnHeaders.LastValid = nil - } else if (*z).encodedTxnHeaders.LastValid != nil && cap((*z).encodedTxnHeaders.LastValid) >= zb0060 { - (*z).encodedTxnHeaders.LastValid = ((*z).encodedTxnHeaders.LastValid)[:zb0060] - } else { - (*z).encodedTxnHeaders.LastValid = make([]basics.Round, zb0060) - } - for zb0003 := range (*z).encodedTxnHeaders.LastValid { - bts, err = (*z).encodedTxnHeaders.LastValid[zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid", zb0003) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0062 []byte - var zb0063 int - zb0063, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - if zb0063 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0063), uint64(maxBitmaskSize)) - return - } - zb0062, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - (*z).encodedTxnHeaders.BitmaskLastValid = bitmask(zb0062) - } - } - if zb0044 > 0 { - zb0044-- - var zb0064 int - var zb0065 bool - zb0064, zb0065, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0064 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0064), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0065 { - (*z).encodedTxnHeaders.Note = nil - } else if (*z).encodedTxnHeaders.Note != nil && cap((*z).encodedTxnHeaders.Note) >= zb0064 { - (*z).encodedTxnHeaders.Note = ((*z).encodedTxnHeaders.Note)[:zb0064] - } else { - (*z).encodedTxnHeaders.Note = make([][]byte, zb0064) - } - for zb0004 := range (*z).encodedTxnHeaders.Note { - var zb0066 int - zb0066, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0004) - return - } - if zb0066 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0066), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedTxnHeaders.Note[zb0004], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Note[zb0004]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0004) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0067 []byte - var zb0068 int - zb0068, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - if zb0068 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0068), uint64(maxBitmaskSize)) - return - } - zb0067, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - (*z).encodedTxnHeaders.BitmaskNote = bitmask(zb0067) - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0069 []byte - var zb0070 int - zb0070, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - if zb0070 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0070), uint64(maxBitmaskSize)) - return - } - zb0069, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - (*z).encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0069) - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0071 []byte - var zb0072 int - zb0072, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - if zb0072 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxBitmaskSize)) - return - } - zb0071, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - (*z).encodedTxnHeaders.BitmaskGroup = bitmask(zb0071) - } - } - if zb0044 > 0 { - zb0044-- - var zb0073 int - zb0073, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - if zb0073 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0073), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0074 []byte - var zb0075 int - zb0075, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - if zb0075 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0075), uint64(maxBitmaskSize)) - return - } - zb0074, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - (*z).encodedTxnHeaders.BitmaskLease = bitmask(zb0074) - } - } - if zb0044 > 0 { - zb0044-- - var zb0076 int - zb0076, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - if zb0076 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0076), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0077 []byte - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - if zb0078 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxBitmaskSize)) - return - } - zb0077, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - (*z).encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0077) - } - } - if zb0044 > 0 { - zb0044-- - var zb0079 int - zb0079, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - if zb0079 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0079), uint64(maxAddressBytes)) - return - } - (*z).encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - } - if zb0044 > 0 { - zb0044-- - var zb0080 int - zb0080, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - if zb0080 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0080), uint64(maxAddressBytes)) - return - } - (*z).encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - } - if zb0044 > 0 { - zb0044-- - var zb0081 int - var zb0082 bool - zb0081, zb0082, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0081 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0082 { - (*z).encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedKeyregTxnFields.VoteFirst) >= zb0081 { - (*z).encodedKeyregTxnFields.VoteFirst = ((*z).encodedKeyregTxnFields.VoteFirst)[:zb0081] - } else { - (*z).encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0081) - } - for zb0005 := range (*z).encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedKeyregTxnFields.VoteFirst[zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst", zb0005) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0083 []byte - var zb0084 int - zb0084, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - if zb0084 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0084), uint64(maxBitmaskSize)) - return - } - zb0083, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - (*z).encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0083) - } - } - if zb0044 > 0 { - zb0044-- - var zb0085 int - var zb0086 bool - zb0085, zb0086, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0085 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0085), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0086 { - (*z).encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedKeyregTxnFields.VoteLast) >= zb0085 { - (*z).encodedKeyregTxnFields.VoteLast = ((*z).encodedKeyregTxnFields.VoteLast)[:zb0085] - } else { - (*z).encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0085) - } - for zb0006 := range (*z).encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedKeyregTxnFields.VoteLast[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast", zb0006) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0087 []byte - var zb0088 int - zb0088, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - if zb0088 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0088), uint64(maxBitmaskSize)) - return - } - zb0087, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - (*z).encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0087) - } - } - if zb0044 > 0 { - zb0044-- - var zb0089 int - var zb0090 bool - zb0089, zb0090, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0089 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0089), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0090 { - (*z).encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedKeyregTxnFields.VoteKeyDilution) >= zb0089 { - (*z).encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedKeyregTxnFields.VoteKeyDilution)[:zb0089] - } else { - (*z).encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0089) - } - for zb0007 := range (*z).encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedKeyregTxnFields.VoteKeyDilution[zb0007], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution", zb0007) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0091 []byte - var zb0092 int - zb0092, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - if zb0092 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0092), uint64(maxBitmaskSize)) - return - } - zb0091, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - (*z).encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0091) - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0093 []byte - var zb0094 int - zb0094, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - if zb0094 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0094), uint64(maxBitmaskSize)) - return - } - zb0093, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - (*z).encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0093) - } - } - if zb0044 > 0 { - zb0044-- - var zb0095 int - zb0095, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - if zb0095 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0095), uint64(maxAddressBytes)) - return - } - (*z).encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0096 []byte - var zb0097 int - zb0097, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - if zb0097 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0097), uint64(maxBitmaskSize)) - return - } - zb0096, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - (*z).encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0096) - } - } - if zb0044 > 0 { - zb0044-- - var zb0098 int - var zb0099 bool - zb0098, zb0099, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0098 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0098), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0099 { - (*z).encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedPaymentTxnFields.Amount != nil && cap((*z).encodedPaymentTxnFields.Amount) >= zb0098 { - (*z).encodedPaymentTxnFields.Amount = ((*z).encodedPaymentTxnFields.Amount)[:zb0098] - } else { - (*z).encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0098) - } - for zb0008 := range (*z).encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedPaymentTxnFields.Amount[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount", zb0008) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0100 []byte - var zb0101 int - zb0101, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - if zb0101 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0101), uint64(maxBitmaskSize)) - return - } - zb0100, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - (*z).encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0100) - } - } - if zb0044 > 0 { - zb0044-- - var zb0102 int - zb0102, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - if zb0102 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0102), uint64(maxAddressBytes)) - return - } - (*z).encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0103 []byte - var zb0104 int - zb0104, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - if zb0104 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0104), uint64(maxBitmaskSize)) - return - } - zb0103, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - (*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0103) - } - } - if zb0044 > 0 { - zb0044-- - var zb0105 int - var zb0106 bool - zb0105, zb0106, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0105 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0105), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0106 { - (*z).encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedAssetConfigTxnFields.ConfigAsset) >= zb0105 { - (*z).encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedAssetConfigTxnFields.ConfigAsset)[:zb0105] - } else { - (*z).encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0105) - } - for zb0009 := range (*z).encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedAssetConfigTxnFields.ConfigAsset[zb0009].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset", zb0009) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0107 []byte - var zb0108 int - zb0108, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - if zb0108 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0108), uint64(maxBitmaskSize)) - return - } - zb0107, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - (*z).encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0107) - } - } - if zb0044 > 0 { - zb0044-- - var zb0109 int - var zb0110 bool - zb0109, zb0110, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0109 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0109), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0110 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0109 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0109] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0109) - } - for zb0010 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0010], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total", zb0010) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0111 []byte - var zb0112 int - zb0112, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - if zb0112 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0112), uint64(maxBitmaskSize)) - return - } - zb0111, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0111) - } - } - if zb0044 > 0 { - zb0044-- - var zb0113 int - var zb0114 bool - zb0113, zb0114, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0113 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0113), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0114 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0113 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0113] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0113) - } - for zb0011 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0011], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals", zb0011) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0115 []byte - var zb0116 int - zb0116, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - if zb0116 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0116), uint64(maxBitmaskSize)) - return - } - zb0115, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0115) - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0117 []byte - var zb0118 int - zb0118, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - if zb0118 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0118), uint64(maxBitmaskSize)) - return - } - zb0117, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0117) - } - } - if zb0044 > 0 { - zb0044-- - var zb0119 int - var zb0120 bool - zb0119, zb0120, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0119 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0119), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0120 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0119 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0119] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0119) - } - for zb0012 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0012], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName", zb0012) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0121 []byte - var zb0122 int - zb0122, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - if zb0122 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0122), uint64(maxBitmaskSize)) - return - } - zb0121, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0121) - } - } - if zb0044 > 0 { - zb0044-- - var zb0123 int - var zb0124 bool - zb0123, zb0124, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0123 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0123), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0124 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0123 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0123] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0123) - } - for zb0013 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0013], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName", zb0013) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0125 []byte - var zb0126 int - zb0126, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - if zb0126 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0126), uint64(maxBitmaskSize)) - return - } - zb0125, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0125) - } - } - if zb0044 > 0 { - zb0044-- - var zb0127 int - var zb0128 bool - zb0127, zb0128, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0127 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0127), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0128 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0127 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0127] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0127) - } - for zb0014 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0014], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL", zb0014) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0129 []byte - var zb0130 int - zb0130, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - if zb0130 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0130), uint64(maxBitmaskSize)) - return - } - zb0129, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0129) - } - } - if zb0044 > 0 { - zb0044-- - var zb0131 int - zb0131, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - if zb0131 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0131), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0132 []byte - var zb0133 int - zb0133, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - if zb0133 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0133), uint64(maxBitmaskSize)) - return - } - zb0132, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0132) - } - } - if zb0044 > 0 { - zb0044-- - var zb0134 int - zb0134, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - if zb0134 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0134), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0135 []byte - var zb0136 int - zb0136, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - if zb0136 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0136), uint64(maxBitmaskSize)) - return - } - zb0135, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0135) - } - } - if zb0044 > 0 { - zb0044-- - var zb0137 int - zb0137, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - if zb0137 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0137), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0138 []byte - var zb0139 int - zb0139, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - if zb0139 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0139), uint64(maxBitmaskSize)) - return - } - zb0138, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0138) - } - } - if zb0044 > 0 { - zb0044-- - var zb0140 int - zb0140, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - if zb0140 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0140), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0141 []byte - var zb0142 int - zb0142, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - if zb0142 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0142), uint64(maxBitmaskSize)) - return - } - zb0141, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0141) - } - } - if zb0044 > 0 { - zb0044-- - var zb0143 int - zb0143, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - if zb0143 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0143), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0144 []byte - var zb0145 int - zb0145, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - if zb0145 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0145), uint64(maxBitmaskSize)) - return - } - zb0144, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0144) - } - } - if zb0044 > 0 { - zb0044-- - var zb0146 int - var zb0147 bool - zb0146, zb0147, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0146 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0146), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0147 { - (*z).encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedAssetTransferTxnFields.XferAsset) >= zb0146 { - (*z).encodedAssetTransferTxnFields.XferAsset = ((*z).encodedAssetTransferTxnFields.XferAsset)[:zb0146] - } else { - (*z).encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0146) - } - for zb0015 := range (*z).encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedAssetTransferTxnFields.XferAsset[zb0015].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset", zb0015) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0148 []byte - var zb0149 int - zb0149, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - if zb0149 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0149), uint64(maxBitmaskSize)) - return - } - zb0148, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0148) - } - } - if zb0044 > 0 { - zb0044-- - var zb0150 int - var zb0151 bool - zb0150, zb0151, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0150 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0150), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0151 { - (*z).encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedAssetTransferTxnFields.AssetAmount) >= zb0150 { - (*z).encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedAssetTransferTxnFields.AssetAmount)[:zb0150] - } else { - (*z).encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0150) - } - for zb0016 := range (*z).encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedAssetTransferTxnFields.AssetAmount[zb0016], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount", zb0016) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0152 []byte - var zb0153 int - zb0153, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - if zb0153 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0153), uint64(maxBitmaskSize)) - return - } - zb0152, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0152) - } - } - if zb0044 > 0 { - zb0044-- - var zb0154 int - zb0154, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - if zb0154 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0154), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0155 []byte - var zb0156 int - zb0156, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - if zb0156 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0156), uint64(maxBitmaskSize)) - return - } - zb0155, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0155) - } - } - if zb0044 > 0 { - zb0044-- - var zb0157 int - zb0157, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - if zb0157 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0157), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0158 []byte - var zb0159 int - zb0159, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - if zb0159 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0159), uint64(maxBitmaskSize)) - return - } - zb0158, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0158) - } - } - if zb0044 > 0 { - zb0044-- - var zb0160 int - zb0160, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - if zb0160 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0160), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0161 []byte - var zb0162 int - zb0162, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - if zb0162 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0162), uint64(maxBitmaskSize)) - return - } - zb0161, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0161) - } - } - if zb0044 > 0 { - zb0044-- - var zb0163 int - zb0163, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - if zb0163 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0163), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0164 []byte - var zb0165 int - zb0165, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - if zb0165 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0165), uint64(maxBitmaskSize)) - return - } - zb0164, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0164) - } - } - if zb0044 > 0 { - zb0044-- - var zb0166 int - var zb0167 bool - zb0166, zb0167, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0166 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0166), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0167 { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedAssetFreezeTxnFields.FreezeAsset) >= zb0166 { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedAssetFreezeTxnFields.FreezeAsset)[:zb0166] - } else { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0166) - } - for zb0017 := range (*z).encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedAssetFreezeTxnFields.FreezeAsset[zb0017].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset", zb0017) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0168 []byte - var zb0169 int - zb0169, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - if zb0169 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0169), uint64(maxBitmaskSize)) - return - } - zb0168, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0168) - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0170 []byte - var zb0171 int - zb0171, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - if zb0171 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0171), uint64(maxBitmaskSize)) - return - } - zb0170, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0170) - } - } - if zb0044 > 0 { - zb0044-- - var zb0172 int - var zb0173 bool - zb0172, zb0173, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0172 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0172), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0173 { - (*z).encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationID) >= zb0172 { - (*z).encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedApplicationCallTxnFields.ApplicationID)[:zb0172] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0172) - } - for zb0018 := range (*z).encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedApplicationCallTxnFields.ApplicationID[zb0018].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID", zb0018) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0174 []byte - var zb0175 int - zb0175, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - if zb0175 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0175), uint64(maxBitmaskSize)) - return - } - zb0174, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0174) - } - } - if zb0044 > 0 { - zb0044-- - var zb0176 int - zb0176, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - if zb0176 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0176), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0177 []byte - var zb0178 int - zb0178, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - if zb0178 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0178), uint64(maxBitmaskSize)) - return - } - zb0177, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0177) - } - } - if zb0044 > 0 { - zb0044-- - var zb0179 int - var zb0180 bool - zb0179, zb0180, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0179 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0179), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0180 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationArgs) >= zb0179 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedApplicationCallTxnFields.ApplicationArgs)[:zb0179] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0179) - } - for zb0019 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs { - var zb0181 int - var zb0182 bool - zb0181, zb0182, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0019) - return - } - if zb0181 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0181), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0019) - return - } - if zb0182 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019]) >= zb0181 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = ((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019])[:zb0181] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = make(applicationArgs, zb0181) - } - for zb0020 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0019, zb0020) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0183 []byte - var zb0184 int - zb0184, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - if zb0184 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0184), uint64(maxBitmaskSize)) - return - } - zb0183, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0183) - } - } - if zb0044 > 0 { - zb0044-- - var zb0185 int - var zb0186 bool - zb0185, zb0186, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0185 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0185), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0186 { - (*z).encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedApplicationCallTxnFields.Accounts) >= zb0185 { - (*z).encodedApplicationCallTxnFields.Accounts = ((*z).encodedApplicationCallTxnFields.Accounts)[:zb0185] - } else { - (*z).encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0185) - } - for zb0021 := range (*z).encodedApplicationCallTxnFields.Accounts { - var zb0187 int - var zb0188 bool - zb0187, zb0188, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0021) - return - } - if zb0187 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0187), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0021) - return - } - if zb0188 { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = nil - } else if (*z).encodedApplicationCallTxnFields.Accounts[zb0021] != nil && cap((*z).encodedApplicationCallTxnFields.Accounts[zb0021]) >= zb0187 { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = ((*z).encodedApplicationCallTxnFields.Accounts[zb0021])[:zb0187] - } else { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = make(addresses, zb0187) - } - for zb0022 := range (*z).encodedApplicationCallTxnFields.Accounts[zb0021] { - bts, err = (*z).encodedApplicationCallTxnFields.Accounts[zb0021][zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0021, zb0022) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0189 []byte - var zb0190 int - zb0190, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - if zb0190 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0190), uint64(maxBitmaskSize)) - return - } - zb0189, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0189) - } - } - if zb0044 > 0 { - zb0044-- - var zb0191 int - var zb0192 bool - zb0191, zb0192, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0191 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0191), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0192 { - (*z).encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedApplicationCallTxnFields.ForeignApps) >= zb0191 { - (*z).encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedApplicationCallTxnFields.ForeignApps)[:zb0191] - } else { - (*z).encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0191) - } - for zb0023 := range (*z).encodedApplicationCallTxnFields.ForeignApps { - var zb0193 int - var zb0194 bool - zb0193, zb0194, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0023) - return - } - if zb0193 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0193), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0023) - return - } - if zb0194 { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] != nil && cap((*z).encodedApplicationCallTxnFields.ForeignApps[zb0023]) >= zb0193 { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = ((*z).encodedApplicationCallTxnFields.ForeignApps[zb0023])[:zb0193] - } else { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = make(appIndices, zb0193) - } - for zb0024 := range (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] { - bts, err = (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023][zb0024].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0023, zb0024) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0195 []byte - var zb0196 int - zb0196, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - if zb0196 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0196), uint64(maxBitmaskSize)) - return - } - zb0195, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0195) - } - } - if zb0044 > 0 { - zb0044-- - var zb0197 int - var zb0198 bool - zb0197, zb0198, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0197 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0197), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0198 { - (*z).encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedApplicationCallTxnFields.ForeignAssets) >= zb0197 { - (*z).encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedApplicationCallTxnFields.ForeignAssets)[:zb0197] - } else { - (*z).encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0197) - } - for zb0025 := range (*z).encodedApplicationCallTxnFields.ForeignAssets { - var zb0199 int - var zb0200 bool - zb0199, zb0200, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0025) - return - } - if zb0199 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0199), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0025) - return - } - if zb0200 { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] != nil && cap((*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025]) >= zb0199 { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = ((*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025])[:zb0199] - } else { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = make(assetIndices, zb0199) - } - for zb0026 := range (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] { - bts, err = (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025][zb0026].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0025, zb0026) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0201 []byte - var zb0202 int - zb0202, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - if zb0202 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0202), uint64(maxBitmaskSize)) - return - } - zb0201, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0201) - } - } - if zb0044 > 0 { - zb0044-- - var zb0203 int - var zb0204 bool - zb0203, zb0204, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0203 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0203), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0204 { - (*z).encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedApplicationCallTxnFields.LocalNumUint) >= zb0203 { - (*z).encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedApplicationCallTxnFields.LocalNumUint)[:zb0203] - } else { - (*z).encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0203) - } - for zb0027 := range (*z).encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedApplicationCallTxnFields.LocalNumUint[zb0027], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint", zb0027) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0205 []byte - var zb0206 int - zb0206, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - if zb0206 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0206), uint64(maxBitmaskSize)) - return - } - zb0205, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0205) - } - } - if zb0044 > 0 { - zb0044-- - var zb0207 int - var zb0208 bool - zb0207, zb0208, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0207 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0207), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0208 { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0207 { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0207] - } else { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0207) - } - for zb0028 := range (*z).encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice[zb0028], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice", zb0028) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0209 []byte - var zb0210 int - zb0210, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - if zb0210 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0210), uint64(maxBitmaskSize)) - return - } - zb0209, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0209) - } - } - if zb0044 > 0 { - zb0044-- - var zb0211 int - var zb0212 bool - zb0211, zb0212, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0211 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0211), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0212 { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedApplicationCallTxnFields.GlobalNumUint) >= zb0211 { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedApplicationCallTxnFields.GlobalNumUint)[:zb0211] - } else { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0211) - } - for zb0029 := range (*z).encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedApplicationCallTxnFields.GlobalNumUint[zb0029], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint", zb0029) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0213 []byte - var zb0214 int - zb0214, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - if zb0214 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0214), uint64(maxBitmaskSize)) - return - } - zb0213, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0213) - } - } - if zb0044 > 0 { - zb0044-- - var zb0215 int - var zb0216 bool - zb0215, zb0216, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0215 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0215), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0216 { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0215 { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0215] - } else { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0215) - } - for zb0030 := range (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0030], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice", zb0030) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0217 []byte - var zb0218 int - zb0218, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - if zb0218 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0218), uint64(maxBitmaskSize)) - return - } - zb0217, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0217) - } - } - if zb0044 > 0 { - zb0044-- - var zb0219 int - var zb0220 bool - zb0219, zb0220, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0219 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0219), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0220 { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedApplicationCallTxnFields.ApprovalProgram) >= zb0219 { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedApplicationCallTxnFields.ApprovalProgram)[:zb0219] - } else { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0219) - } - for zb0031 := range (*z).encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0221 []byte - var zb0222 int - zb0222, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0031) - return - } - if zb0222 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0222), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0221, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0031) - return - } - (*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031] = program(zb0221) - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0223 []byte - var zb0224 int - zb0224, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - if zb0224 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0224), uint64(maxBitmaskSize)) - return - } - zb0223, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0223) - } - } - if zb0044 > 0 { - zb0044-- - var zb0225 int - var zb0226 bool - zb0225, zb0226, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0225 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0225), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0226 { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedApplicationCallTxnFields.ClearStateProgram) >= zb0225 { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedApplicationCallTxnFields.ClearStateProgram)[:zb0225] - } else { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0225) - } - for zb0032 := range (*z).encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0227 []byte - var zb0228 int - zb0228, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0032) - return - } - if zb0228 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0228), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0227, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0032) - return - } - (*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032] = program(zb0227) - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0229 []byte - var zb0230 int - zb0230, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - if zb0230 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0230), uint64(maxBitmaskSize)) - return - } - zb0229, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0229) - } - } - if zb0044 > 0 { - zb0044-- - var zb0231 int - var zb0232 bool - zb0231, zb0232, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0231 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0231), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0232 { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0231 { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0231] - } else { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0231) - } - for zb0033 := range (*z).encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages[zb0033], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages", zb0033) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0233 []byte - var zb0234 int - zb0234, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - if zb0234 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0234), uint64(maxBitmaskSize)) - return - } - zb0233, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0233) - } - } - if zb0044 > 0 { - zb0044-- - var zb0235 int - var zb0236 bool - zb0235, zb0236, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0235 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0235), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0236 { - (*z).encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedCompactCertTxnFields.CertRound) >= zb0235 { - (*z).encodedCompactCertTxnFields.CertRound = ((*z).encodedCompactCertTxnFields.CertRound)[:zb0235] - } else { - (*z).encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0235) - } - for zb0034 := range (*z).encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedCompactCertTxnFields.CertRound[zb0034].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound", zb0034) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0237 []byte - var zb0238 int - zb0238, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - if zb0238 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0238), uint64(maxBitmaskSize)) - return - } - zb0237, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - (*z).encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0237) - } - } - if zb0044 > 0 { - zb0044-- - var zb0239 int - var zb0240 bool - zb0239, zb0240, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0239 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0239), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0240 { - (*z).encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedCompactCertTxnFields.CertType) >= zb0239 { - (*z).encodedCompactCertTxnFields.CertType = ((*z).encodedCompactCertTxnFields.CertType)[:zb0239] - } else { - (*z).encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0239) - } - for zb0035 := range (*z).encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedCompactCertTxnFields.CertType[zb0035].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType", zb0035) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0241 []byte - var zb0242 int - zb0242, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - if zb0242 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0242), uint64(maxBitmaskSize)) - return - } - zb0241, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - (*z).encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0241) - } - } - if zb0044 > 0 { - zb0044-- - var zb0243 int - zb0243, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - if zb0243 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0243), uint64(maxAddressBytes)) - return - } - (*z).encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0244 []byte - var zb0245 int - zb0245, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - if zb0245 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0245), uint64(maxBitmaskSize)) - return - } - zb0244, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0244) - } - } - if zb0044 > 0 { - zb0044-- - var zb0246 int - var zb0247 bool - zb0246, zb0247, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0246 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0246), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0247 { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0246 { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0246] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0246) - } - for zb0036 := range (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0036], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight", zb0036) - return - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0248 []byte - var zb0249 int - zb0249, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - if zb0249 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0249), uint64(maxBitmaskSize)) - return - } - zb0248, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0248) - } - } - if zb0044 > 0 { - zb0044-- - var zb0250 int - var zb0251 bool - zb0250, zb0251, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0250 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0250), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0251 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0250 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0250] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0250) - } - for zb0037 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0252 int - var zb0253 bool - zb0252, zb0253, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0037) - return - } - if zb0252 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0252), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0037) - return - } - if zb0253 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037]) >= zb0252 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = ((*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037])[:zb0252] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = make(certProofs, zb0252) - } - for zb0038 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] { - bts, err = (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037][zb0038].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0037, zb0038) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0254 []byte - var zb0255 int - zb0255, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - if zb0255 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0255), uint64(maxBitmaskSize)) - return - } - zb0254, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0254) - } - } - if zb0044 > 0 { - zb0044-- - var zb0256 int - var zb0257 bool - zb0256, zb0257, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0256 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0256), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0257 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0256 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0256] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0256) - } - for zb0039 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0258 int - var zb0259 bool - zb0258, zb0259, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0039) - return - } - if zb0258 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0258), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0039) - return - } - if zb0259 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039]) >= zb0258 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = ((*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039])[:zb0258] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = make(certProofs, zb0258) - } - for zb0040 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] { - bts, err = (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039][zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0039, zb0040) - return - } - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0260 []byte - var zb0261 int - zb0261, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - if zb0261 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0261), uint64(maxBitmaskSize)) - return - } - zb0260, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0260) - } - } - if zb0044 > 0 { - zb0044-- - var zb0262 int - var zb0263 bool - zb0262, zb0263, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0262 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0262), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0263 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0262 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0262] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0262) - } - for zb0041 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0264 int - var zb0265 bool - zb0264, zb0265, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0041) - return - } - if zb0264 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0264), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0041) - return - } - if zb0265 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] == nil { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] = make(revealMap, zb0264) - } - for zb0264 > 0 { - var zb0042 uint64 - var zb0043 compactcert.Reveal - zb0264-- - zb0042, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0041) - return - } - bts, err = zb0043.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0041, zb0042) - return - } - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041][zb0042] = zb0043 - } - } - } - if zb0044 > 0 { - zb0044-- - { - var zb0266 []byte - var zb0267 int - zb0267, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - if zb0267 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0267), uint64(maxBitmaskSize)) - return - } - zb0266, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0266) - } - } - if zb0044 > 0 { - err = msgp.ErrTooManyArrayFields(zb0044) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0045 { - (*z) = encodedTxns{} - } - for zb0044 > 0 { - zb0044-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "type": - var zb0268 int - zb0268, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - if zb0268 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0268), uint64(maxEncodedTransactionGroups)) - return - } - (*z).TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).TxType) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - case "typebm": - { - var zb0269 []byte - var zb0270 int - zb0270, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - if zb0270 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0270), uint64(maxBitmaskSize)) - return - } - zb0269, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - (*z).BitmaskTxType = bitmask(zb0269) - } - case "typeo": - (*z).TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "TxTypeOffset") - return - } - case "snd": - var zb0271 int - zb0271, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - if zb0271 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0271), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - case "sndbm": - { - var zb0272 []byte - var zb0273 int - zb0273, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - if zb0273 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0273), uint64(maxBitmaskSize)) - return - } - zb0272, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - (*z).encodedTxnHeaders.BitmaskSender = bitmask(zb0272) - } - case "fee": - var zb0274 int - var zb0275 bool - zb0274, zb0275, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Fee") - return - } - if zb0274 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0274), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Fee") - return - } - if zb0275 { - (*z).encodedTxnHeaders.Fee = nil - } else if (*z).encodedTxnHeaders.Fee != nil && cap((*z).encodedTxnHeaders.Fee) >= zb0274 { - (*z).encodedTxnHeaders.Fee = ((*z).encodedTxnHeaders.Fee)[:zb0274] - } else { - (*z).encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0274) - } - for zb0001 := range (*z).encodedTxnHeaders.Fee { - bts, err = (*z).encodedTxnHeaders.Fee[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Fee", zb0001) - return - } - } - case "feebm": - { - var zb0276 []byte - var zb0277 int - zb0277, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - if zb0277 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0277), uint64(maxBitmaskSize)) - return - } - zb0276, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - (*z).encodedTxnHeaders.BitmaskFee = bitmask(zb0276) - } - case "fv": - var zb0278 int - var zb0279 bool - zb0278, zb0279, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0278 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0278), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0279 { - (*z).encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedTxnHeaders.FirstValid != nil && cap((*z).encodedTxnHeaders.FirstValid) >= zb0278 { - (*z).encodedTxnHeaders.FirstValid = ((*z).encodedTxnHeaders.FirstValid)[:zb0278] - } else { - (*z).encodedTxnHeaders.FirstValid = make([]basics.Round, zb0278) - } - for zb0002 := range (*z).encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedTxnHeaders.FirstValid[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid", zb0002) - return - } - } - case "fvbm": - { - var zb0280 []byte - var zb0281 int - zb0281, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - if zb0281 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0281), uint64(maxBitmaskSize)) - return - } - zb0280, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - (*z).encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0280) - } - case "lv": - var zb0282 int - var zb0283 bool - zb0282, zb0283, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid") - return - } - if zb0282 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0282), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LastValid") - return - } - if zb0283 { - (*z).encodedTxnHeaders.LastValid = nil - } else if (*z).encodedTxnHeaders.LastValid != nil && cap((*z).encodedTxnHeaders.LastValid) >= zb0282 { - (*z).encodedTxnHeaders.LastValid = ((*z).encodedTxnHeaders.LastValid)[:zb0282] - } else { - (*z).encodedTxnHeaders.LastValid = make([]basics.Round, zb0282) - } - for zb0003 := range (*z).encodedTxnHeaders.LastValid { - bts, err = (*z).encodedTxnHeaders.LastValid[zb0003].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid", zb0003) - return - } - } - case "lvbm": - { - var zb0284 []byte - var zb0285 int - zb0285, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - if zb0285 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0285), uint64(maxBitmaskSize)) - return - } - zb0284, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - (*z).encodedTxnHeaders.BitmaskLastValid = bitmask(zb0284) - } - case "note": - var zb0286 int - var zb0287 bool - zb0286, zb0287, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Note") - return - } - if zb0286 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0286), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Note") - return - } - if zb0287 { - (*z).encodedTxnHeaders.Note = nil - } else if (*z).encodedTxnHeaders.Note != nil && cap((*z).encodedTxnHeaders.Note) >= zb0286 { - (*z).encodedTxnHeaders.Note = ((*z).encodedTxnHeaders.Note)[:zb0286] - } else { - (*z).encodedTxnHeaders.Note = make([][]byte, zb0286) - } - for zb0004 := range (*z).encodedTxnHeaders.Note { - var zb0288 int - zb0288, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Note", zb0004) - return - } - if zb0288 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0288), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedTxnHeaders.Note[zb0004], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Note[zb0004]) - if err != nil { - err = msgp.WrapError(err, "Note", zb0004) - return - } - } - case "notebm": - { - var zb0289 []byte - var zb0290 int - zb0290, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - if zb0290 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0290), uint64(maxBitmaskSize)) - return - } - zb0289, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - (*z).encodedTxnHeaders.BitmaskNote = bitmask(zb0289) - } - case "genbm": - { - var zb0291 []byte - var zb0292 int - zb0292, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - if zb0292 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0292), uint64(maxBitmaskSize)) - return - } - zb0291, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - (*z).encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0291) - } - case "grpbm": - { - var zb0293 []byte - var zb0294 int - zb0294, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - if zb0294 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0294), uint64(maxBitmaskSize)) - return - } - zb0293, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - (*z).encodedTxnHeaders.BitmaskGroup = bitmask(zb0293) - } - case "lx": - var zb0295 int - zb0295, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - if zb0295 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0295), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - case "lxbm": - { - var zb0296 []byte - var zb0297 int - zb0297, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - if zb0297 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0297), uint64(maxBitmaskSize)) - return - } - zb0296, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - (*z).encodedTxnHeaders.BitmaskLease = bitmask(zb0296) - } - case "rekey": - var zb0298 int - zb0298, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - if zb0298 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0298), uint64(maxAddressBytes)) - return - } - (*z).encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - case "rekeybm": - { - var zb0299 []byte - var zb0300 int - zb0300, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - if zb0300 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0300), uint64(maxBitmaskSize)) - return - } - zb0299, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - (*z).encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0299) - } - case "votekey": - var zb0301 int - zb0301, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - if zb0301 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0301), uint64(maxAddressBytes)) - return - } - (*z).encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - case "selkey": - var zb0302 int - zb0302, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - if zb0302 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0302), uint64(maxAddressBytes)) - return - } - (*z).encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - case "votefst": - var zb0303 int - var zb0304 bool - zb0303, zb0304, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0303 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0303), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0304 { - (*z).encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedKeyregTxnFields.VoteFirst) >= zb0303 { - (*z).encodedKeyregTxnFields.VoteFirst = ((*z).encodedKeyregTxnFields.VoteFirst)[:zb0303] - } else { - (*z).encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0303) - } - for zb0005 := range (*z).encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedKeyregTxnFields.VoteFirst[zb0005].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst", zb0005) - return - } - } - case "votefstbm": - { - var zb0305 []byte - var zb0306 int - zb0306, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - if zb0306 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0306), uint64(maxBitmaskSize)) - return - } - zb0305, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - (*z).encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0305) - } - case "votelst": - var zb0307 int - var zb0308 bool - zb0307, zb0308, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0307 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0307), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0308 { - (*z).encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedKeyregTxnFields.VoteLast) >= zb0307 { - (*z).encodedKeyregTxnFields.VoteLast = ((*z).encodedKeyregTxnFields.VoteLast)[:zb0307] - } else { - (*z).encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0307) - } - for zb0006 := range (*z).encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedKeyregTxnFields.VoteLast[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast", zb0006) - return - } - } - case "votelstbm": - { - var zb0309 []byte - var zb0310 int - zb0310, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - if zb0310 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0310), uint64(maxBitmaskSize)) - return - } - zb0309, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - (*z).encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0309) - } - case "votekd": - var zb0311 int - var zb0312 bool - zb0311, zb0312, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0311 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0311), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0312 { - (*z).encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedKeyregTxnFields.VoteKeyDilution) >= zb0311 { - (*z).encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedKeyregTxnFields.VoteKeyDilution)[:zb0311] - } else { - (*z).encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0311) - } - for zb0007 := range (*z).encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedKeyregTxnFields.VoteKeyDilution[zb0007], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution", zb0007) - return - } - } - case "votekbm": - { - var zb0313 []byte - var zb0314 int - zb0314, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - if zb0314 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0314), uint64(maxBitmaskSize)) - return - } - zb0313, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - (*z).encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0313) - } - case "nonpartbm": - { - var zb0315 []byte - var zb0316 int - zb0316, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - if zb0316 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0316), uint64(maxBitmaskSize)) - return - } - zb0315, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - (*z).encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0315) - } - case "rcv": - var zb0317 int - zb0317, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - if zb0317 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0317), uint64(maxAddressBytes)) - return - } - (*z).encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - case "rcvbm": - { - var zb0318 []byte - var zb0319 int - zb0319, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - if zb0319 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0319), uint64(maxBitmaskSize)) - return - } - zb0318, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - (*z).encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0318) - } - case "amt": - var zb0320 int - var zb0321 bool - zb0320, zb0321, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Amount") - return - } - if zb0320 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0320), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Amount") - return - } - if zb0321 { - (*z).encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedPaymentTxnFields.Amount != nil && cap((*z).encodedPaymentTxnFields.Amount) >= zb0320 { - (*z).encodedPaymentTxnFields.Amount = ((*z).encodedPaymentTxnFields.Amount)[:zb0320] - } else { - (*z).encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0320) - } - for zb0008 := range (*z).encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedPaymentTxnFields.Amount[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Amount", zb0008) - return - } - } - case "amtbm": - { - var zb0322 []byte - var zb0323 int - zb0323, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - if zb0323 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0323), uint64(maxBitmaskSize)) - return - } - zb0322, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - (*z).encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0322) - } - case "close": - var zb0324 int - zb0324, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - if zb0324 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0324), uint64(maxAddressBytes)) - return - } - (*z).encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - case "closebm": - { - var zb0325 []byte - var zb0326 int - zb0326, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - if zb0326 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0326), uint64(maxBitmaskSize)) - return - } - zb0325, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - (*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0325) - } - case "caid": - var zb0327 int - var zb0328 bool - zb0327, zb0328, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0327 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0327), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0328 { - (*z).encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedAssetConfigTxnFields.ConfigAsset) >= zb0327 { - (*z).encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedAssetConfigTxnFields.ConfigAsset)[:zb0327] - } else { - (*z).encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0327) - } - for zb0009 := range (*z).encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedAssetConfigTxnFields.ConfigAsset[zb0009].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset", zb0009) - return - } - } - case "caidbm": - { - var zb0329 []byte - var zb0330 int - zb0330, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - if zb0330 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0330), uint64(maxBitmaskSize)) - return - } - zb0329, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - (*z).encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0329) - } - case "t": - var zb0331 int - var zb0332 bool - zb0331, zb0332, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total") - return - } - if zb0331 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0331), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Total") - return - } - if zb0332 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0331 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0331] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0331) - } - for zb0010 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0010], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total", zb0010) - return - } - } - case "tbm": - { - var zb0333 []byte - var zb0334 int - zb0334, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - if zb0334 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0334), uint64(maxBitmaskSize)) - return - } - zb0333, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0333) - } - case "dc": - var zb0335 int - var zb0336 bool - zb0335, zb0336, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals") - return - } - if zb0335 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0335), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Decimals") - return - } - if zb0336 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0335 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0335] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0335) - } - for zb0011 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0011], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals", zb0011) - return - } - } - case "dcbm": - { - var zb0337 []byte - var zb0338 int - zb0338, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - if zb0338 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0338), uint64(maxBitmaskSize)) - return - } - zb0337, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0337) - } - case "dfbm": - { - var zb0339 []byte - var zb0340 int - zb0340, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - if zb0340 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0340), uint64(maxBitmaskSize)) - return - } - zb0339, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0339) - } - case "un": - var zb0341 int - var zb0342 bool - zb0341, zb0342, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName") - return - } - if zb0341 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0341), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "UnitName") - return - } - if zb0342 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0341 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0341] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0341) - } - for zb0012 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0012], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName", zb0012) - return - } - } - case "unbm": - { - var zb0343 []byte - var zb0344 int - zb0344, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - if zb0344 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0344), uint64(maxBitmaskSize)) - return - } - zb0343, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0343) - } - case "an": - var zb0345 int - var zb0346 bool - zb0345, zb0346, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName") - return - } - if zb0345 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0345), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetName") - return - } - if zb0346 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0345 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0345] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0345) - } - for zb0013 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0013], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName", zb0013) - return - } - } - case "anbm": - { - var zb0347 []byte - var zb0348 int - zb0348, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - if zb0348 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0348), uint64(maxBitmaskSize)) - return - } - zb0347, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0347) - } - case "au": - var zb0349 int - var zb0350 bool - zb0349, zb0350, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL") - return - } - if zb0349 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0349), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "URL") - return - } - if zb0350 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0349 { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0349] - } else { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0349) - } - for zb0014 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0014], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL", zb0014) - return - } - } - case "aubm": - { - var zb0351 []byte - var zb0352 int - zb0352, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - if zb0352 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0352), uint64(maxBitmaskSize)) - return - } - zb0351, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0351) - } - case "am": - var zb0353 int - zb0353, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - if zb0353 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0353), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - case "ambm": - { - var zb0354 []byte - var zb0355 int - zb0355, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - if zb0355 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0355), uint64(maxBitmaskSize)) - return - } - zb0354, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0354) - } - case "m": - var zb0356 int - zb0356, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - if zb0356 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0356), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - case "mbm": - { - var zb0357 []byte - var zb0358 int - zb0358, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - if zb0358 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0358), uint64(maxBitmaskSize)) - return - } - zb0357, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0357) - } - case "r": - var zb0359 int - zb0359, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - if zb0359 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0359), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - case "rbm": - { - var zb0360 []byte - var zb0361 int - zb0361, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - if zb0361 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0361), uint64(maxBitmaskSize)) - return - } - zb0360, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0360) - } - case "f": - var zb0362 int - zb0362, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - if zb0362 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0362), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - case "fbm": - { - var zb0363 []byte - var zb0364 int - zb0364, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - if zb0364 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0364), uint64(maxBitmaskSize)) - return - } - zb0363, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0363) - } - case "c": - var zb0365 int - zb0365, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - if zb0365 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0365), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - case "cbm": - { - var zb0366 []byte - var zb0367 int - zb0367, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - if zb0367 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0367), uint64(maxBitmaskSize)) - return - } - zb0366, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - (*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0366) - } - case "xaid": - var zb0368 int - var zb0369 bool - zb0368, zb0369, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0368 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0368), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0369 { - (*z).encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedAssetTransferTxnFields.XferAsset) >= zb0368 { - (*z).encodedAssetTransferTxnFields.XferAsset = ((*z).encodedAssetTransferTxnFields.XferAsset)[:zb0368] - } else { - (*z).encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0368) - } - for zb0015 := range (*z).encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedAssetTransferTxnFields.XferAsset[zb0015].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset", zb0015) - return - } - } - case "xaidbm": - { - var zb0370 []byte - var zb0371 int - zb0371, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - if zb0371 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0371), uint64(maxBitmaskSize)) - return - } - zb0370, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0370) - } - case "aamt": - var zb0372 int - var zb0373 bool - zb0372, zb0373, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0372 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0372), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0373 { - (*z).encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedAssetTransferTxnFields.AssetAmount) >= zb0372 { - (*z).encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedAssetTransferTxnFields.AssetAmount)[:zb0372] - } else { - (*z).encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0372) - } - for zb0016 := range (*z).encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedAssetTransferTxnFields.AssetAmount[zb0016], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount", zb0016) - return - } - } - case "aamtbm": - { - var zb0374 []byte - var zb0375 int - zb0375, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - if zb0375 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0375), uint64(maxBitmaskSize)) - return - } - zb0374, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0374) - } - case "asnd": - var zb0376 int - zb0376, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - if zb0376 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0376), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - case "asndbm": - { - var zb0377 []byte - var zb0378 int - zb0378, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - if zb0378 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0378), uint64(maxBitmaskSize)) - return - } - zb0377, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0377) - } - case "arcv": - var zb0379 int - zb0379, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - if zb0379 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0379), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - case "arcvbm": - { - var zb0380 []byte - var zb0381 int - zb0381, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - if zb0381 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0381), uint64(maxBitmaskSize)) - return - } - zb0380, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0380) - } - case "aclose": - var zb0382 int - zb0382, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - if zb0382 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0382), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - case "aclosebm": - { - var zb0383 []byte - var zb0384 int - zb0384, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - if zb0384 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0384), uint64(maxBitmaskSize)) - return - } - zb0383, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - (*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0383) - } - case "fadd": - var zb0385 int - zb0385, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - if zb0385 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0385), uint64(maxAddressBytes)) - return - } - (*z).encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - case "faddbm": - { - var zb0386 []byte - var zb0387 int - zb0387, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - if zb0387 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0387), uint64(maxBitmaskSize)) - return - } - zb0386, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0386) - } - case "faid": - var zb0388 int - var zb0389 bool - zb0388, zb0389, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0388 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0388), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0389 { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedAssetFreezeTxnFields.FreezeAsset) >= zb0388 { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedAssetFreezeTxnFields.FreezeAsset)[:zb0388] - } else { - (*z).encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0388) - } - for zb0017 := range (*z).encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedAssetFreezeTxnFields.FreezeAsset[zb0017].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset", zb0017) - return - } - } - case "faidbm": - { - var zb0390 []byte - var zb0391 int - zb0391, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - if zb0391 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0391), uint64(maxBitmaskSize)) - return - } - zb0390, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0390) - } - case "afrzbm": - { - var zb0392 []byte - var zb0393 int - zb0393, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - if zb0393 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0393), uint64(maxBitmaskSize)) - return - } - zb0392, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - (*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0392) - } - case "apid": - var zb0394 int - var zb0395 bool - zb0394, zb0395, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0394 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0394), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0395 { - (*z).encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationID) >= zb0394 { - (*z).encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedApplicationCallTxnFields.ApplicationID)[:zb0394] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0394) - } - for zb0018 := range (*z).encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedApplicationCallTxnFields.ApplicationID[zb0018].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID", zb0018) - return - } - } - case "apidbm": - { - var zb0396 []byte - var zb0397 int - zb0397, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - if zb0397 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0397), uint64(maxBitmaskSize)) - return - } - zb0396, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0396) - } - case "apan": - var zb0398 int - zb0398, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - if zb0398 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0398), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - case "apanbm": - { - var zb0399 []byte - var zb0400 int - zb0400, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - if zb0400 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0400), uint64(maxBitmaskSize)) - return - } - zb0399, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0399) - } - case "apaa": - var zb0401 int - var zb0402 bool - zb0401, zb0402, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0401 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0401), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0402 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationArgs) >= zb0401 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedApplicationCallTxnFields.ApplicationArgs)[:zb0401] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0401) - } - for zb0019 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs { - var zb0403 int - var zb0404 bool - zb0403, zb0404, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0019) - return - } - if zb0403 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0403), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "ApplicationArgs", zb0019) - return - } - if zb0404 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = nil - } else if (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] != nil && cap((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019]) >= zb0403 { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = ((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019])[:zb0403] - } else { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] = make(applicationArgs, zb0403) - } - for zb0020 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] { - (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020]) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0019, zb0020) - return - } - } - } - case "apaabm": - { - var zb0405 []byte - var zb0406 int - zb0406, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - if zb0406 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0406), uint64(maxBitmaskSize)) - return - } - zb0405, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0405) - } - case "apat": - var zb0407 int - var zb0408 bool - zb0407, zb0408, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts") - return - } - if zb0407 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0407), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Accounts") - return - } - if zb0408 { - (*z).encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedApplicationCallTxnFields.Accounts) >= zb0407 { - (*z).encodedApplicationCallTxnFields.Accounts = ((*z).encodedApplicationCallTxnFields.Accounts)[:zb0407] - } else { - (*z).encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0407) - } - for zb0021 := range (*z).encodedApplicationCallTxnFields.Accounts { - var zb0409 int - var zb0410 bool - zb0409, zb0410, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0021) - return - } - if zb0409 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0409), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "Accounts", zb0021) - return - } - if zb0410 { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = nil - } else if (*z).encodedApplicationCallTxnFields.Accounts[zb0021] != nil && cap((*z).encodedApplicationCallTxnFields.Accounts[zb0021]) >= zb0409 { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = ((*z).encodedApplicationCallTxnFields.Accounts[zb0021])[:zb0409] - } else { - (*z).encodedApplicationCallTxnFields.Accounts[zb0021] = make(addresses, zb0409) - } - for zb0022 := range (*z).encodedApplicationCallTxnFields.Accounts[zb0021] { - bts, err = (*z).encodedApplicationCallTxnFields.Accounts[zb0021][zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0021, zb0022) - return - } - } - } - case "apatbm": - { - var zb0411 []byte - var zb0412 int - zb0412, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - if zb0412 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0412), uint64(maxBitmaskSize)) - return - } - zb0411, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0411) - } - case "apfa": - var zb0413 int - var zb0414 bool - zb0413, zb0414, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0413 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0413), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0414 { - (*z).encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedApplicationCallTxnFields.ForeignApps) >= zb0413 { - (*z).encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedApplicationCallTxnFields.ForeignApps)[:zb0413] - } else { - (*z).encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0413) - } - for zb0023 := range (*z).encodedApplicationCallTxnFields.ForeignApps { - var zb0415 int - var zb0416 bool - zb0415, zb0416, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0023) - return - } - if zb0415 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0415), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "ForeignApps", zb0023) - return - } - if zb0416 { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] != nil && cap((*z).encodedApplicationCallTxnFields.ForeignApps[zb0023]) >= zb0415 { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = ((*z).encodedApplicationCallTxnFields.ForeignApps[zb0023])[:zb0415] - } else { - (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] = make(appIndices, zb0415) - } - for zb0024 := range (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] { - bts, err = (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023][zb0024].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0023, zb0024) - return - } - } - } - case "apfabm": - { - var zb0417 []byte - var zb0418 int - zb0418, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - if zb0418 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0418), uint64(maxBitmaskSize)) - return - } - zb0417, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0417) - } - case "apas": - var zb0419 int - var zb0420 bool - zb0419, zb0420, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0419 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0419), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0420 { - (*z).encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedApplicationCallTxnFields.ForeignAssets) >= zb0419 { - (*z).encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedApplicationCallTxnFields.ForeignAssets)[:zb0419] - } else { - (*z).encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0419) - } - for zb0025 := range (*z).encodedApplicationCallTxnFields.ForeignAssets { - var zb0421 int - var zb0422 bool - zb0421, zb0422, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0025) - return - } - if zb0421 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0421), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "ForeignAssets", zb0025) - return - } - if zb0422 { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = nil - } else if (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] != nil && cap((*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025]) >= zb0421 { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = ((*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025])[:zb0421] - } else { - (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] = make(assetIndices, zb0421) - } - for zb0026 := range (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] { - bts, err = (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025][zb0026].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0025, zb0026) - return - } - } - } - case "apasbm": - { - var zb0423 []byte - var zb0424 int - zb0424, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - if zb0424 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0424), uint64(maxBitmaskSize)) - return - } - zb0423, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0423) - } - case "lnui": - var zb0425 int - var zb0426 bool - zb0425, zb0426, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0425 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0425), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0426 { - (*z).encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedApplicationCallTxnFields.LocalNumUint) >= zb0425 { - (*z).encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedApplicationCallTxnFields.LocalNumUint)[:zb0425] - } else { - (*z).encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0425) - } - for zb0027 := range (*z).encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedApplicationCallTxnFields.LocalNumUint[zb0027], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint", zb0027) - return - } - } - case "lnuibm": - { - var zb0427 []byte - var zb0428 int - zb0428, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - if zb0428 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0428), uint64(maxBitmaskSize)) - return - } - zb0427, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0427) - } - case "lnbs": - var zb0429 int - var zb0430 bool - zb0429, zb0430, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0429 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0429), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0430 { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0429 { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0429] - } else { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0429) - } - for zb0028 := range (*z).encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedApplicationCallTxnFields.LocalNumByteSlice[zb0028], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice", zb0028) - return - } - } - case "lnbsbm": - { - var zb0431 []byte - var zb0432 int - zb0432, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - if zb0432 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0432), uint64(maxBitmaskSize)) - return - } - zb0431, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0431) - } - case "gnui": - var zb0433 int - var zb0434 bool - zb0433, zb0434, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0433 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0433), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0434 { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedApplicationCallTxnFields.GlobalNumUint) >= zb0433 { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedApplicationCallTxnFields.GlobalNumUint)[:zb0433] - } else { - (*z).encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0433) - } - for zb0029 := range (*z).encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedApplicationCallTxnFields.GlobalNumUint[zb0029], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint", zb0029) - return - } - } - case "gnuibm": - { - var zb0435 []byte - var zb0436 int - zb0436, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - if zb0436 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0436), uint64(maxBitmaskSize)) - return - } - zb0435, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0435) - } - case "gnbs": - var zb0437 int - var zb0438 bool - zb0437, zb0438, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0437 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0437), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0438 { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0437 { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0437] - } else { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0437) - } - for zb0030 := range (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0030], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice", zb0030) - return - } - } - case "gnbsbm": - { - var zb0439 []byte - var zb0440 int - zb0440, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - if zb0440 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0440), uint64(maxBitmaskSize)) - return - } - zb0439, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0439) - } - case "apap": - var zb0441 int - var zb0442 bool - zb0441, zb0442, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0441 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0441), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0442 { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedApplicationCallTxnFields.ApprovalProgram) >= zb0441 { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedApplicationCallTxnFields.ApprovalProgram)[:zb0441] - } else { - (*z).encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0441) - } - for zb0031 := range (*z).encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0443 []byte - var zb0444 int - zb0444, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0031) - return - } - if zb0444 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0444), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0443, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031])) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0031) - return - } - (*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031] = program(zb0443) - } - } - case "apapbm": - { - var zb0445 []byte - var zb0446 int - zb0446, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - if zb0446 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0446), uint64(maxBitmaskSize)) - return - } - zb0445, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0445) - } - case "apsu": - var zb0447 int - var zb0448 bool - zb0447, zb0448, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0447 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0447), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0448 { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedApplicationCallTxnFields.ClearStateProgram) >= zb0447 { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedApplicationCallTxnFields.ClearStateProgram)[:zb0447] - } else { - (*z).encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0447) - } - for zb0032 := range (*z).encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0449 []byte - var zb0450 int - zb0450, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0032) - return - } - if zb0450 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0450), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0449, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032])) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0032) - return - } - (*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032] = program(zb0449) - } - } - case "apsubm": - { - var zb0451 []byte - var zb0452 int - zb0452, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - if zb0452 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0452), uint64(maxBitmaskSize)) - return - } - zb0451, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0451) - } - case "apep": - var zb0453 int - var zb0454 bool - zb0453, zb0454, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0453 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0453), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0454 { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0453 { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0453] - } else { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0453) - } - for zb0033 := range (*z).encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedApplicationCallTxnFields.ExtraProgramPages[zb0033], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages", zb0033) - return - } - } - case "apepbm": - { - var zb0455 []byte - var zb0456 int - zb0456, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - if zb0456 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0456), uint64(maxBitmaskSize)) - return - } - zb0455, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - (*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0455) - } - case "certrnd": - var zb0457 int - var zb0458 bool - zb0457, zb0458, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound") - return - } - if zb0457 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0457), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertRound") - return - } - if zb0458 { - (*z).encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedCompactCertTxnFields.CertRound) >= zb0457 { - (*z).encodedCompactCertTxnFields.CertRound = ((*z).encodedCompactCertTxnFields.CertRound)[:zb0457] - } else { - (*z).encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0457) - } - for zb0034 := range (*z).encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedCompactCertTxnFields.CertRound[zb0034].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound", zb0034) - return - } - } - case "certrndbm": - { - var zb0459 []byte - var zb0460 int - zb0460, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - if zb0460 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0460), uint64(maxBitmaskSize)) - return - } - zb0459, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - (*z).encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0459) - } - case "certtype": - var zb0461 int - var zb0462 bool - zb0461, zb0462, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertType") - return - } - if zb0461 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0461), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertType") - return - } - if zb0462 { - (*z).encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedCompactCertTxnFields.CertType) >= zb0461 { - (*z).encodedCompactCertTxnFields.CertType = ((*z).encodedCompactCertTxnFields.CertType)[:zb0461] - } else { - (*z).encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0461) - } - for zb0035 := range (*z).encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedCompactCertTxnFields.CertType[zb0035].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertType", zb0035) - return - } - } - case "certtypebm": - { - var zb0463 []byte - var zb0464 int - zb0464, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - if zb0464 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0464), uint64(maxBitmaskSize)) - return - } - zb0463, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - (*z).encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0463) - } - case "certc": - var zb0465 int - zb0465, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - if zb0465 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0465), uint64(maxAddressBytes)) - return - } - (*z).encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - case "certcbm": - { - var zb0466 []byte - var zb0467 int - zb0467, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - if zb0467 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0467), uint64(maxBitmaskSize)) - return - } - zb0466, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0466) - } - case "certw": - var zb0468 int - var zb0469 bool - zb0468, zb0469, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0468 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0468), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0469 { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0468 { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0468] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0468) - } - for zb0036 := range (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0036], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight", zb0036) - return - } - } - case "certwbm": - { - var zb0470 []byte - var zb0471 int - zb0471, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - if zb0471 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0471), uint64(maxBitmaskSize)) - return - } - zb0470, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0470) - } - case "certS": - var zb0472 int - var zb0473 bool - zb0472, zb0473, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0472 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0472), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0473 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0472 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0472] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0472) - } - for zb0037 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0474 int - var zb0475 bool - zb0474, zb0475, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0037) - return - } - if zb0474 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0474), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "SigProofs", zb0037) - return - } - if zb0475 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037]) >= zb0474 { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = ((*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037])[:zb0474] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] = make(certProofs, zb0474) - } - for zb0038 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] { - bts, err = (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037][zb0038].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0037, zb0038) - return - } - } - } - case "certSbm": - { - var zb0476 []byte - var zb0477 int - zb0477, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - if zb0477 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0477), uint64(maxBitmaskSize)) - return - } - zb0476, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0476) - } - case "certP": - var zb0478 int - var zb0479 bool - zb0478, zb0479, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0478 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0478), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0479 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0478 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0478] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0478) - } - for zb0039 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0480 int - var zb0481 bool - zb0480, zb0481, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0039) - return - } - if zb0480 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0480), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "PartProofs", zb0039) - return - } - if zb0481 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039]) >= zb0480 { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = ((*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039])[:zb0480] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] = make(certProofs, zb0480) - } - for zb0040 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] { - bts, err = (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039][zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0039, zb0040) - return - } - } - } - case "certPbm": - { - var zb0482 []byte - var zb0483 int - zb0483, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - if zb0483 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0483), uint64(maxBitmaskSize)) - return - } - zb0482, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0482) - } - case "certr": - var zb0484 int - var zb0485 bool - zb0484, zb0485, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals") - return - } - if zb0484 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0484), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Reveals") - return - } - if zb0485 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0484 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0484] - } else { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0484) - } - for zb0041 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0486 int - var zb0487 bool - zb0486, zb0487, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0041) - return - } - if zb0486 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0486), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "Reveals", zb0041) - return - } - if zb0487 { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] = nil - } else if (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] == nil { - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] = make(revealMap, zb0486) - } - for zb0486 > 0 { - var zb0042 uint64 - var zb0043 compactcert.Reveal - zb0486-- - zb0042, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0041) - return - } - bts, err = zb0043.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0041, zb0042) - return - } - (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041][zb0042] = zb0043 - } - } - case "certrbm": - { - var zb0488 []byte - var zb0489 int - zb0489, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - if zb0489 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0489), uint64(maxBitmaskSize)) - return - } - zb0488, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - (*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0488) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *encodedTxns) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*encodedTxns) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *encodedTxns) Msgsize() (s int) { - s = 3 + 5 + msgp.BytesPrefixSize + len((*z).TxType) + 7 + msgp.BytesPrefixSize + len([]byte((*z).BitmaskTxType)) + 6 + msgp.ByteSize + 4 + msgp.BytesPrefixSize + len((*z).encodedTxnHeaders.Sender) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskSender)) + 4 + msgp.ArrayHeaderSize - for zb0001 := range (*z).encodedTxnHeaders.Fee { - s += (*z).encodedTxnHeaders.Fee[zb0001].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskFee)) + 3 + msgp.ArrayHeaderSize - for zb0002 := range (*z).encodedTxnHeaders.FirstValid { - s += (*z).encodedTxnHeaders.FirstValid[zb0002].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskFirstValid)) + 3 + msgp.ArrayHeaderSize - for zb0003 := range (*z).encodedTxnHeaders.LastValid { - s += (*z).encodedTxnHeaders.LastValid[zb0003].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskLastValid)) + 5 + msgp.ArrayHeaderSize - for zb0004 := range (*z).encodedTxnHeaders.Note { - s += msgp.BytesPrefixSize + len((*z).encodedTxnHeaders.Note[zb0004]) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskNote)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskGenesisID)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskGroup)) + 3 + msgp.BytesPrefixSize + len((*z).encodedTxnHeaders.Lease) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskLease)) + 6 + msgp.BytesPrefixSize + len((*z).encodedTxnHeaders.RekeyTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedTxnHeaders.BitmaskRekeyTo)) + 8 + msgp.BytesPrefixSize + len((*z).encodedKeyregTxnFields.VotePK) + 7 + msgp.BytesPrefixSize + len((*z).encodedKeyregTxnFields.SelectionPK) + 8 + msgp.ArrayHeaderSize - for zb0005 := range (*z).encodedKeyregTxnFields.VoteFirst { - s += (*z).encodedKeyregTxnFields.VoteFirst[zb0005].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedKeyregTxnFields.BitmaskVoteFirst)) + 8 + msgp.ArrayHeaderSize - for zb0006 := range (*z).encodedKeyregTxnFields.VoteLast { - s += (*z).encodedKeyregTxnFields.VoteLast[zb0006].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedKeyregTxnFields.BitmaskVoteLast)) + 7 + msgp.ArrayHeaderSize + (len((*z).encodedKeyregTxnFields.VoteKeyDilution) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedKeyregTxnFields.BitmaskKeys)) + 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedKeyregTxnFields.BitmaskNonparticipation)) + 4 + msgp.BytesPrefixSize + len((*z).encodedPaymentTxnFields.Receiver) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedPaymentTxnFields.BitmaskReceiver)) + 4 + msgp.ArrayHeaderSize - for zb0008 := range (*z).encodedPaymentTxnFields.Amount { - s += (*z).encodedPaymentTxnFields.Amount[zb0008].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedPaymentTxnFields.BitmaskAmount)) + 6 + msgp.BytesPrefixSize + len((*z).encodedPaymentTxnFields.CloseRemainderTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo)) + 5 + msgp.ArrayHeaderSize - for zb0009 := range (*z).encodedAssetConfigTxnFields.ConfigAsset { - s += (*z).encodedAssetConfigTxnFields.ConfigAsset[zb0009].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset)) + 2 + msgp.ArrayHeaderSize + (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total) * (msgp.Uint64Size)) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) + 3 + msgp.ArrayHeaderSize + (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals) * (msgp.Uint32Size)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) + 3 + msgp.ArrayHeaderSize - for zb0012 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - s += msgp.StringPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0012]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) + 3 + msgp.ArrayHeaderSize - for zb0013 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - s += msgp.StringPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0013]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) + 3 + msgp.ArrayHeaderSize - for zb0014 := range (*z).encodedAssetConfigTxnFields.encodedAssetParams.URL { - s += msgp.StringPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0014]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) + 3 + msgp.BytesPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) + 2 + msgp.BytesPrefixSize + len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) + 5 + msgp.ArrayHeaderSize - for zb0015 := range (*z).encodedAssetTransferTxnFields.XferAsset { - s += (*z).encodedAssetTransferTxnFields.XferAsset[zb0015].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetTransferTxnFields.BitmaskXferAsset)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedAssetTransferTxnFields.AssetAmount) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount)) + 5 + msgp.BytesPrefixSize + len((*z).encodedAssetTransferTxnFields.AssetSender) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetTransferTxnFields.BitmaskAssetSender)) + 5 + msgp.BytesPrefixSize + len((*z).encodedAssetTransferTxnFields.AssetReceiver) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver)) + 7 + msgp.BytesPrefixSize + len((*z).encodedAssetTransferTxnFields.AssetCloseTo) + 9 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) + 5 + msgp.BytesPrefixSize + len((*z).encodedAssetFreezeTxnFields.FreezeAccount) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) + 5 + msgp.ArrayHeaderSize - for zb0017 := range (*z).encodedAssetFreezeTxnFields.FreezeAsset { - s += (*z).encodedAssetFreezeTxnFields.FreezeAsset[zb0017].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) + 5 + msgp.ArrayHeaderSize - for zb0018 := range (*z).encodedApplicationCallTxnFields.ApplicationID { - s += (*z).encodedApplicationCallTxnFields.ApplicationID[zb0018].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationID)) + 5 + msgp.BytesPrefixSize + len((*z).encodedApplicationCallTxnFields.OnCompletion) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion)) + 5 + msgp.ArrayHeaderSize - for zb0019 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs { - s += msgp.ArrayHeaderSize - for zb0020 := range (*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019] { - s += msgp.BytesPrefixSize + len((*z).encodedApplicationCallTxnFields.ApplicationArgs[zb0019][zb0020]) - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs)) + 5 + msgp.ArrayHeaderSize - for zb0021 := range (*z).encodedApplicationCallTxnFields.Accounts { - s += msgp.ArrayHeaderSize - for zb0022 := range (*z).encodedApplicationCallTxnFields.Accounts[zb0021] { - s += (*z).encodedApplicationCallTxnFields.Accounts[zb0021][zb0022].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskAccounts)) + 5 + msgp.ArrayHeaderSize - for zb0023 := range (*z).encodedApplicationCallTxnFields.ForeignApps { - s += msgp.ArrayHeaderSize - for zb0024 := range (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023] { - s += (*z).encodedApplicationCallTxnFields.ForeignApps[zb0023][zb0024].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskForeignApps)) + 5 + msgp.ArrayHeaderSize - for zb0025 := range (*z).encodedApplicationCallTxnFields.ForeignAssets { - s += msgp.ArrayHeaderSize - for zb0026 := range (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025] { - s += (*z).encodedApplicationCallTxnFields.ForeignAssets[zb0025][zb0026].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedApplicationCallTxnFields.LocalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedApplicationCallTxnFields.LocalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedApplicationCallTxnFields.GlobalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) + 5 + msgp.ArrayHeaderSize - for zb0031 := range (*z).encodedApplicationCallTxnFields.ApprovalProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.ApprovalProgram[zb0031])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram)) + 5 + msgp.ArrayHeaderSize - for zb0032 := range (*z).encodedApplicationCallTxnFields.ClearStateProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.ClearStateProgram[zb0032])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedApplicationCallTxnFields.ExtraProgramPages) * (msgp.Uint32Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) + 8 + msgp.ArrayHeaderSize - for zb0034 := range (*z).encodedCompactCertTxnFields.CertRound { - s += (*z).encodedCompactCertTxnFields.CertRound[zb0034].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.BitmaskCertRound)) + 9 + msgp.ArrayHeaderSize - for zb0035 := range (*z).encodedCompactCertTxnFields.CertType { - s += (*z).encodedCompactCertTxnFields.CertType[zb0035].Msgsize() - } - s += 11 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.BitmaskCertType)) + 6 + msgp.BytesPrefixSize + len((*z).encodedCompactCertTxnFields.encodedCert.SigCommit) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) + 6 + msgp.ArrayHeaderSize + (len((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) + 6 + msgp.ArrayHeaderSize - for zb0037 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs { - s += msgp.ArrayHeaderSize - for zb0038 := range (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037] { - s += (*z).encodedCompactCertTxnFields.encodedCert.SigProofs[zb0037][zb0038].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) + 6 + msgp.ArrayHeaderSize - for zb0039 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs { - s += msgp.ArrayHeaderSize - for zb0040 := range (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039] { - s += (*z).encodedCompactCertTxnFields.encodedCert.PartProofs[zb0039][zb0040].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) + 6 + msgp.ArrayHeaderSize - for zb0041 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals { - s += msgp.MapHeaderSize - if (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] != nil { - for zb0042, zb0043 := range (*z).encodedCompactCertTxnFields.encodedCert.Reveals[zb0041] { - _ = zb0042 - _ = zb0043 - s += 0 + msgp.Uint64Size + zb0043.Msgsize() - } - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *encodedTxns) MsgIsZero() bool { - return (len((*z).TxType) == 0) && (len((*z).BitmaskTxType) == 0) && ((*z).TxTypeOffset == 0) && (len((*z).encodedTxnHeaders.Sender) == 0) && (len((*z).encodedTxnHeaders.BitmaskSender) == 0) && (len((*z).encodedTxnHeaders.Fee) == 0) && (len((*z).encodedTxnHeaders.BitmaskFee) == 0) && (len((*z).encodedTxnHeaders.FirstValid) == 0) && (len((*z).encodedTxnHeaders.BitmaskFirstValid) == 0) && (len((*z).encodedTxnHeaders.LastValid) == 0) && (len((*z).encodedTxnHeaders.BitmaskLastValid) == 0) && (len((*z).encodedTxnHeaders.Note) == 0) && (len((*z).encodedTxnHeaders.BitmaskNote) == 0) && (len((*z).encodedTxnHeaders.BitmaskGenesisID) == 0) && (len((*z).encodedTxnHeaders.BitmaskGroup) == 0) && (len((*z).encodedTxnHeaders.Lease) == 0) && (len((*z).encodedTxnHeaders.BitmaskLease) == 0) && (len((*z).encodedTxnHeaders.RekeyTo) == 0) && (len((*z).encodedTxnHeaders.BitmaskRekeyTo) == 0) && (len((*z).encodedKeyregTxnFields.VotePK) == 0) && (len((*z).encodedKeyregTxnFields.SelectionPK) == 0) && (len((*z).encodedKeyregTxnFields.VoteFirst) == 0) && (len((*z).encodedKeyregTxnFields.BitmaskVoteFirst) == 0) && (len((*z).encodedKeyregTxnFields.VoteLast) == 0) && (len((*z).encodedKeyregTxnFields.BitmaskVoteLast) == 0) && (len((*z).encodedKeyregTxnFields.VoteKeyDilution) == 0) && (len((*z).encodedKeyregTxnFields.BitmaskKeys) == 0) && (len((*z).encodedKeyregTxnFields.BitmaskNonparticipation) == 0) && (len((*z).encodedPaymentTxnFields.Receiver) == 0) && (len((*z).encodedPaymentTxnFields.BitmaskReceiver) == 0) && (len((*z).encodedPaymentTxnFields.Amount) == 0) && (len((*z).encodedPaymentTxnFields.BitmaskAmount) == 0) && (len((*z).encodedPaymentTxnFields.CloseRemainderTo) == 0) && (len((*z).encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0) && (len((*z).encodedAssetConfigTxnFields.ConfigAsset) == 0) && (len((*z).encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0) && (len((*z).encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0) && (len((*z).encodedAssetTransferTxnFields.XferAsset) == 0) && (len((*z).encodedAssetTransferTxnFields.BitmaskXferAsset) == 0) && (len((*z).encodedAssetTransferTxnFields.AssetAmount) == 0) && (len((*z).encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0) && (len((*z).encodedAssetTransferTxnFields.AssetSender) == 0) && (len((*z).encodedAssetTransferTxnFields.BitmaskAssetSender) == 0) && (len((*z).encodedAssetTransferTxnFields.AssetReceiver) == 0) && (len((*z).encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0) && (len((*z).encodedAssetTransferTxnFields.AssetCloseTo) == 0) && (len((*z).encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0) && (len((*z).encodedAssetFreezeTxnFields.FreezeAccount) == 0) && (len((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0) && (len((*z).encodedAssetFreezeTxnFields.FreezeAsset) == 0) && (len((*z).encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0) && (len((*z).encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0) && (len((*z).encodedApplicationCallTxnFields.ApplicationID) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskApplicationID) == 0) && (len((*z).encodedApplicationCallTxnFields.OnCompletion) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0) && (len((*z).encodedApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0) && (len((*z).encodedApplicationCallTxnFields.Accounts) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskAccounts) == 0) && (len((*z).encodedApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskForeignApps) == 0) && (len((*z).encodedApplicationCallTxnFields.ForeignAssets) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0) && (len((*z).encodedApplicationCallTxnFields.LocalNumUint) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0) && (len((*z).encodedApplicationCallTxnFields.LocalNumByteSlice) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0) && (len((*z).encodedApplicationCallTxnFields.GlobalNumUint) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0) && (len((*z).encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0) && (len((*z).encodedApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0) && (len((*z).encodedApplicationCallTxnFields.ClearStateProgram) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0) && (len((*z).encodedApplicationCallTxnFields.ExtraProgramPages) == 0) && (len((*z).encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0) && (len((*z).encodedCompactCertTxnFields.CertRound) == 0) && (len((*z).encodedCompactCertTxnFields.BitmaskCertRound) == 0) && (len((*z).encodedCompactCertTxnFields.CertType) == 0) && (len((*z).encodedCompactCertTxnFields.BitmaskCertType) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.SigCommit) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.SigProofs) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.PartProofs) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.Reveals) == 0) && (len((*z).encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *packedTransactionGroups) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0001Len := uint32(3) - var zb0001Mask uint8 /* 4 bits */ - if (*z).CompressionFormat == 0 { - zb0001Len-- - zb0001Mask |= 0x2 - } - if len((*z).Bytes) == 0 { - zb0001Len-- - zb0001Mask |= 0x4 - } - if (*z).LenDecompressedBytes == 0 { - zb0001Len-- - zb0001Mask |= 0x8 - } - // variable map header, size zb0001Len - o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len != 0 { - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendByte(o, (*z).CompressionFormat) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "g" - o = append(o, 0xa1, 0x67) - o = msgp.AppendBytes(o, (*z).Bytes) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "l" - o = append(o, 0xa1, 0x6c) - o = msgp.AppendUint64(o, (*z).LenDecompressedBytes) - } - } - return -} - -func (_ *packedTransactionGroups) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*packedTransactionGroups) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *packedTransactionGroups) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0001 int - var zb0002 bool - zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0001 > 0 { - zb0001-- - var zb0003 int - zb0003, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Bytes") - return - } - if zb0003 > maxEncodedTransactionGroupBytes { - err = msgp.ErrOverflow(uint64(zb0003), uint64(maxEncodedTransactionGroupBytes)) - return - } - (*z).Bytes, bts, err = msgp.ReadBytesBytes(bts, (*z).Bytes) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Bytes") - return - } - } - if zb0001 > 0 { - zb0001-- - (*z).CompressionFormat, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CompressionFormat") - return - } - } - if zb0001 > 0 { - zb0001-- - (*z).LenDecompressedBytes, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LenDecompressedBytes") - return - } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = packedTransactionGroups{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "g": - var zb0004 int - zb0004, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Bytes") - return - } - if zb0004 > maxEncodedTransactionGroupBytes { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxEncodedTransactionGroupBytes)) - return - } - (*z).Bytes, bts, err = msgp.ReadBytesBytes(bts, (*z).Bytes) - if err != nil { - err = msgp.WrapError(err, "Bytes") - return - } - case "c": - (*z).CompressionFormat, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CompressionFormat") - return - } - case "l": - (*z).LenDecompressedBytes, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LenDecompressedBytes") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *packedTransactionGroups) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*packedTransactionGroups) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *packedTransactionGroups) Msgsize() (s int) { - s = 1 + 2 + msgp.BytesPrefixSize + len((*z).Bytes) + 2 + msgp.ByteSize + 2 + msgp.Uint64Size - return -} - -// MsgIsZero returns whether this is a zero value -func (z *packedTransactionGroups) MsgIsZero() bool { - return (len((*z).Bytes) == 0) && ((*z).CompressionFormat == 0) && ((*z).LenDecompressedBytes == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z program) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - o = msgp.AppendBytes(o, []byte(z)) - return -} - -func (_ program) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(program) - if !ok { - _, ok = (z).(*program) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *program) UnmarshalMsg(bts []byte) (o []byte, err error) { - { - var zb0001 []byte - var zb0002 int - zb0002, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0002), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0001, bts, err = msgp.ReadBytesBytes(bts, []byte((*z))) - if err != nil { - err = msgp.WrapError(err) - return - } - (*z) = program(zb0001) - } - o = bts - return -} - -func (_ *program) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*program) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z program) Msgsize() (s int) { - s = msgp.BytesPrefixSize + len([]byte(z)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z program) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z *relayedProposal) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0001Len := uint32(3) - var zb0001Mask uint8 /* 4 bits */ - if len((*z).RawBytes) == 0 { - zb0001Len-- - zb0001Mask |= 0x2 - } - if (*z).Content == 0 { - zb0001Len-- - zb0001Mask |= 0x4 - } - if (*z).ExcludeProposal.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x8 - } - // variable map header, size zb0001Len - o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len != 0 { - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "b" - o = append(o, 0xa1, 0x62) - o = msgp.AppendBytes(o, (*z).RawBytes) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendByte(o, (*z).Content) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "e" - o = append(o, 0xa1, 0x65) - o = (*z).ExcludeProposal.MarshalMsg(o) - } - } - return -} - -func (_ *relayedProposal) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*relayedProposal) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *relayedProposal) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0001 int - var zb0002 bool - zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0001 > 0 { - zb0001-- - var zb0003 int - zb0003, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RawBytes") - return - } - if zb0003 > maxProposalSize { - err = msgp.ErrOverflow(uint64(zb0003), uint64(maxProposalSize)) - return - } - (*z).RawBytes, bts, err = msgp.ReadBytesBytes(bts, (*z).RawBytes) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RawBytes") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).ExcludeProposal.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExcludeProposal") - return - } - } - if zb0001 > 0 { - zb0001-- - (*z).Content, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Content") - return - } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = relayedProposal{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "b": - var zb0004 int - zb0004, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "RawBytes") - return - } - if zb0004 > maxProposalSize { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxProposalSize)) - return - } - (*z).RawBytes, bts, err = msgp.ReadBytesBytes(bts, (*z).RawBytes) - if err != nil { - err = msgp.WrapError(err, "RawBytes") - return - } - case "e": - bts, err = (*z).ExcludeProposal.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ExcludeProposal") - return - } - case "c": - (*z).Content, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Content") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *relayedProposal) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*relayedProposal) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *relayedProposal) Msgsize() (s int) { - s = 1 + 2 + msgp.BytesPrefixSize + len((*z).RawBytes) + 2 + (*z).ExcludeProposal.Msgsize() + 2 + msgp.ByteSize - return -} - -// MsgIsZero returns whether this is a zero value -func (z *relayedProposal) MsgIsZero() bool { - return (len((*z).RawBytes) == 0) && ((*z).ExcludeProposal.MsgIsZero()) && ((*z).Content == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *requestParams) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0001Len := uint32(2) - var zb0001Mask uint8 /* 3 bits */ - if (*z).Modulator == 0 { - zb0001Len-- - zb0001Mask |= 0x2 - } - if (*z).Offset == 0 { - zb0001Len-- - zb0001Mask |= 0x4 - } - // variable map header, size zb0001Len - o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len != 0 { - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendByte(o, (*z).Modulator) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "o" - o = append(o, 0xa1, 0x6f) - o = msgp.AppendByte(o, (*z).Offset) - } - } - return -} - -func (_ *requestParams) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*requestParams) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *requestParams) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0001 int - var zb0002 bool - zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0001 > 0 { - zb0001-- - (*z).Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Offset") - return - } - } - if zb0001 > 0 { - zb0001-- - (*z).Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Modulator") - return - } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = requestParams{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "o": - (*z).Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Offset") - return - } - case "m": - (*z).Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Modulator") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *requestParams) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*requestParams) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *requestParams) Msgsize() (s int) { - s = 1 + 2 + msgp.ByteSize + 2 + msgp.ByteSize - return -} - -// MsgIsZero returns whether this is a zero value -func (z *requestParams) MsgIsZero() bool { - return ((*z).Offset == 0) && ((*z).Modulator == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z revealMap) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - if z == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len(z))) - } - za0002_keys := make([]uint64, 0, len(z)) - for za0002 := range z { - za0002_keys = append(za0002_keys, za0002) - } - sort.Sort(SortUint64(za0002_keys)) - for _, za0002 := range za0002_keys { - za0003 := z[za0002] - _ = za0003 - o = msgp.AppendUint64(o, za0002) - o = za0003.MarshalMsg(o) - } - return -} - -func (_ revealMap) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(revealMap) - if !ok { - _, ok = (z).(*revealMap) - } - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *revealMap) UnmarshalMsg(bts []byte) (o []byte, err error) { - var zb0003 int - var zb0004 bool - zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0003), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err) - return - } - if zb0004 { - (*z) = nil - } else if (*z) == nil { - (*z) = make(revealMap, zb0003) - } - for zb0003 > 0 { - var zb0001 uint64 - var zb0002 compactcert.Reveal - zb0003-- - zb0001, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - bts, err = zb0002.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, zb0001) - return - } - (*z)[zb0001] = zb0002 - } - o = bts - return -} - -func (_ *revealMap) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*revealMap) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z revealMap) Msgsize() (s int) { - s = msgp.MapHeaderSize - if z != nil { - for za0002, za0003 := range z { - _ = za0002 - _ = za0003 - s += 0 + msgp.Uint64Size + za0003.Msgsize() - } - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z revealMap) MsgIsZero() bool { - return len(z) == 0 -} - -// MarshalMsg implements msgp.Marshaler -func (z *timingParams) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0002Len := uint32(4) - var zb0002Mask uint8 /* 5 bits */ - if len((*z).AcceptedMsgSeq) == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - if (*z).NextMsgMinDelay == 0 { - zb0002Len-- - zb0002Mask |= 0x4 - } - if (*z).ResponseElapsedTime == 0 { - zb0002Len-- - zb0002Mask |= 0x8 - } - if (*z).RefTxnBlockMsgSeq == 0 { - zb0002Len-- - zb0002Mask |= 0x10 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if zb0002Len != 0 { - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "a" - o = append(o, 0xa1, 0x61) - if (*z).AcceptedMsgSeq == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).AcceptedMsgSeq))) - } - for zb0001 := range (*z).AcceptedMsgSeq { - o = msgp.AppendUint64(o, (*z).AcceptedMsgSeq[zb0001]) - } - } - if (zb0002Mask & 0x4) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendUint64(o, (*z).NextMsgMinDelay) - } - if (zb0002Mask & 0x8) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendUint64(o, (*z).ResponseElapsedTime) - } - if (zb0002Mask & 0x10) == 0 { // if not empty - // string "s" - o = append(o, 0xa1, 0x73) - o = msgp.AppendUint64(o, (*z).RefTxnBlockMsgSeq) - } - } - return -} - -func (_ *timingParams) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*timingParams) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *timingParams) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > 0 { - zb0002-- - (*z).RefTxnBlockMsgSeq, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RefTxnBlockMsgSeq") - return - } - } - if zb0002 > 0 { - zb0002-- - (*z).ResponseElapsedTime, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ResponseElapsedTime") - return - } - } - if zb0002 > 0 { - zb0002-- - var zb0004 int - var zb0005 bool - zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AcceptedMsgSeq") - return - } - if zb0004 > maxAcceptedMsgSeq { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxAcceptedMsgSeq)) - err = msgp.WrapError(err, "struct-from-array", "AcceptedMsgSeq") - return - } - if zb0005 { - (*z).AcceptedMsgSeq = nil - } else if (*z).AcceptedMsgSeq != nil && cap((*z).AcceptedMsgSeq) >= zb0004 { - (*z).AcceptedMsgSeq = ((*z).AcceptedMsgSeq)[:zb0004] - } else { - (*z).AcceptedMsgSeq = make([]uint64, zb0004) - } - for zb0001 := range (*z).AcceptedMsgSeq { - (*z).AcceptedMsgSeq[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AcceptedMsgSeq", zb0001) - return - } - } - } - if zb0002 > 0 { - zb0002-- - (*z).NextMsgMinDelay, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NextMsgMinDelay") - return - } - } - if zb0002 > 0 { - err = msgp.ErrTooManyArrayFields(zb0002) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = timingParams{} - } - for zb0002 > 0 { - zb0002-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "s": - (*z).RefTxnBlockMsgSeq, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "RefTxnBlockMsgSeq") - return - } - case "r": - (*z).ResponseElapsedTime, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "ResponseElapsedTime") - return - } - case "a": - var zb0006 int - var zb0007 bool - zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AcceptedMsgSeq") - return - } - if zb0006 > maxAcceptedMsgSeq { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxAcceptedMsgSeq)) - err = msgp.WrapError(err, "AcceptedMsgSeq") - return - } - if zb0007 { - (*z).AcceptedMsgSeq = nil - } else if (*z).AcceptedMsgSeq != nil && cap((*z).AcceptedMsgSeq) >= zb0006 { - (*z).AcceptedMsgSeq = ((*z).AcceptedMsgSeq)[:zb0006] - } else { - (*z).AcceptedMsgSeq = make([]uint64, zb0006) - } - for zb0001 := range (*z).AcceptedMsgSeq { - (*z).AcceptedMsgSeq[zb0001], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "AcceptedMsgSeq", zb0001) - return - } - } - case "m": - (*z).NextMsgMinDelay, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "NextMsgMinDelay") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *timingParams) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*timingParams) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *timingParams) Msgsize() (s int) { - s = 1 + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.ArrayHeaderSize + (len((*z).AcceptedMsgSeq) * (msgp.Uint64Size)) + 2 + msgp.Uint64Size - return -} - -// MsgIsZero returns whether this is a zero value -func (z *timingParams) MsgIsZero() bool { - return ((*z).RefTxnBlockMsgSeq == 0) && ((*z).ResponseElapsedTime == 0) && (len((*z).AcceptedMsgSeq) == 0) && ((*z).NextMsgMinDelay == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *transactionBlockMessage) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0001Len := uint32(7) - var zb0001Mask uint8 /* 8 bits */ - if (*z).TxnBloomFilter.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x2 - } - if (*z).TransactionGroups.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x4 - } - if ((*z).UpdatedRequestParams.Offset == 0) && ((*z).UpdatedRequestParams.Modulator == 0) { - zb0001Len-- - zb0001Mask |= 0x8 - } - if (*z).Round.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x10 - } - if (*z).RelayedProposal.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x20 - } - if (*z).MsgSync.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x40 - } - if (*z).Version == 0 { - zb0001Len-- - zb0001Mask |= 0x80 - } - // variable map header, size zb0001Len - o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len != 0 { - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "b" - o = append(o, 0xa1, 0x62) - o = (*z).TxnBloomFilter.MarshalMsg(o) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "g" - o = append(o, 0xa1, 0x67) - o = (*z).TransactionGroups.MarshalMsg(o) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "p" - o = append(o, 0xa1, 0x70) - // omitempty: check for empty values - zb0002Len := uint32(2) - var zb0002Mask uint8 /* 3 bits */ - if (*z).UpdatedRequestParams.Modulator == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - if (*z).UpdatedRequestParams.Offset == 0 { - zb0002Len-- - zb0002Mask |= 0x4 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendByte(o, (*z).UpdatedRequestParams.Modulator) - } - if (zb0002Mask & 0x4) == 0 { // if not empty - // string "o" - o = append(o, 0xa1, 0x6f) - o = msgp.AppendByte(o, (*z).UpdatedRequestParams.Offset) - } - } - if (zb0001Mask & 0x10) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = (*z).Round.MarshalMsg(o) - } - if (zb0001Mask & 0x20) == 0 { // if not empty - // string "rp" - o = append(o, 0xa2, 0x72, 0x70) - o = (*z).RelayedProposal.MarshalMsg(o) - } - if (zb0001Mask & 0x40) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - o = (*z).MsgSync.MarshalMsg(o) - } - if (zb0001Mask & 0x80) == 0 { // if not empty - // string "v" - o = append(o, 0xa1, 0x76) - o = msgp.AppendInt32(o, (*z).Version) - } - } - return -} - -func (_ *transactionBlockMessage) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*transactionBlockMessage) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *transactionBlockMessage) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0001 int - var zb0002 bool - zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0001 > 0 { - zb0001-- - (*z).Version, bts, err = msgp.ReadInt32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).Round.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Round") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).TxnBloomFilter.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnBloomFilter") - return - } - } - if zb0001 > 0 { - zb0001-- - var zb0003 int - var zb0004 bool - zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams") - return - } - if zb0003 > 0 { - zb0003-- - (*z).UpdatedRequestParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams", "struct-from-array", "Offset") - return - } - } - if zb0003 > 0 { - zb0003-- - (*z).UpdatedRequestParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams", "struct-from-array", "Modulator") - return - } - } - if zb0003 > 0 { - err = msgp.ErrTooManyArrayFields(zb0003) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams", "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams") - return - } - if zb0004 { - (*z).UpdatedRequestParams = requestParams{} - } - for zb0003 > 0 { - zb0003-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams") - return - } - switch string(field) { - case "o": - (*z).UpdatedRequestParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams", "Offset") - return - } - case "m": - (*z).UpdatedRequestParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams", "Modulator") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UpdatedRequestParams") - return - } - } - } - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).TransactionGroups.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TransactionGroups") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).MsgSync.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MsgSync") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).RelayedProposal.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RelayedProposal") - return - } - } - if zb0001 > 0 { - err = msgp.ErrTooManyArrayFields(zb0001) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 { - (*z) = transactionBlockMessage{} - } - for zb0001 > 0 { - zb0001-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "v": - (*z).Version, bts, err = msgp.ReadInt32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - case "r": - bts, err = (*z).Round.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Round") - return - } - case "b": - bts, err = (*z).TxnBloomFilter.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "TxnBloomFilter") - return - } - case "p": - var zb0005 int - var zb0006 bool - zb0005, zb0006, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams") - return - } - if zb0005 > 0 { - zb0005-- - (*z).UpdatedRequestParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams", "struct-from-array", "Offset") - return - } - } - if zb0005 > 0 { - zb0005-- - (*z).UpdatedRequestParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams", "struct-from-array", "Modulator") - return - } - } - if zb0005 > 0 { - err = msgp.ErrTooManyArrayFields(zb0005) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams", "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams") - return - } - if zb0006 { - (*z).UpdatedRequestParams = requestParams{} - } - for zb0005 > 0 { - zb0005-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams") - return - } - switch string(field) { - case "o": - (*z).UpdatedRequestParams.Offset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams", "Offset") - return - } - case "m": - (*z).UpdatedRequestParams.Modulator, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams", "Modulator") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "UpdatedRequestParams") - return - } - } - } - } - case "g": - bts, err = (*z).TransactionGroups.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "TransactionGroups") - return - } - case "t": - bts, err = (*z).MsgSync.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "MsgSync") - return - } - case "rp": - bts, err = (*z).RelayedProposal.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "RelayedProposal") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *transactionBlockMessage) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*transactionBlockMessage) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *transactionBlockMessage) Msgsize() (s int) { - s = 1 + 2 + msgp.Int32Size + 2 + (*z).Round.Msgsize() + 2 + (*z).TxnBloomFilter.Msgsize() + 2 + 1 + 2 + msgp.ByteSize + 2 + msgp.ByteSize + 2 + (*z).TransactionGroups.Msgsize() + 2 + (*z).MsgSync.Msgsize() + 3 + (*z).RelayedProposal.Msgsize() - return -} - -// MsgIsZero returns whether this is a zero value -func (z *transactionBlockMessage) MsgIsZero() bool { - return ((*z).Version == 0) && ((*z).Round.MsgIsZero()) && ((*z).TxnBloomFilter.MsgIsZero()) && (((*z).UpdatedRequestParams.Offset == 0) && ((*z).UpdatedRequestParams.Modulator == 0)) && ((*z).TransactionGroups.MsgIsZero()) && ((*z).MsgSync.MsgIsZero()) && ((*z).RelayedProposal.MsgIsZero()) -} - -// MarshalMsg implements msgp.Marshaler -func (z *txGroupsEncodingStub) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0049Len := uint32(129) - var zb0049Mask [3]uint64 /* 144 bits */ - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x10000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x20000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x40000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x80000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x100000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x200000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x400000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x800000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x1000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x2000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x4000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound) == 0 { - zb0049Len-- - zb0049Mask[0] |= 0x8000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000 - } - if len((*z).encodedSignedTxns.encodedLsigs.LogicArgs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000 - } - if len((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000 - } - if len((*z).encodedSignedTxns.encodedLsigs.Logic) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000 - } - if len((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.Threshold) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.Version) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x10000000000000 - } - if len((*z).encodedSignedTxns.AuthAddr) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x20000000000000 - } - if len((*z).encodedSignedTxns.BitmaskAuthAddr) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x40000000000000 - } - if len((*z).encodedSignedTxns.Sig) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x80000000000000 - } - if len((*z).encodedSignedTxns.BitmaskSig) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x100000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x200000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x400000000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.Subsigs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x800000000000000 - } - if len((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x1000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x2000000000000000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x4000000000000000 - } - if (*z).TransactionGroupCount == 0 { - zb0049Len-- - zb0049Mask[1] |= 0x8000000000000000 - } - if len((*z).TransactionGroupSizes) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x1 - } - if (*z).TotalTransactionsCount == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x2 - } - if len((*z).encodedSignedTxns.encodedTxns.TxType) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x4 - } - if len((*z).encodedSignedTxns.encodedTxns.BitmaskTxType) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x8 - } - if (*z).encodedSignedTxns.encodedTxns.TxTypeOffset == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x10 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x20 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x40 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x80 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x100 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x200 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x400 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x800 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x1000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x2000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x4000 - } - if len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset) == 0 { - zb0049Len-- - zb0049Mask[2] |= 0x8000 - } - // variable map header, size zb0049Len - o = msgp.AppendMapHeader(o, zb0049Len) - if zb0049Len != 0 { - if (zb0049Mask[0] & 0x8000) == 0 { // if not empty - // string "aamt" - o = append(o, 0xa4, 0x61, 0x61, 0x6d, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount))) - } - for zb0021 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021]) - } - } - if (zb0049Mask[0] & 0x10000) == 0 { // if not empty - // string "aamtbm" - o = append(o, 0xa6, 0x61, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - } - if (zb0049Mask[0] & 0x20000) == 0 { // if not empty - // string "aclose" - o = append(o, 0xa6, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - } - if (zb0049Mask[0] & 0x40000) == 0 { // if not empty - // string "aclosebm" - o = append(o, 0xa8, 0x61, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - } - if (zb0049Mask[0] & 0x80000) == 0 { // if not empty - // string "afrzbm" - o = append(o, 0xa6, 0x61, 0x66, 0x72, 0x7a, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - } - if (zb0049Mask[0] & 0x100000) == 0 { // if not empty - // string "am" - o = append(o, 0xa2, 0x61, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - } - if (zb0049Mask[0] & 0x200000) == 0 { // if not empty - // string "ambm" - o = append(o, 0xa4, 0x61, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - } - if (zb0049Mask[0] & 0x400000) == 0 { // if not empty - // string "amt" - o = append(o, 0xa3, 0x61, 0x6d, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount))) - } - for zb0013 := range (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount { - o = (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount[zb0013].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x800000) == 0 { // if not empty - // string "amtbm" - o = append(o, 0xa5, 0x61, 0x6d, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - } - if (zb0049Mask[0] & 0x1000000) == 0 { // if not empty - // string "an" - o = append(o, 0xa2, 0x61, 0x6e) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName))) - } - for zb0018 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - o = msgp.AppendString(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018]) - } - } - if (zb0049Mask[0] & 0x2000000) == 0 { // if not empty - // string "anbm" - o = append(o, 0xa4, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - } - if (zb0049Mask[0] & 0x4000000) == 0 { // if not empty - // string "apaa" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x61) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs))) - } - for zb0024 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]))) - } - for zb0025 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - } - } - } - if (zb0049Mask[0] & 0x8000000) == 0 { // if not empty - // string "apaabm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - } - if (zb0049Mask[0] & 0x10000000) == 0 { // if not empty - // string "apan" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x6e) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - } - if (zb0049Mask[0] & 0x20000000) == 0 { // if not empty - // string "apanbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - } - if (zb0049Mask[0] & 0x40000000) == 0 { // if not empty - // string "apap" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x70) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram))) - } - for zb0036 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - } - } - if (zb0049Mask[0] & 0x80000000) == 0 { // if not empty - // string "apapbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - } - if (zb0049Mask[0] & 0x100000000) == 0 { // if not empty - // string "apas" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x73) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets))) - } - for zb0030 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]))) - } - for zb0031 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - o = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x200000000) == 0 { // if not empty - // string "apasbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - } - if (zb0049Mask[0] & 0x400000000) == 0 { // if not empty - // string "apat" - o = append(o, 0xa4, 0x61, 0x70, 0x61, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts))) - } - for zb0026 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts { - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]))) - } - for zb0027 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - o = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x800000000) == 0 { // if not empty - // string "apatbm" - o = append(o, 0xa6, 0x61, 0x70, 0x61, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - } - if (zb0049Mask[0] & 0x1000000000) == 0 { // if not empty - // string "apep" - o = append(o, 0xa4, 0x61, 0x70, 0x65, 0x70) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages))) - } - for zb0038 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - o = msgp.AppendUint32(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038]) - } - } - if (zb0049Mask[0] & 0x2000000000) == 0 { // if not empty - // string "apepbm" - o = append(o, 0xa6, 0x61, 0x70, 0x65, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - } - if (zb0049Mask[0] & 0x4000000000) == 0 { // if not empty - // string "apfa" - o = append(o, 0xa4, 0x61, 0x70, 0x66, 0x61) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps))) - } - for zb0028 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]))) - } - for zb0029 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - o = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x8000000000) == 0 { // if not empty - // string "apfabm" - o = append(o, 0xa6, 0x61, 0x70, 0x66, 0x61, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - } - if (zb0049Mask[0] & 0x10000000000) == 0 { // if not empty - // string "apid" - o = append(o, 0xa4, 0x61, 0x70, 0x69, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID))) - } - for zb0023 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - o = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x20000000000) == 0 { // if not empty - // string "apidbm" - o = append(o, 0xa6, 0x61, 0x70, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - } - if (zb0049Mask[0] & 0x40000000000) == 0 { // if not empty - // string "apsu" - o = append(o, 0xa4, 0x61, 0x70, 0x73, 0x75) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram))) - } - for zb0037 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - } - } - if (zb0049Mask[0] & 0x80000000000) == 0 { // if not empty - // string "apsubm" - o = append(o, 0xa6, 0x61, 0x70, 0x73, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - } - if (zb0049Mask[0] & 0x100000000000) == 0 { // if not empty - // string "arcv" - o = append(o, 0xa4, 0x61, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - } - if (zb0049Mask[0] & 0x200000000000) == 0 { // if not empty - // string "arcvbm" - o = append(o, 0xa6, 0x61, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - } - if (zb0049Mask[0] & 0x400000000000) == 0 { // if not empty - // string "asnd" - o = append(o, 0xa4, 0x61, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) - } - if (zb0049Mask[0] & 0x800000000000) == 0 { // if not empty - // string "asndbm" - o = append(o, 0xa6, 0x61, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - } - if (zb0049Mask[0] & 0x1000000000000) == 0 { // if not empty - // string "au" - o = append(o, 0xa2, 0x61, 0x75) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL))) - } - for zb0019 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - o = msgp.AppendString(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019]) - } - } - if (zb0049Mask[0] & 0x2000000000000) == 0 { // if not empty - // string "aubm" - o = append(o, 0xa4, 0x61, 0x75, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - } - if (zb0049Mask[0] & 0x4000000000000) == 0 { // if not empty - // string "c" - o = append(o, 0xa1, 0x63) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - } - if (zb0049Mask[0] & 0x8000000000000) == 0 { // if not empty - // string "caid" - o = append(o, 0xa4, 0x63, 0x61, 0x69, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset))) - } - for zb0014 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - o = (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x10000000000000) == 0 { // if not empty - // string "caidbm" - o = append(o, 0xa6, 0x63, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - } - if (zb0049Mask[0] & 0x20000000000000) == 0 { // if not empty - // string "cbm" - o = append(o, 0xa3, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - } - if (zb0049Mask[0] & 0x40000000000000) == 0 { // if not empty - // string "certP" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x50) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs))) - } - for zb0044 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]))) - } - for zb0045 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - o = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x80000000000000) == 0 { // if not empty - // string "certPbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x50, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - } - if (zb0049Mask[0] & 0x100000000000000) == 0 { // if not empty - // string "certS" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x53) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs))) - } - for zb0042 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]))) - } - for zb0043 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - o = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x200000000000000) == 0 { // if not empty - // string "certSbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x53, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - } - if (zb0049Mask[0] & 0x400000000000000) == 0 { // if not empty - // string "certc" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x63) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - } - if (zb0049Mask[0] & 0x800000000000000) == 0 { // if not empty - // string "certcbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - } - if (zb0049Mask[0] & 0x1000000000000000) == 0 { // if not empty - // string "certr" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x72) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals))) - } - for zb0046 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendMapHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046]))) - } - zb0047_keys := make([]uint64, 0, len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046])) - for zb0047 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] { - zb0047_keys = append(zb0047_keys, zb0047) - } - sort.Sort(SortUint64(zb0047_keys)) - for _, zb0047 := range zb0047_keys { - zb0048 := (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] - _ = zb0048 - o = msgp.AppendUint64(o, zb0047) - o = zb0048.MarshalMsg(o) - } - } - } - if (zb0049Mask[0] & 0x2000000000000000) == 0 { // if not empty - // string "certrbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - } - if (zb0049Mask[0] & 0x4000000000000000) == 0 { // if not empty - // string "certrnd" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound))) - } - for zb0039 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound { - o = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].MarshalMsg(o) - } - } - if (zb0049Mask[0] & 0x8000000000000000) == 0 { // if not empty - // string "certrndbm" - o = append(o, 0xa9, 0x63, 0x65, 0x72, 0x74, 0x72, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - } - if (zb0049Mask[1] & 0x1) == 0 { // if not empty - // string "certtype" - o = append(o, 0xa8, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType))) - } - for zb0040 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType { - o = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x2) == 0 { // if not empty - // string "certtypebm" - o = append(o, 0xaa, 0x63, 0x65, 0x72, 0x74, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - } - if (zb0049Mask[1] & 0x4) == 0 { // if not empty - // string "certw" - o = append(o, 0xa5, 0x63, 0x65, 0x72, 0x74, 0x77) - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight))) - } - for zb0041 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041]) - } - } - if (zb0049Mask[1] & 0x8) == 0 { // if not empty - // string "certwbm" - o = append(o, 0xa7, 0x63, 0x65, 0x72, 0x74, 0x77, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - } - if (zb0049Mask[1] & 0x10) == 0 { // if not empty - // string "close" - o = append(o, 0xa5, 0x63, 0x6c, 0x6f, 0x73, 0x65) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - } - if (zb0049Mask[1] & 0x20) == 0 { // if not empty - // string "closebm" - o = append(o, 0xa7, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - } - if (zb0049Mask[1] & 0x40) == 0 { // if not empty - // string "dc" - o = append(o, 0xa2, 0x64, 0x63) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals))) - } - for zb0016 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - o = msgp.AppendUint32(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016]) - } - } - if (zb0049Mask[1] & 0x80) == 0 { // if not empty - // string "dcbm" - o = append(o, 0xa4, 0x64, 0x63, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - } - if (zb0049Mask[1] & 0x100) == 0 { // if not empty - // string "dfbm" - o = append(o, 0xa4, 0x64, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - } - if (zb0049Mask[1] & 0x200) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - } - if (zb0049Mask[1] & 0x400) == 0 { // if not empty - // string "fadd" - o = append(o, 0xa4, 0x66, 0x61, 0x64, 0x64) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - } - if (zb0049Mask[1] & 0x800) == 0 { // if not empty - // string "faddbm" - o = append(o, 0xa6, 0x66, 0x61, 0x64, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - } - if (zb0049Mask[1] & 0x1000) == 0 { // if not empty - // string "faid" - o = append(o, 0xa4, 0x66, 0x61, 0x69, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset))) - } - for zb0022 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - o = (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x2000) == 0 { // if not empty - // string "faidbm" - o = append(o, 0xa6, 0x66, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - } - if (zb0049Mask[1] & 0x4000) == 0 { // if not empty - // string "fbm" - o = append(o, 0xa3, 0x66, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - } - if (zb0049Mask[1] & 0x8000) == 0 { // if not empty - // string "fee" - o = append(o, 0xa3, 0x66, 0x65, 0x65) - if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee))) - } - for zb0006 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee { - o = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee[zb0006].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x10000) == 0 { // if not empty - // string "feebm" - o = append(o, 0xa5, 0x66, 0x65, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee)) - } - if (zb0049Mask[1] & 0x20000) == 0 { // if not empty - // string "fv" - o = append(o, 0xa2, 0x66, 0x76) - if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid))) - } - for zb0007 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid { - o = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid[zb0007].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x40000) == 0 { // if not empty - // string "fvbm" - o = append(o, 0xa4, 0x66, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - } - if (zb0049Mask[1] & 0x80000) == 0 { // if not empty - // string "genbm" - o = append(o, 0xa5, 0x67, 0x65, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - } - if (zb0049Mask[1] & 0x100000) == 0 { // if not empty - // string "gnbs" - o = append(o, 0xa4, 0x67, 0x6e, 0x62, 0x73) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice))) - } - for zb0035 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035]) - } - } - if (zb0049Mask[1] & 0x200000) == 0 { // if not empty - // string "gnbsbm" - o = append(o, 0xa6, 0x67, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - } - if (zb0049Mask[1] & 0x400000) == 0 { // if not empty - // string "gnui" - o = append(o, 0xa4, 0x67, 0x6e, 0x75, 0x69) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint))) - } - for zb0034 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034]) - } - } - if (zb0049Mask[1] & 0x800000) == 0 { // if not empty - // string "gnuibm" - o = append(o, 0xa6, 0x67, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - } - if (zb0049Mask[1] & 0x1000000) == 0 { // if not empty - // string "grpbm" - o = append(o, 0xa5, 0x67, 0x72, 0x70, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup)) - } - if (zb0049Mask[1] & 0x2000000) == 0 { // if not empty - // string "lnbs" - o = append(o, 0xa4, 0x6c, 0x6e, 0x62, 0x73) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice))) - } - for zb0033 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033]) - } - } - if (zb0049Mask[1] & 0x4000000) == 0 { // if not empty - // string "lnbsbm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x62, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - } - if (zb0049Mask[1] & 0x8000000) == 0 { // if not empty - // string "lnui" - o = append(o, 0xa4, 0x6c, 0x6e, 0x75, 0x69) - if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint))) - } - for zb0032 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032]) - } - } - if (zb0049Mask[1] & 0x10000000) == 0 { // if not empty - // string "lnuibm" - o = append(o, 0xa6, 0x6c, 0x6e, 0x75, 0x69, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - } - if (zb0049Mask[1] & 0x20000000) == 0 { // if not empty - // string "lsigarg" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67) - if (*z).encodedSignedTxns.encodedLsigs.LogicArgs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedLsigs.LogicArgs))) - } - for zb0004 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs { - if (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004]))) - } - for zb0005 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] { - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005]) - } - } - } - if (zb0049Mask[1] & 0x40000000) == 0 { // if not empty - // string "lsigargbm" - o = append(o, 0xa9, 0x6c, 0x73, 0x69, 0x67, 0x61, 0x72, 0x67, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs)) - } - if (zb0049Mask[1] & 0x80000000) == 0 { // if not empty - // string "lsigl" - o = append(o, 0xa5, 0x6c, 0x73, 0x69, 0x67, 0x6c) - if (*z).encodedSignedTxns.encodedLsigs.Logic == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedLsigs.Logic))) - } - for zb0003 := range (*z).encodedSignedTxns.encodedLsigs.Logic { - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedLsigs.Logic[zb0003]) - } - } - if (zb0049Mask[1] & 0x100000000) == 0 { // if not empty - // string "lsiglbm" - o = append(o, 0xa7, 0x6c, 0x73, 0x69, 0x67, 0x6c, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic)) - } - if (zb0049Mask[1] & 0x200000000) == 0 { // if not empty - // string "lv" - o = append(o, 0xa2, 0x6c, 0x76) - if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid))) - } - for zb0008 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid { - o = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid[zb0008].MarshalMsg(o) - } - } - if (zb0049Mask[1] & 0x400000000) == 0 { // if not empty - // string "lvbm" - o = append(o, 0xa4, 0x6c, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - } - if (zb0049Mask[1] & 0x800000000) == 0 { // if not empty - // string "lx" - o = append(o, 0xa2, 0x6c, 0x78) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) - } - if (zb0049Mask[1] & 0x1000000000) == 0 { // if not empty - // string "lxbm" - o = append(o, 0xa4, 0x6c, 0x78, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease)) - } - if (zb0049Mask[1] & 0x2000000000) == 0 { // if not empty - // string "m" - o = append(o, 0xa1, 0x6d) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - } - if (zb0049Mask[1] & 0x4000000000) == 0 { // if not empty - // string "mbm" - o = append(o, 0xa3, 0x6d, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - } - if (zb0049Mask[1] & 0x8000000000) == 0 { // if not empty - // string "msigthr" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedMsigs.Threshold) - } - if (zb0049Mask[1] & 0x10000000000) == 0 { // if not empty - // string "msigthrbm" - o = append(o, 0xa9, 0x6d, 0x73, 0x69, 0x67, 0x74, 0x68, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold)) - } - if (zb0049Mask[1] & 0x20000000000) == 0 { // if not empty - // string "msigv" - o = append(o, 0xa5, 0x6d, 0x73, 0x69, 0x67, 0x76) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedMsigs.Version) - } - if (zb0049Mask[1] & 0x40000000000) == 0 { // if not empty - // string "msigvbm" - o = append(o, 0xa7, 0x6d, 0x73, 0x69, 0x67, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion)) - } - if (zb0049Mask[1] & 0x80000000000) == 0 { // if not empty - // string "nonpartbm" - o = append(o, 0xa9, 0x6e, 0x6f, 0x6e, 0x70, 0x61, 0x72, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - } - if (zb0049Mask[1] & 0x100000000000) == 0 { // if not empty - // string "note" - o = append(o, 0xa4, 0x6e, 0x6f, 0x74, 0x65) - if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note))) - } - for zb0009 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note { - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009]) - } - } - if (zb0049Mask[1] & 0x200000000000) == 0 { // if not empty - // string "notebm" - o = append(o, 0xa6, 0x6e, 0x6f, 0x74, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote)) - } - if (zb0049Mask[1] & 0x400000000000) == 0 { // if not empty - // string "r" - o = append(o, 0xa1, 0x72) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - } - if (zb0049Mask[1] & 0x800000000000) == 0 { // if not empty - // string "rbm" - o = append(o, 0xa3, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - } - if (zb0049Mask[1] & 0x1000000000000) == 0 { // if not empty - // string "rcv" - o = append(o, 0xa3, 0x72, 0x63, 0x76) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) - } - if (zb0049Mask[1] & 0x2000000000000) == 0 { // if not empty - // string "rcvbm" - o = append(o, 0xa5, 0x72, 0x63, 0x76, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - } - if (zb0049Mask[1] & 0x4000000000000) == 0 { // if not empty - // string "rekey" - o = append(o, 0xa5, 0x72, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) - } - if (zb0049Mask[1] & 0x8000000000000) == 0 { // if not empty - // string "rekeybm" - o = append(o, 0xa7, 0x72, 0x65, 0x6b, 0x65, 0x79, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - } - if (zb0049Mask[1] & 0x10000000000000) == 0 { // if not empty - // string "selkey" - o = append(o, 0xa6, 0x73, 0x65, 0x6c, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) - } - if (zb0049Mask[1] & 0x20000000000000) == 0 { // if not empty - // string "sgnr" - o = append(o, 0xa4, 0x73, 0x67, 0x6e, 0x72) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.AuthAddr) - } - if (zb0049Mask[1] & 0x40000000000000) == 0 { // if not empty - // string "sgnrbm" - o = append(o, 0xa6, 0x73, 0x67, 0x6e, 0x72, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.BitmaskAuthAddr)) - } - if (zb0049Mask[1] & 0x80000000000000) == 0 { // if not empty - // string "sig" - o = append(o, 0xa3, 0x73, 0x69, 0x67) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.Sig) - } - if (zb0049Mask[1] & 0x100000000000000) == 0 { // if not empty - // string "sigbm" - o = append(o, 0xa5, 0x73, 0x69, 0x67, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.BitmaskSig)) - } - if (zb0049Mask[1] & 0x200000000000000) == 0 { // if not empty - // string "snd" - o = append(o, 0xa3, 0x73, 0x6e, 0x64) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) - } - if (zb0049Mask[1] & 0x400000000000000) == 0 { // if not empty - // string "sndbm" - o = append(o, 0xa5, 0x73, 0x6e, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender)) - } - if (zb0049Mask[1] & 0x800000000000000) == 0 { // if not empty - // string "subsig" - o = append(o, 0xa6, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67) - if (*z).encodedSignedTxns.encodedMsigs.Subsigs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedMsigs.Subsigs))) - } - for zb0001 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs { - if (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001]))) - } - for zb0002 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] { - o = (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001][zb0002].MarshalMsg(o) - } - } - } - if (zb0049Mask[1] & 0x1000000000000000) == 0 { // if not empty - // string "subsigsbm" - o = append(o, 0xa9, 0x73, 0x75, 0x62, 0x73, 0x69, 0x67, 0x73, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs)) - } - if (zb0049Mask[1] & 0x2000000000000000) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total))) - } - for zb0015 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015]) - } - } - if (zb0049Mask[1] & 0x4000000000000000) == 0 { // if not empty - // string "tbm" - o = append(o, 0xa3, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - } - if (zb0049Mask[1] & 0x8000000000000000) == 0 { // if not empty - // string "tgc" - o = append(o, 0xa3, 0x74, 0x67, 0x63) - o = msgp.AppendUint64(o, (*z).TransactionGroupCount) - } - if (zb0049Mask[2] & 0x1) == 0 { // if not empty - // string "tgs" - o = append(o, 0xa3, 0x74, 0x67, 0x73) - o = msgp.AppendBytes(o, (*z).TransactionGroupSizes) - } - if (zb0049Mask[2] & 0x2) == 0 { // if not empty - // string "ttc" - o = append(o, 0xa3, 0x74, 0x74, 0x63) - o = msgp.AppendUint64(o, (*z).TotalTransactionsCount) - } - if (zb0049Mask[2] & 0x4) == 0 { // if not empty - // string "type" - o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.TxType) - } - if (zb0049Mask[2] & 0x8) == 0 { // if not empty - // string "typebm" - o = append(o, 0xa6, 0x74, 0x79, 0x70, 0x65, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.BitmaskTxType)) - } - if (zb0049Mask[2] & 0x10) == 0 { // if not empty - // string "typeo" - o = append(o, 0xa5, 0x74, 0x79, 0x70, 0x65, 0x6f) - o = msgp.AppendByte(o, (*z).encodedSignedTxns.encodedTxns.TxTypeOffset) - } - if (zb0049Mask[2] & 0x20) == 0 { // if not empty - // string "un" - o = append(o, 0xa2, 0x75, 0x6e) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName))) - } - for zb0017 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - o = msgp.AppendString(o, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017]) - } - } - if (zb0049Mask[2] & 0x40) == 0 { // if not empty - // string "unbm" - o = append(o, 0xa4, 0x75, 0x6e, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - } - if (zb0049Mask[2] & 0x80) == 0 { // if not empty - // string "votefst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst))) - } - for zb0010 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst { - o = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x100) == 0 { // if not empty - // string "votefstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - } - if (zb0049Mask[2] & 0x200) == 0 { // if not empty - // string "votekbm" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - } - if (zb0049Mask[2] & 0x400) == 0 { // if not empty - // string "votekd" - o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution))) - } - for zb0012 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - o = msgp.AppendUint64(o, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012]) - } - } - if (zb0049Mask[2] & 0x800) == 0 { // if not empty - // string "votekey" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) - o = msgp.AppendBytes(o, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) - } - if (zb0049Mask[2] & 0x1000) == 0 { // if not empty - // string "votelst" - o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) - if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast))) - } - for zb0011 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast { - o = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x2000) == 0 { // if not empty - // string "votelstbm" - o = append(o, 0xa9, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - } - if (zb0049Mask[2] & 0x4000) == 0 { // if not empty - // string "xaid" - o = append(o, 0xa4, 0x78, 0x61, 0x69, 0x64) - if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset))) - } - for zb0020 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset { - o = (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].MarshalMsg(o) - } - } - if (zb0049Mask[2] & 0x8000) == 0 { // if not empty - // string "xaidbm" - o = append(o, 0xa6, 0x78, 0x61, 0x69, 0x64, 0x62, 0x6d) - o = msgp.AppendBytes(o, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - } - } - return -} - -func (_ *txGroupsEncodingStub) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*txGroupsEncodingStub) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *txGroupsEncodingStub) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0049 int - var zb0050 bool - zb0049, zb0050, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0049, zb0050, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0049 > 0 { - zb0049-- - (*z).TotalTransactionsCount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TotalTransactionsCount") - return - } - } - if zb0049 > 0 { - zb0049-- - (*z).TransactionGroupCount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TransactionGroupCount") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0051 int - zb0051, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TransactionGroupSizes") - return - } - if zb0051 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0051), uint64(maxEncodedTransactionGroups)) - return - } - (*z).TransactionGroupSizes, bts, err = msgp.ReadBytesBytes(bts, (*z).TransactionGroupSizes) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TransactionGroupSizes") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0052 int - zb0052, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sig") - return - } - if zb0052 > maxSignatureBytes { - err = msgp.ErrOverflow(uint64(zb0052), uint64(maxSignatureBytes)) - return - } - (*z).encodedSignedTxns.Sig, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.Sig) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sig") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0053 []byte - var zb0054 int - zb0054, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSig") - return - } - if zb0054 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0054), uint64(maxBitmaskSize)) - return - } - zb0053, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.BitmaskSig)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSig") - return - } - (*z).encodedSignedTxns.BitmaskSig = bitmask(zb0053) - } - } - if zb0049 > 0 { - zb0049-- - var zb0055 int - zb0055, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - if zb0055 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0055), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedMsigs.Version, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedMsigs.Version) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Version") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0056 []byte - var zb0057 int - zb0057, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - if zb0057 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0057), uint64(maxBitmaskSize)) - return - } - zb0056, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVersion") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskVersion = bitmask(zb0056) - } - } - if zb0049 > 0 { - zb0049-- - var zb0058 int - zb0058, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - if zb0058 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0058), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedMsigs.Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedMsigs.Threshold) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Threshold") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0059 []byte - var zb0060 int - zb0060, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - if zb0060 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0060), uint64(maxBitmaskSize)) - return - } - zb0059, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskThreshold") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold = bitmask(zb0059) - } - } - if zb0049 > 0 { - zb0049-- - var zb0061 int - var zb0062 bool - zb0061, zb0062, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0061 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0061), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs") - return - } - if zb0062 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = nil - } else if (*z).encodedSignedTxns.encodedMsigs.Subsigs != nil && cap((*z).encodedSignedTxns.encodedMsigs.Subsigs) >= zb0061 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = ((*z).encodedSignedTxns.encodedMsigs.Subsigs)[:zb0061] - } else { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = make([][]crypto.MultisigSubsig, zb0061) - } - for zb0001 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs { - var zb0063 int - var zb0064 bool - zb0063, zb0064, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0063 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0063), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001) - return - } - if zb0064 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = nil - } else if (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] != nil && cap((*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001]) >= zb0063 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = ((*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001])[:zb0063] - } else { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0063) - } - for zb0002 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] { - bts, err = (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Subsigs", zb0001, zb0002) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0065 []byte - var zb0066 int - zb0066, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - if zb0066 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0066), uint64(maxBitmaskSize)) - return - } - zb0065, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSubsigs") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs = bitmask(zb0065) - } - } - if zb0049 > 0 { - zb0049-- - var zb0067 int - var zb0068 bool - zb0067, zb0068, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0067 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0067), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Logic") - return - } - if zb0068 { - (*z).encodedSignedTxns.encodedLsigs.Logic = nil - } else if (*z).encodedSignedTxns.encodedLsigs.Logic != nil && cap((*z).encodedSignedTxns.encodedLsigs.Logic) >= zb0067 { - (*z).encodedSignedTxns.encodedLsigs.Logic = ((*z).encodedSignedTxns.encodedLsigs.Logic)[:zb0067] - } else { - (*z).encodedSignedTxns.encodedLsigs.Logic = make([][]byte, zb0067) - } - for zb0003 := range (*z).encodedSignedTxns.encodedLsigs.Logic { - var zb0069 int - zb0069, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0003) - return - } - if zb0069 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0069), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedSignedTxns.encodedLsigs.Logic[zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedLsigs.Logic[zb0003]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Logic", zb0003) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0070 []byte - var zb0071 int - zb0071, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - if zb0071 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0071), uint64(maxBitmaskSize)) - return - } - zb0070, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogic") - return - } - (*z).encodedSignedTxns.encodedLsigs.BitmaskLogic = bitmask(zb0070) - } - } - if zb0049 > 0 { - zb0049-- - var zb0072 int - var zb0073 bool - zb0072, zb0073, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0072 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0072), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs") - return - } - if zb0073 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = nil - } else if (*z).encodedSignedTxns.encodedLsigs.LogicArgs != nil && cap((*z).encodedSignedTxns.encodedLsigs.LogicArgs) >= zb0072 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = ((*z).encodedSignedTxns.encodedLsigs.LogicArgs)[:zb0072] - } else { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = make([][][]byte, zb0072) - } - for zb0004 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs { - var zb0074 int - var zb0075 bool - zb0074, zb0075, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004) - return - } - if zb0074 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0074), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004) - return - } - if zb0075 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = nil - } else if (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] != nil && cap((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004]) >= zb0074 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = ((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004])[:zb0074] - } else { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = make([][]byte, zb0074) - } - for zb0005 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] { - var zb0076 int - zb0076, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004, zb0005) - return - } - if zb0076 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0076), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LogicArgs", zb0004, zb0005) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0077 []byte - var zb0078 int - zb0078, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - if zb0078 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0078), uint64(maxBitmaskSize)) - return - } - zb0077, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLogicArgs") - return - } - (*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs = bitmask(zb0077) - } - } - if zb0049 > 0 { - zb0049-- - var zb0079 int - zb0079, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AuthAddr") - return - } - if zb0079 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0079), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.AuthAddr, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.AuthAddr) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AuthAddr") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0080 []byte - var zb0081 int - zb0081, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAuthAddr") - return - } - if zb0081 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0081), uint64(maxBitmaskSize)) - return - } - zb0080, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.BitmaskAuthAddr)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAuthAddr") - return - } - (*z).encodedSignedTxns.BitmaskAuthAddr = bitmask(zb0080) - } - } - if zb0049 > 0 { - zb0049-- - var zb0082 int - zb0082, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - if zb0082 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0082), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedTxns.TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.TxType) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxType") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0083 []byte - var zb0084 int - zb0084, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - if zb0084 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0084), uint64(maxBitmaskSize)) - return - } - zb0083, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTxType") - return - } - (*z).encodedSignedTxns.encodedTxns.BitmaskTxType = bitmask(zb0083) - } - } - if zb0049 > 0 { - zb0049-- - (*z).encodedSignedTxns.encodedTxns.TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxTypeOffset") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0085 int - zb0085, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - if zb0085 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0085), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sender") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0086 []byte - var zb0087 int - zb0087, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - if zb0087 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0087), uint64(maxBitmaskSize)) - return - } - zb0086, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSender") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender = bitmask(zb0086) - } - } - if zb0049 > 0 { - zb0049-- - var zb0088 int - var zb0089 bool - zb0088, zb0089, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0088 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0088), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Fee") - return - } - if zb0089 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee) >= zb0088 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee)[:zb0088] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0088) - } - for zb0006 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Fee", zb0006) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0090 []byte - var zb0091 int - zb0091, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - if zb0091 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0091), uint64(maxBitmaskSize)) - return - } - zb0090, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFee") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee = bitmask(zb0090) - } - } - if zb0049 > 0 { - zb0049-- - var zb0092 int - var zb0093 bool - zb0092, zb0093, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0092 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0092), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FirstValid") - return - } - if zb0093 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid) >= zb0092 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid)[:zb0092] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = make([]basics.Round, zb0092) - } - for zb0007 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid[zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FirstValid", zb0007) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0094 []byte - var zb0095 int - zb0095, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - if zb0095 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0095), uint64(maxBitmaskSize)) - return - } - zb0094, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFirstValid") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0094) - } - } - if zb0049 > 0 { - zb0049-- - var zb0096 int - var zb0097 bool - zb0096, zb0097, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0096 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0096), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LastValid") - return - } - if zb0097 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid) >= zb0096 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid)[:zb0096] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = make([]basics.Round, zb0096) - } - for zb0008 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LastValid", zb0008) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0098 []byte - var zb0099 int - zb0099, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - if zb0099 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0099), uint64(maxBitmaskSize)) - return - } - zb0098, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLastValid") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid = bitmask(zb0098) - } - } - if zb0049 > 0 { - zb0049-- - var zb0100 int - var zb0101 bool - zb0100, zb0101, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0100 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0100), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Note") - return - } - if zb0101 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note) >= zb0100 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note)[:zb0100] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = make([][]byte, zb0100) - } - for zb0009 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note { - var zb0102 int - zb0102, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0009) - return - } - if zb0102 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0102), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Note", zb0009) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0103 []byte - var zb0104 int - zb0104, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - if zb0104 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0104), uint64(maxBitmaskSize)) - return - } - zb0103, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNote") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote = bitmask(zb0103) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0105 []byte - var zb0106 int - zb0106, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - if zb0106 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0106), uint64(maxBitmaskSize)) - return - } - zb0105, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGenesisID") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0105) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0107 []byte - var zb0108 int - zb0108, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - if zb0108 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0108), uint64(maxBitmaskSize)) - return - } - zb0107, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGroup") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup = bitmask(zb0107) - } - } - if zb0049 > 0 { - zb0049-- - var zb0109 int - zb0109, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - if zb0109 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0109), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Lease") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0110 []byte - var zb0111 int - zb0111, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - if zb0111 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0111), uint64(maxBitmaskSize)) - return - } - zb0110, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLease") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease = bitmask(zb0110) - } - } - if zb0049 > 0 { - zb0049-- - var zb0112 int - zb0112, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - if zb0112 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0112), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "RekeyTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0113 []byte - var zb0114 int - zb0114, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - if zb0114 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0114), uint64(maxBitmaskSize)) - return - } - zb0113, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskRekeyTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0113) - } - } - if zb0049 > 0 { - zb0049-- - var zb0115 int - zb0115, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - if zb0115 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0115), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VotePK") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0116 int - zb0116, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - if zb0116 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0116), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SelectionPK") - return - } - } - if zb0049 > 0 { - zb0049-- - var zb0117 int - var zb0118 bool - zb0117, zb0118, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0117 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0117), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteFirst") - return - } - if zb0118 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst) >= zb0117 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst)[:zb0117] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0117) - } - for zb0010 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteFirst", zb0010) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0119 []byte - var zb0120 int - zb0120, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - if zb0120 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0120), uint64(maxBitmaskSize)) - return - } - zb0119, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteFirst") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0119) - } - } - if zb0049 > 0 { - zb0049-- - var zb0121 int - var zb0122 bool - zb0121, zb0122, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0121 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0121), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteLast") - return - } - if zb0122 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast) >= zb0121 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast)[:zb0121] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0121) - } - for zb0011 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteLast", zb0011) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0123 []byte - var zb0124 int - zb0124, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - if zb0124 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0124), uint64(maxBitmaskSize)) - return - } - zb0123, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskVoteLast") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0123) - } - } - if zb0049 > 0 { - zb0049-- - var zb0125 int - var zb0126 bool - zb0125, zb0126, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0125 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0125), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution") - return - } - if zb0126 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) >= zb0125 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution)[:zb0125] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0125) - } - for zb0012 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "VoteKeyDilution", zb0012) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0127 []byte - var zb0128 int - zb0128, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - if zb0128 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0128), uint64(maxBitmaskSize)) - return - } - zb0127, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskKeys") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0127) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0129 []byte - var zb0130 int - zb0130, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - if zb0130 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0130), uint64(maxBitmaskSize)) - return - } - zb0129, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskNonparticipation") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0129) - } - } - if zb0049 > 0 { - zb0049-- - var zb0131 int - zb0131, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - if zb0131 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0131), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Receiver") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0132 []byte - var zb0133 int - zb0133, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - if zb0133 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0133), uint64(maxBitmaskSize)) - return - } - zb0132, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReceiver") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0132) - } - } - if zb0049 > 0 { - zb0049-- - var zb0134 int - var zb0135 bool - zb0134, zb0135, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0134 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0134), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Amount") - return - } - if zb0135 { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount) >= zb0134 { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = ((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount)[:zb0134] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0134) - } - for zb0013 := range (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount[zb0013].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Amount", zb0013) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0136 []byte - var zb0137 int - zb0137, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - if zb0137 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0137), uint64(maxBitmaskSize)) - return - } - zb0136, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAmount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0136) - } - } - if zb0049 > 0 { - zb0049-- - var zb0138 int - zb0138, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - if zb0138 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0138), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CloseRemainderTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0139 []byte - var zb0140 int - zb0140, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - if zb0140 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0140), uint64(maxBitmaskSize)) - return - } - zb0139, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCloseRemainderTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0139) - } - } - if zb0049 > 0 { - zb0049-- - var zb0141 int - var zb0142 bool - zb0141, zb0142, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0141 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0141), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset") - return - } - if zb0142 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) >= zb0141 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset)[:zb0141] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0141) - } - for zb0014 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ConfigAsset", zb0014) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0143 []byte - var zb0144 int - zb0144, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - if zb0144 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0144), uint64(maxBitmaskSize)) - return - } - zb0143, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskConfigAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0143) - } - } - if zb0049 > 0 { - zb0049-- - var zb0145 int - var zb0146 bool - zb0145, zb0146, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0145 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0145), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Total") - return - } - if zb0146 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0145 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0145] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0145) - } - for zb0015 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Total", zb0015) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0147 []byte - var zb0148 int - zb0148, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - if zb0148 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0148), uint64(maxBitmaskSize)) - return - } - zb0147, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskTotal") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0147) - } - } - if zb0049 > 0 { - zb0049-- - var zb0149 int - var zb0150 bool - zb0149, zb0150, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0149 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0149), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Decimals") - return - } - if zb0150 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0149 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0149] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0149) - } - for zb0016 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Decimals", zb0016) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0151 []byte - var zb0152 int - zb0152, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - if zb0152 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0152), uint64(maxBitmaskSize)) - return - } - zb0151, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDecimals") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0151) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0153 []byte - var zb0154 int - zb0154, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - if zb0154 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0154), uint64(maxBitmaskSize)) - return - } - zb0153, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskDefaultFrozen") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0153) - } - } - if zb0049 > 0 { - zb0049-- - var zb0155 int - var zb0156 bool - zb0155, zb0156, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0155 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0155), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "UnitName") - return - } - if zb0156 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0155 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0155] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0155) - } - for zb0017 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "UnitName", zb0017) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0157 []byte - var zb0158 int - zb0158, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - if zb0158 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0158), uint64(maxBitmaskSize)) - return - } - zb0157, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskUnitName") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0157) - } - } - if zb0049 > 0 { - zb0049-- - var zb0159 int - var zb0160 bool - zb0159, zb0160, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0159 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0159), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetName") - return - } - if zb0160 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0159 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0159] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0159) - } - for zb0018 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetName", zb0018) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0161 []byte - var zb0162 int - zb0162, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - if zb0162 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0162), uint64(maxBitmaskSize)) - return - } - zb0161, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetName") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0161) - } - } - if zb0049 > 0 { - zb0049-- - var zb0163 int - var zb0164 bool - zb0163, zb0164, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0163 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0163), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "URL") - return - } - if zb0164 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0163 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0163] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0163) - } - for zb0019 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "URL", zb0019) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0165 []byte - var zb0166 int - zb0166, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - if zb0166 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0166), uint64(maxBitmaskSize)) - return - } - zb0165, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskURL") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0165) - } - } - if zb0049 > 0 { - zb0049-- - var zb0167 int - zb0167, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - if zb0167 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0167), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "MetadataHash") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0168 []byte - var zb0169 int - zb0169, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - if zb0169 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0169), uint64(maxBitmaskSize)) - return - } - zb0168, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskMetadataHash") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0168) - } - } - if zb0049 > 0 { - zb0049-- - var zb0170 int - zb0170, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - if zb0170 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0170), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Manager") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0171 []byte - var zb0172 int - zb0172, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - if zb0172 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0172), uint64(maxBitmaskSize)) - return - } - zb0171, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskManager") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0171) - } - } - if zb0049 > 0 { - zb0049-- - var zb0173 int - zb0173, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - if zb0173 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0173), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reserve") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0174 []byte - var zb0175 int - zb0175, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - if zb0175 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0175), uint64(maxBitmaskSize)) - return - } - zb0174, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReserve") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0174) - } - } - if zb0049 > 0 { - zb0049-- - var zb0176 int - zb0176, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - if zb0176 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0176), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Freeze") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0177 []byte - var zb0178 int - zb0178, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - if zb0178 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0178), uint64(maxBitmaskSize)) - return - } - zb0177, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreeze") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0177) - } - } - if zb0049 > 0 { - zb0049-- - var zb0179 int - zb0179, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - if zb0179 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0179), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Clawback") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0180 []byte - var zb0181 int - zb0181, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - if zb0181 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0181), uint64(maxBitmaskSize)) - return - } - zb0180, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClawback") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0180) - } - } - if zb0049 > 0 { - zb0049-- - var zb0182 int - var zb0183 bool - zb0182, zb0183, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0182 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0182), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "XferAsset") - return - } - if zb0183 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset) >= zb0182 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset)[:zb0182] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0182) - } - for zb0020 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "XferAsset", zb0020) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0184 []byte - var zb0185 int - zb0185, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - if zb0185 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0185), uint64(maxBitmaskSize)) - return - } - zb0184, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskXferAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0184) - } - } - if zb0049 > 0 { - zb0049-- - var zb0186 int - var zb0187 bool - zb0186, zb0187, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0186 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0186), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "AssetAmount") - return - } - if zb0187 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount) >= zb0186 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount)[:zb0186] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0186) - } - for zb0021 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetAmount", zb0021) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0188 []byte - var zb0189 int - zb0189, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - if zb0189 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0189), uint64(maxBitmaskSize)) - return - } - zb0188, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetAmount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0188) - } - } - if zb0049 > 0 { - zb0049-- - var zb0190 int - zb0190, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - if zb0190 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0190), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetSender") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0191 []byte - var zb0192 int - zb0192, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - if zb0192 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0192), uint64(maxBitmaskSize)) - return - } - zb0191, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetSender") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0191) - } - } - if zb0049 > 0 { - zb0049-- - var zb0193 int - zb0193, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - if zb0193 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0193), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetReceiver") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0194 []byte - var zb0195 int - zb0195, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - if zb0195 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0195), uint64(maxBitmaskSize)) - return - } - zb0194, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetReceiver") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0194) - } - } - if zb0049 > 0 { - zb0049-- - var zb0196 int - zb0196, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - if zb0196 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0196), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "AssetCloseTo") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0197 []byte - var zb0198 int - zb0198, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - if zb0198 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0198), uint64(maxBitmaskSize)) - return - } - zb0197, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetCloseTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0197) - } - } - if zb0049 > 0 { - zb0049-- - var zb0199 int - zb0199, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - if zb0199 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0199), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAccount") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0200 []byte - var zb0201 int - zb0201, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - if zb0201 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0201), uint64(maxBitmaskSize)) - return - } - zb0200, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAccount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0200) - } - } - if zb0049 > 0 { - zb0049-- - var zb0202 int - var zb0203 bool - zb0202, zb0203, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0202 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0202), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset") - return - } - if zb0203 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) >= zb0202 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset)[:zb0202] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0202) - } - for zb0022 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "FreezeAsset", zb0022) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0204 []byte - var zb0205 int - zb0205, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - if zb0205 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0205), uint64(maxBitmaskSize)) - return - } - zb0204, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskFreezeAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0204) - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0206 []byte - var zb0207 int - zb0207, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - if zb0207 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0207), uint64(maxBitmaskSize)) - return - } - zb0206, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAssetFrozen") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0206) - } - } - if zb0049 > 0 { - zb0049-- - var zb0208 int - var zb0209 bool - zb0208, zb0209, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0208 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0208), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationID") - return - } - if zb0209 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID) >= zb0208 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID)[:zb0208] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0208) - } - for zb0023 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationID", zb0023) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0210 []byte - var zb0211 int - zb0211, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - if zb0211 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0211), uint64(maxBitmaskSize)) - return - } - zb0210, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationID") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0210) - } - } - if zb0049 > 0 { - zb0049-- - var zb0212 int - zb0212, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - if zb0212 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0212), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "OnCompletion") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0213 []byte - var zb0214 int - zb0214, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - if zb0214 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0214), uint64(maxBitmaskSize)) - return - } - zb0213, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskOnCompletion") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0213) - } - } - if zb0049 > 0 { - zb0049-- - var zb0215 int - var zb0216 bool - zb0215, zb0216, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0215 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0215), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs") - return - } - if zb0216 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) >= zb0215 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs)[:zb0215] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0215) - } - for zb0024 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - var zb0217 int - var zb0218 bool - zb0217, zb0218, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024) - return - } - if zb0217 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0217), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024) - return - } - if zb0218 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]) >= zb0217 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024])[:zb0217] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = make(applicationArgs, zb0217) - } - for zb0025 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApplicationArgs", zb0024, zb0025) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0219 []byte - var zb0220 int - zb0220, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - if zb0220 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0220), uint64(maxBitmaskSize)) - return - } - zb0219, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApplicationArgs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0219) - } - } - if zb0049 > 0 { - zb0049-- - var zb0221 int - var zb0222 bool - zb0221, zb0222, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0221 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0221), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Accounts") - return - } - if zb0222 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts) >= zb0221 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts)[:zb0221] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0221) - } - for zb0026 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts { - var zb0223 int - var zb0224 bool - zb0223, zb0224, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026) - return - } - if zb0223 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0223), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026) - return - } - if zb0224 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]) >= zb0223 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026])[:zb0223] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = make(addresses, zb0223) - } - for zb0027 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Accounts", zb0026, zb0027) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0225 []byte - var zb0226 int - zb0226, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - if zb0226 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0226), uint64(maxBitmaskSize)) - return - } - zb0225, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskAccounts") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0225) - } - } - if zb0049 > 0 { - zb0049-- - var zb0227 int - var zb0228 bool - zb0227, zb0228, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0227 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0227), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps") - return - } - if zb0228 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps) >= zb0227 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps)[:zb0227] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0227) - } - for zb0028 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - var zb0229 int - var zb0230 bool - zb0229, zb0230, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028) - return - } - if zb0229 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0229), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028) - return - } - if zb0230 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]) >= zb0229 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028])[:zb0229] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = make(appIndices, zb0229) - } - for zb0029 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignApps", zb0028, zb0029) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0231 []byte - var zb0232 int - zb0232, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - if zb0232 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0232), uint64(maxBitmaskSize)) - return - } - zb0231, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignApps") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0231) - } - } - if zb0049 > 0 { - zb0049-- - var zb0233 int - var zb0234 bool - zb0233, zb0234, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0233 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0233), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets") - return - } - if zb0234 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) >= zb0233 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets)[:zb0233] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0233) - } - for zb0030 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - var zb0235 int - var zb0236 bool - zb0235, zb0236, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030) - return - } - if zb0235 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0235), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030) - return - } - if zb0236 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]) >= zb0235 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030])[:zb0235] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = make(assetIndices, zb0235) - } - for zb0031 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ForeignAssets", zb0030, zb0031) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0237 []byte - var zb0238 int - zb0238, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - if zb0238 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0238), uint64(maxBitmaskSize)) - return - } - zb0237, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskForeignAssets") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0237) - } - } - if zb0049 > 0 { - zb0049-- - var zb0239 int - var zb0240 bool - zb0239, zb0240, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0239 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0239), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint") - return - } - if zb0240 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) >= zb0239 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint)[:zb0239] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0239) - } - for zb0032 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumUint", zb0032) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0241 []byte - var zb0242 int - zb0242, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - if zb0242 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0242), uint64(maxBitmaskSize)) - return - } - zb0241, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumUint") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0241) - } - } - if zb0049 > 0 { - zb0049-- - var zb0243 int - var zb0244 bool - zb0243, zb0244, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0243 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0243), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice") - return - } - if zb0244 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0243 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0243] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0243) - } - for zb0033 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "LocalNumByteSlice", zb0033) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0245 []byte - var zb0246 int - zb0246, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - if zb0246 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0246), uint64(maxBitmaskSize)) - return - } - zb0245, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskLocalNumByteSlice") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0245) - } - } - if zb0049 > 0 { - zb0049-- - var zb0247 int - var zb0248 bool - zb0247, zb0248, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0247 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0247), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint") - return - } - if zb0248 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) >= zb0247 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint)[:zb0247] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0247) - } - for zb0034 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumUint", zb0034) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0249 []byte - var zb0250 int - zb0250, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - if zb0250 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0250), uint64(maxBitmaskSize)) - return - } - zb0249, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumUint") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0249) - } - } - if zb0049 > 0 { - zb0049-- - var zb0251 int - var zb0252 bool - zb0251, zb0252, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0251 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0251), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice") - return - } - if zb0252 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0251 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0251] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0251) - } - for zb0035 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "GlobalNumByteSlice", zb0035) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0253 []byte - var zb0254 int - zb0254, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - if zb0254 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0254), uint64(maxBitmaskSize)) - return - } - zb0253, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0253) - } - } - if zb0049 > 0 { - zb0049-- - var zb0255 int - var zb0256 bool - zb0255, zb0256, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0255 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0255), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram") - return - } - if zb0256 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) >= zb0255 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram)[:zb0255] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0255) - } - for zb0036 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0257 []byte - var zb0258 int - zb0258, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0036) - return - } - if zb0258 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0258), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0257, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ApprovalProgram", zb0036) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036] = program(zb0257) - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0259 []byte - var zb0260 int - zb0260, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - if zb0260 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0260), uint64(maxBitmaskSize)) - return - } - zb0259, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskApprovalProgram") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0259) - } - } - if zb0049 > 0 { - zb0049-- - var zb0261 int - var zb0262 bool - zb0261, zb0262, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0261 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0261), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram") - return - } - if zb0262 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) >= zb0261 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram)[:zb0261] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0261) - } - for zb0037 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0263 []byte - var zb0264 int - zb0264, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0037) - return - } - if zb0264 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0264), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0263, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ClearStateProgram", zb0037) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037] = program(zb0263) - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0265 []byte - var zb0266 int - zb0266, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - if zb0266 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0266), uint64(maxBitmaskSize)) - return - } - zb0265, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskClearStateProgram") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0265) - } - } - if zb0049 > 0 { - zb0049-- - var zb0267 int - var zb0268 bool - zb0267, zb0268, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0267 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0267), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages") - return - } - if zb0268 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0267 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0267] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0267) - } - for zb0038 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "ExtraProgramPages", zb0038) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0269 []byte - var zb0270 int - zb0270, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - if zb0270 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0270), uint64(maxBitmaskSize)) - return - } - zb0269, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskExtraProgramPages") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0269) - } - } - if zb0049 > 0 { - zb0049-- - var zb0271 int - var zb0272 bool - zb0271, zb0272, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0271 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0271), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertRound") - return - } - if zb0272 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound) >= zb0271 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound)[:zb0271] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0271) - } - for zb0039 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertRound", zb0039) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0273 []byte - var zb0274 int - zb0274, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - if zb0274 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0274), uint64(maxBitmaskSize)) - return - } - zb0273, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertRound") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0273) - } - } - if zb0049 > 0 { - zb0049-- - var zb0275 int - var zb0276 bool - zb0275, zb0276, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0275 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0275), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "CertType") - return - } - if zb0276 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType) >= zb0275 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType)[:zb0275] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0275) - } - for zb0040 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "CertType", zb0040) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0277 []byte - var zb0278 int - zb0278, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - if zb0278 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0278), uint64(maxBitmaskSize)) - return - } - zb0277, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskCertType") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0277) - } - } - if zb0049 > 0 { - zb0049-- - var zb0279 int - zb0279, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - if zb0279 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0279), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigCommit") - return - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0280 []byte - var zb0281 int - zb0281, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - if zb0281 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0281), uint64(maxBitmaskSize)) - return - } - zb0280, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigCommit") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0280) - } - } - if zb0049 > 0 { - zb0049-- - var zb0282 int - var zb0283 bool - zb0282, zb0283, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0282 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0282), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SignedWeight") - return - } - if zb0283 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0282 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0282] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0282) - } - for zb0041 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SignedWeight", zb0041) - return - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0284 []byte - var zb0285 int - zb0285, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - if zb0285 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0285), uint64(maxBitmaskSize)) - return - } - zb0284, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSignedWeight") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0284) - } - } - if zb0049 > 0 { - zb0049-- - var zb0286 int - var zb0287 bool - zb0286, zb0287, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0286 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0286), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0287 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0286 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0286] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0286) - } - for zb0042 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0288 int - var zb0289 bool - zb0288, zb0289, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042) - return - } - if zb0288 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0288), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042) - return - } - if zb0289 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]) >= zb0288 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042])[:zb0288] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = make(certProofs, zb0288) - } - for zb0043 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0042, zb0043) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0290 []byte - var zb0291 int - zb0291, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - if zb0291 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0291), uint64(maxBitmaskSize)) - return - } - zb0290, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskSigProofs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0290) - } - } - if zb0049 > 0 { - zb0049-- - var zb0292 int - var zb0293 bool - zb0292, zb0293, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0292 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0292), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0293 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0292 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0292] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0292) - } - for zb0044 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0294 int - var zb0295 bool - zb0294, zb0295, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044) - return - } - if zb0294 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0294), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044) - return - } - if zb0295 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]) >= zb0294 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044])[:zb0294] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = make(certProofs, zb0294) - } - for zb0045 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0044, zb0045) - return - } - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0296 []byte - var zb0297 int - zb0297, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - if zb0297 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0297), uint64(maxBitmaskSize)) - return - } - zb0296, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskPartProofs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0296) - } - } - if zb0049 > 0 { - zb0049-- - var zb0298 int - var zb0299 bool - zb0298, zb0299, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0298 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0298), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "Reveals") - return - } - if zb0299 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0298 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0298] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0298) - } - for zb0046 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0300 int - var zb0301 bool - zb0300, zb0301, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - if zb0300 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0300), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - if zb0301 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = make(revealMap, zb0300) - } - for zb0300 > 0 { - var zb0047 uint64 - var zb0048 compactcert.Reveal - zb0300-- - zb0047, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046) - return - } - bts, err = zb0048.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0046, zb0047) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] = zb0048 - } - } - } - if zb0049 > 0 { - zb0049-- - { - var zb0302 []byte - var zb0303 int - zb0303, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - if zb0303 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0303), uint64(maxBitmaskSize)) - return - } - zb0302, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "BitmaskReveals") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0302) - } - } - if zb0049 > 0 { - err = msgp.ErrTooManyArrayFields(zb0049) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0050 { - (*z) = txGroupsEncodingStub{} - } - for zb0049 > 0 { - zb0049-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "ttc": - (*z).TotalTransactionsCount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "TotalTransactionsCount") - return - } - case "tgc": - (*z).TransactionGroupCount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "TransactionGroupCount") - return - } - case "tgs": - var zb0304 int - zb0304, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "TransactionGroupSizes") - return - } - if zb0304 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0304), uint64(maxEncodedTransactionGroups)) - return - } - (*z).TransactionGroupSizes, bts, err = msgp.ReadBytesBytes(bts, (*z).TransactionGroupSizes) - if err != nil { - err = msgp.WrapError(err, "TransactionGroupSizes") - return - } - case "sig": - var zb0305 int - zb0305, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sig") - return - } - if zb0305 > maxSignatureBytes { - err = msgp.ErrOverflow(uint64(zb0305), uint64(maxSignatureBytes)) - return - } - (*z).encodedSignedTxns.Sig, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.Sig) - if err != nil { - err = msgp.WrapError(err, "Sig") - return - } - case "sigbm": - { - var zb0306 []byte - var zb0307 int - zb0307, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSig") - return - } - if zb0307 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0307), uint64(maxBitmaskSize)) - return - } - zb0306, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.BitmaskSig)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSig") - return - } - (*z).encodedSignedTxns.BitmaskSig = bitmask(zb0306) - } - case "msigv": - var zb0308 int - zb0308, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - if zb0308 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0308), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedMsigs.Version, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedMsigs.Version) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - case "msigvbm": - { - var zb0309 []byte - var zb0310 int - zb0310, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - if zb0310 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0310), uint64(maxBitmaskSize)) - return - } - zb0309, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVersion") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskVersion = bitmask(zb0309) - } - case "msigthr": - var zb0311 int - zb0311, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - if zb0311 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0311), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedMsigs.Threshold, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedMsigs.Threshold) - if err != nil { - err = msgp.WrapError(err, "Threshold") - return - } - case "msigthrbm": - { - var zb0312 []byte - var zb0313 int - zb0313, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - if zb0313 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0313), uint64(maxBitmaskSize)) - return - } - zb0312, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold)) - if err != nil { - err = msgp.WrapError(err, "BitmaskThreshold") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold = bitmask(zb0312) - } - case "subsig": - var zb0314 int - var zb0315 bool - zb0314, zb0315, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0314 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0314), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Subsigs") - return - } - if zb0315 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = nil - } else if (*z).encodedSignedTxns.encodedMsigs.Subsigs != nil && cap((*z).encodedSignedTxns.encodedMsigs.Subsigs) >= zb0314 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = ((*z).encodedSignedTxns.encodedMsigs.Subsigs)[:zb0314] - } else { - (*z).encodedSignedTxns.encodedMsigs.Subsigs = make([][]crypto.MultisigSubsig, zb0314) - } - for zb0001 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs { - var zb0316 int - var zb0317 bool - zb0316, zb0317, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0316 > crypto.MaxMultisig { - err = msgp.ErrOverflow(uint64(zb0316), uint64(crypto.MaxMultisig)) - err = msgp.WrapError(err, "Subsigs", zb0001) - return - } - if zb0317 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = nil - } else if (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] != nil && cap((*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001]) >= zb0316 { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = ((*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001])[:zb0316] - } else { - (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] = make([]crypto.MultisigSubsig, zb0316) - } - for zb0002 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] { - bts, err = (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001][zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Subsigs", zb0001, zb0002) - return - } - } - } - case "subsigsbm": - { - var zb0318 []byte - var zb0319 int - zb0319, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - if zb0319 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0319), uint64(maxBitmaskSize)) - return - } - zb0318, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSubsigs") - return - } - (*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs = bitmask(zb0318) - } - case "lsigl": - var zb0320 int - var zb0321 bool - zb0320, zb0321, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Logic") - return - } - if zb0320 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0320), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Logic") - return - } - if zb0321 { - (*z).encodedSignedTxns.encodedLsigs.Logic = nil - } else if (*z).encodedSignedTxns.encodedLsigs.Logic != nil && cap((*z).encodedSignedTxns.encodedLsigs.Logic) >= zb0320 { - (*z).encodedSignedTxns.encodedLsigs.Logic = ((*z).encodedSignedTxns.encodedLsigs.Logic)[:zb0320] - } else { - (*z).encodedSignedTxns.encodedLsigs.Logic = make([][]byte, zb0320) - } - for zb0003 := range (*z).encodedSignedTxns.encodedLsigs.Logic { - var zb0322 int - zb0322, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0003) - return - } - if zb0322 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0322), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedSignedTxns.encodedLsigs.Logic[zb0003], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedLsigs.Logic[zb0003]) - if err != nil { - err = msgp.WrapError(err, "Logic", zb0003) - return - } - } - case "lsiglbm": - { - var zb0323 []byte - var zb0324 int - zb0324, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - if zb0324 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0324), uint64(maxBitmaskSize)) - return - } - zb0323, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogic") - return - } - (*z).encodedSignedTxns.encodedLsigs.BitmaskLogic = bitmask(zb0323) - } - case "lsigarg": - var zb0325 int - var zb0326 bool - zb0325, zb0326, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0325 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0325), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LogicArgs") - return - } - if zb0326 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = nil - } else if (*z).encodedSignedTxns.encodedLsigs.LogicArgs != nil && cap((*z).encodedSignedTxns.encodedLsigs.LogicArgs) >= zb0325 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = ((*z).encodedSignedTxns.encodedLsigs.LogicArgs)[:zb0325] - } else { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs = make([][][]byte, zb0325) - } - for zb0004 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs { - var zb0327 int - var zb0328 bool - zb0327, zb0328, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004) - return - } - if zb0327 > transactions.EvalMaxArgs { - err = msgp.ErrOverflow(uint64(zb0327), uint64(transactions.EvalMaxArgs)) - err = msgp.WrapError(err, "LogicArgs", zb0004) - return - } - if zb0328 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = nil - } else if (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] != nil && cap((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004]) >= zb0327 { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = ((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004])[:zb0327] - } else { - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] = make([][]byte, zb0327) - } - for zb0005 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] { - var zb0329 int - zb0329, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004, zb0005) - return - } - if zb0329 > config.MaxLogicSigMaxSize { - err = msgp.ErrOverflow(uint64(zb0329), uint64(config.MaxLogicSigMaxSize)) - return - } - (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005]) - if err != nil { - err = msgp.WrapError(err, "LogicArgs", zb0004, zb0005) - return - } - } - } - case "lsigargbm": - { - var zb0330 []byte - var zb0331 int - zb0331, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - if zb0331 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0331), uint64(maxBitmaskSize)) - return - } - zb0330, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLogicArgs") - return - } - (*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs = bitmask(zb0330) - } - case "sgnr": - var zb0332 int - zb0332, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AuthAddr") - return - } - if zb0332 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0332), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.AuthAddr, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.AuthAddr) - if err != nil { - err = msgp.WrapError(err, "AuthAddr") - return - } - case "sgnrbm": - { - var zb0333 []byte - var zb0334 int - zb0334, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAuthAddr") - return - } - if zb0334 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0334), uint64(maxBitmaskSize)) - return - } - zb0333, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.BitmaskAuthAddr)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAuthAddr") - return - } - (*z).encodedSignedTxns.BitmaskAuthAddr = bitmask(zb0333) - } - case "type": - var zb0335 int - zb0335, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - if zb0335 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0335), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedTxns.TxType, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.TxType) - if err != nil { - err = msgp.WrapError(err, "TxType") - return - } - case "typebm": - { - var zb0336 []byte - var zb0337 int - zb0337, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - if zb0337 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0337), uint64(maxBitmaskSize)) - return - } - zb0336, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.BitmaskTxType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTxType") - return - } - (*z).encodedSignedTxns.encodedTxns.BitmaskTxType = bitmask(zb0336) - } - case "typeo": - (*z).encodedSignedTxns.encodedTxns.TxTypeOffset, bts, err = msgp.ReadByteBytes(bts) - if err != nil { - err = msgp.WrapError(err, "TxTypeOffset") - return - } - case "snd": - var zb0338 int - zb0338, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - if zb0338 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0338), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) - if err != nil { - err = msgp.WrapError(err, "Sender") - return - } - case "sndbm": - { - var zb0339 []byte - var zb0340 int - zb0340, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - if zb0340 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0340), uint64(maxBitmaskSize)) - return - } - zb0339, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSender") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender = bitmask(zb0339) - } - case "fee": - var zb0341 int - var zb0342 bool - zb0341, zb0342, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Fee") - return - } - if zb0341 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0341), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Fee") - return - } - if zb0342 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee) >= zb0341 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee)[:zb0341] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee = make([]basics.MicroAlgos, zb0341) - } - for zb0006 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee[zb0006].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Fee", zb0006) - return - } - } - case "feebm": - { - var zb0343 []byte - var zb0344 int - zb0344, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - if zb0344 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0344), uint64(maxBitmaskSize)) - return - } - zb0343, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFee") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee = bitmask(zb0343) - } - case "fv": - var zb0345 int - var zb0346 bool - zb0345, zb0346, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0345 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0345), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FirstValid") - return - } - if zb0346 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid) >= zb0345 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid)[:zb0345] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid = make([]basics.Round, zb0345) - } - for zb0007 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid[zb0007].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FirstValid", zb0007) - return - } - } - case "fvbm": - { - var zb0347 []byte - var zb0348 int - zb0348, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - if zb0348 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0348), uint64(maxBitmaskSize)) - return - } - zb0347, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFirstValid") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid = bitmask(zb0347) - } - case "lv": - var zb0349 int - var zb0350 bool - zb0349, zb0350, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid") - return - } - if zb0349 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0349), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LastValid") - return - } - if zb0350 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid) >= zb0349 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid)[:zb0349] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid = make([]basics.Round, zb0349) - } - for zb0008 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid[zb0008].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "LastValid", zb0008) - return - } - } - case "lvbm": - { - var zb0351 []byte - var zb0352 int - zb0352, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - if zb0352 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0352), uint64(maxBitmaskSize)) - return - } - zb0351, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLastValid") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid = bitmask(zb0351) - } - case "note": - var zb0353 int - var zb0354 bool - zb0353, zb0354, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Note") - return - } - if zb0353 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0353), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Note") - return - } - if zb0354 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note) >= zb0353 { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = ((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note)[:zb0353] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note = make([][]byte, zb0353) - } - for zb0009 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note { - var zb0355 int - zb0355, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Note", zb0009) - return - } - if zb0355 > config.MaxTxnNoteBytes { - err = msgp.ErrOverflow(uint64(zb0355), uint64(config.MaxTxnNoteBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009]) - if err != nil { - err = msgp.WrapError(err, "Note", zb0009) - return - } - } - case "notebm": - { - var zb0356 []byte - var zb0357 int - zb0357, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - if zb0357 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0357), uint64(maxBitmaskSize)) - return - } - zb0356, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNote") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote = bitmask(zb0356) - } - case "genbm": - { - var zb0358 []byte - var zb0359 int - zb0359, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - if zb0359 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0359), uint64(maxBitmaskSize)) - return - } - zb0358, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGenesisID") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID = bitmask(zb0358) - } - case "grpbm": - { - var zb0360 []byte - var zb0361 int - zb0361, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - if zb0361 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0361), uint64(maxBitmaskSize)) - return - } - zb0360, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGroup") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup = bitmask(zb0360) - } - case "lx": - var zb0362 int - zb0362, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - if zb0362 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0362), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) - if err != nil { - err = msgp.WrapError(err, "Lease") - return - } - case "lxbm": - { - var zb0363 []byte - var zb0364 int - zb0364, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - if zb0364 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0364), uint64(maxBitmaskSize)) - return - } - zb0363, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLease") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease = bitmask(zb0363) - } - case "rekey": - var zb0365 int - zb0365, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - if zb0365 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0365), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) - if err != nil { - err = msgp.WrapError(err, "RekeyTo") - return - } - case "rekeybm": - { - var zb0366 []byte - var zb0367 int - zb0367, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - if zb0367 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0367), uint64(maxBitmaskSize)) - return - } - zb0366, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskRekeyTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo = bitmask(zb0366) - } - case "votekey": - var zb0368 int - zb0368, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - if zb0368 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0368), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) - if err != nil { - err = msgp.WrapError(err, "VotePK") - return - } - case "selkey": - var zb0369 int - zb0369, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - if zb0369 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0369), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) - if err != nil { - err = msgp.WrapError(err, "SelectionPK") - return - } - case "votefst": - var zb0370 int - var zb0371 bool - zb0370, zb0371, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0370 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0370), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteFirst") - return - } - if zb0371 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst) >= zb0370 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst)[:zb0370] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst = make([]basics.Round, zb0370) - } - for zb0010 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteFirst", zb0010) - return - } - } - case "votefstbm": - { - var zb0372 []byte - var zb0373 int - zb0373, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - if zb0373 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0373), uint64(maxBitmaskSize)) - return - } - zb0372, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteFirst") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst = bitmask(zb0372) - } - case "votelst": - var zb0374 int - var zb0375 bool - zb0374, zb0375, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0374 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0374), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteLast") - return - } - if zb0375 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast) >= zb0374 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast)[:zb0374] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast = make([]basics.Round, zb0374) - } - for zb0011 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "VoteLast", zb0011) - return - } - } - case "votelstbm": - { - var zb0376 []byte - var zb0377 int - zb0377, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - if zb0377 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0377), uint64(maxBitmaskSize)) - return - } - zb0376, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) - if err != nil { - err = msgp.WrapError(err, "BitmaskVoteLast") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast = bitmask(zb0376) - } - case "votekd": - var zb0378 int - var zb0379 bool - zb0378, zb0379, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0378 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0378), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "VoteKeyDilution") - return - } - if zb0379 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) >= zb0378 { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = ((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution)[:zb0378] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution = make([]uint64, zb0378) - } - for zb0012 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution { - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution[zb0012], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "VoteKeyDilution", zb0012) - return - } - } - case "votekbm": - { - var zb0380 []byte - var zb0381 int - zb0381, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - if zb0381 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0381), uint64(maxBitmaskSize)) - return - } - zb0380, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) - if err != nil { - err = msgp.WrapError(err, "BitmaskKeys") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys = bitmask(zb0380) - } - case "nonpartbm": - { - var zb0382 []byte - var zb0383 int - zb0383, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - if zb0383 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0383), uint64(maxBitmaskSize)) - return - } - zb0382, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) - if err != nil { - err = msgp.WrapError(err, "BitmaskNonparticipation") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation = bitmask(zb0382) - } - case "rcv": - var zb0384 int - zb0384, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - if zb0384 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0384), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) - if err != nil { - err = msgp.WrapError(err, "Receiver") - return - } - case "rcvbm": - { - var zb0385 []byte - var zb0386 int - zb0386, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - if zb0386 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0386), uint64(maxBitmaskSize)) - return - } - zb0385, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReceiver") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver = bitmask(zb0385) - } - case "amt": - var zb0387 int - var zb0388 bool - zb0387, zb0388, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Amount") - return - } - if zb0387 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0387), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Amount") - return - } - if zb0388 { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount) >= zb0387 { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = ((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount)[:zb0387] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount = make([]basics.MicroAlgos, zb0387) - } - for zb0013 := range (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount[zb0013].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Amount", zb0013) - return - } - } - case "amtbm": - { - var zb0389 []byte - var zb0390 int - zb0390, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - if zb0390 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0390), uint64(maxBitmaskSize)) - return - } - zb0389, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAmount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount = bitmask(zb0389) - } - case "close": - var zb0391 int - zb0391, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - if zb0391 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0391), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) - if err != nil { - err = msgp.WrapError(err, "CloseRemainderTo") - return - } - case "closebm": - { - var zb0392 []byte - var zb0393 int - zb0393, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - if zb0393 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0393), uint64(maxBitmaskSize)) - return - } - zb0392, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCloseRemainderTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo = bitmask(zb0392) - } - case "caid": - var zb0394 int - var zb0395 bool - zb0394, zb0395, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0394 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0394), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ConfigAsset") - return - } - if zb0395 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) >= zb0394 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset)[:zb0394] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset = make([]basics.AssetIndex, zb0394) - } - for zb0014 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ConfigAsset", zb0014) - return - } - } - case "caidbm": - { - var zb0396 []byte - var zb0397 int - zb0397, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - if zb0397 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0397), uint64(maxBitmaskSize)) - return - } - zb0396, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskConfigAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset = bitmask(zb0396) - } - case "t": - var zb0398 int - var zb0399 bool - zb0398, zb0399, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total") - return - } - if zb0398 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0398), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Total") - return - } - if zb0399 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) >= zb0398 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total)[:zb0398] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total = make([]uint64, zb0398) - } - for zb0015 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total[zb0015], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Total", zb0015) - return - } - } - case "tbm": - { - var zb0400 []byte - var zb0401 int - zb0401, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - if zb0401 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0401), uint64(maxBitmaskSize)) - return - } - zb0400, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) - if err != nil { - err = msgp.WrapError(err, "BitmaskTotal") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal = bitmask(zb0400) - } - case "dc": - var zb0402 int - var zb0403 bool - zb0402, zb0403, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals") - return - } - if zb0402 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0402), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Decimals") - return - } - if zb0403 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) >= zb0402 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals)[:zb0402] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals = make([]uint32, zb0402) - } - for zb0016 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals[zb0016], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Decimals", zb0016) - return - } - } - case "dcbm": - { - var zb0404 []byte - var zb0405 int - zb0405, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - if zb0405 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0405), uint64(maxBitmaskSize)) - return - } - zb0404, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDecimals") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals = bitmask(zb0404) - } - case "dfbm": - { - var zb0406 []byte - var zb0407 int - zb0407, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - if zb0407 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0407), uint64(maxBitmaskSize)) - return - } - zb0406, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskDefaultFrozen") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen = bitmask(zb0406) - } - case "un": - var zb0408 int - var zb0409 bool - zb0408, zb0409, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName") - return - } - if zb0408 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0408), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "UnitName") - return - } - if zb0409 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) >= zb0408 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName)[:zb0408] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName = make([]string, zb0408) - } - for zb0017 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "UnitName", zb0017) - return - } - } - case "unbm": - { - var zb0410 []byte - var zb0411 int - zb0411, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - if zb0411 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0411), uint64(maxBitmaskSize)) - return - } - zb0410, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskUnitName") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName = bitmask(zb0410) - } - case "an": - var zb0412 int - var zb0413 bool - zb0412, zb0413, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName") - return - } - if zb0412 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0412), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetName") - return - } - if zb0413 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) >= zb0412 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName)[:zb0412] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName = make([]string, zb0412) - } - for zb0018 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetName", zb0018) - return - } - } - case "anbm": - { - var zb0414 []byte - var zb0415 int - zb0415, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - if zb0415 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0415), uint64(maxBitmaskSize)) - return - } - zb0414, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetName") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName = bitmask(zb0414) - } - case "au": - var zb0416 int - var zb0417 bool - zb0416, zb0417, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL") - return - } - if zb0416 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0416), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "URL") - return - } - if zb0417 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) >= zb0416 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = ((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL)[:zb0416] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL = make([]string, zb0416) - } - for zb0019 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019], bts, err = msgp.ReadStringBytes(bts) - if err != nil { - err = msgp.WrapError(err, "URL", zb0019) - return - } - } - case "aubm": - { - var zb0418 []byte - var zb0419 int - zb0419, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - if zb0419 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0419), uint64(maxBitmaskSize)) - return - } - zb0418, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) - if err != nil { - err = msgp.WrapError(err, "BitmaskURL") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL = bitmask(zb0418) - } - case "am": - var zb0420 int - zb0420, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - if zb0420 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0420), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) - if err != nil { - err = msgp.WrapError(err, "MetadataHash") - return - } - case "ambm": - { - var zb0421 []byte - var zb0422 int - zb0422, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - if zb0422 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0422), uint64(maxBitmaskSize)) - return - } - zb0421, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) - if err != nil { - err = msgp.WrapError(err, "BitmaskMetadataHash") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash = bitmask(zb0421) - } - case "m": - var zb0423 int - zb0423, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - if zb0423 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0423), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) - if err != nil { - err = msgp.WrapError(err, "Manager") - return - } - case "mbm": - { - var zb0424 []byte - var zb0425 int - zb0425, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - if zb0425 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0425), uint64(maxBitmaskSize)) - return - } - zb0424, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) - if err != nil { - err = msgp.WrapError(err, "BitmaskManager") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager = bitmask(zb0424) - } - case "r": - var zb0426 int - zb0426, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - if zb0426 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0426), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) - if err != nil { - err = msgp.WrapError(err, "Reserve") - return - } - case "rbm": - { - var zb0427 []byte - var zb0428 int - zb0428, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - if zb0428 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0428), uint64(maxBitmaskSize)) - return - } - zb0427, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReserve") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve = bitmask(zb0427) - } - case "f": - var zb0429 int - zb0429, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - if zb0429 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0429), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) - if err != nil { - err = msgp.WrapError(err, "Freeze") - return - } - case "fbm": - { - var zb0430 []byte - var zb0431 int - zb0431, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - if zb0431 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0431), uint64(maxBitmaskSize)) - return - } - zb0430, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreeze") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze = bitmask(zb0430) - } - case "c": - var zb0432 int - zb0432, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - if zb0432 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0432), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) - if err != nil { - err = msgp.WrapError(err, "Clawback") - return - } - case "cbm": - { - var zb0433 []byte - var zb0434 int - zb0434, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - if zb0434 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0434), uint64(maxBitmaskSize)) - return - } - zb0433, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClawback") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback = bitmask(zb0433) - } - case "xaid": - var zb0435 int - var zb0436 bool - zb0435, zb0436, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0435 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0435), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "XferAsset") - return - } - if zb0436 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset) >= zb0435 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset)[:zb0435] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset = make([]basics.AssetIndex, zb0435) - } - for zb0020 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "XferAsset", zb0020) - return - } - } - case "xaidbm": - { - var zb0437 []byte - var zb0438 int - zb0438, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - if zb0438 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0438), uint64(maxBitmaskSize)) - return - } - zb0437, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskXferAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset = bitmask(zb0437) - } - case "aamt": - var zb0439 int - var zb0440 bool - zb0439, zb0440, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0439 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0439), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "AssetAmount") - return - } - if zb0440 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount) >= zb0439 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = ((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount)[:zb0439] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount = make([]uint64, zb0439) - } - for zb0021 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount { - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount[zb0021], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "AssetAmount", zb0021) - return - } - } - case "aamtbm": - { - var zb0441 []byte - var zb0442 int - zb0442, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - if zb0442 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0442), uint64(maxBitmaskSize)) - return - } - zb0441, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetAmount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount = bitmask(zb0441) - } - case "asnd": - var zb0443 int - zb0443, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - if zb0443 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0443), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) - if err != nil { - err = msgp.WrapError(err, "AssetSender") - return - } - case "asndbm": - { - var zb0444 []byte - var zb0445 int - zb0445, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - if zb0445 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0445), uint64(maxBitmaskSize)) - return - } - zb0444, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetSender") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender = bitmask(zb0444) - } - case "arcv": - var zb0446 int - zb0446, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - if zb0446 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0446), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) - if err != nil { - err = msgp.WrapError(err, "AssetReceiver") - return - } - case "arcvbm": - { - var zb0447 []byte - var zb0448 int - zb0448, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - if zb0448 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0448), uint64(maxBitmaskSize)) - return - } - zb0447, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetReceiver") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver = bitmask(zb0447) - } - case "aclose": - var zb0449 int - zb0449, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - if zb0449 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0449), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) - if err != nil { - err = msgp.WrapError(err, "AssetCloseTo") - return - } - case "aclosebm": - { - var zb0450 []byte - var zb0451 int - zb0451, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - if zb0451 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0451), uint64(maxBitmaskSize)) - return - } - zb0450, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetCloseTo") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo = bitmask(zb0450) - } - case "fadd": - var zb0452 int - zb0452, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - if zb0452 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0452), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) - if err != nil { - err = msgp.WrapError(err, "FreezeAccount") - return - } - case "faddbm": - { - var zb0453 []byte - var zb0454 int - zb0454, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - if zb0454 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0454), uint64(maxBitmaskSize)) - return - } - zb0453, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAccount") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount = bitmask(zb0453) - } - case "faid": - var zb0455 int - var zb0456 bool - zb0455, zb0456, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0455 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0455), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "FreezeAsset") - return - } - if zb0456 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) >= zb0455 { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = ((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset)[:zb0455] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset = make([]basics.AssetIndex, zb0455) - } - for zb0022 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "FreezeAsset", zb0022) - return - } - } - case "faidbm": - { - var zb0457 []byte - var zb0458 int - zb0458, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - if zb0458 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0458), uint64(maxBitmaskSize)) - return - } - zb0457, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) - if err != nil { - err = msgp.WrapError(err, "BitmaskFreezeAsset") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset = bitmask(zb0457) - } - case "afrzbm": - { - var zb0459 []byte - var zb0460 int - zb0460, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - if zb0460 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0460), uint64(maxBitmaskSize)) - return - } - zb0459, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAssetFrozen") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen = bitmask(zb0459) - } - case "apid": - var zb0461 int - var zb0462 bool - zb0461, zb0462, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0461 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0461), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationID") - return - } - if zb0462 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID) >= zb0461 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID)[:zb0461] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID = make([]basics.AppIndex, zb0461) - } - for zb0023 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationID", zb0023) - return - } - } - case "apidbm": - { - var zb0463 []byte - var zb0464 int - zb0464, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - if zb0464 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0464), uint64(maxBitmaskSize)) - return - } - zb0463, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationID") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID = bitmask(zb0463) - } - case "apan": - var zb0465 int - zb0465, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - if zb0465 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0465), uint64(maxEncodedTransactionGroups)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) - if err != nil { - err = msgp.WrapError(err, "OnCompletion") - return - } - case "apanbm": - { - var zb0466 []byte - var zb0467 int - zb0467, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - if zb0467 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0467), uint64(maxBitmaskSize)) - return - } - zb0466, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) - if err != nil { - err = msgp.WrapError(err, "BitmaskOnCompletion") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion = bitmask(zb0466) - } - case "apaa": - var zb0468 int - var zb0469 bool - zb0468, zb0469, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0468 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0468), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApplicationArgs") - return - } - if zb0469 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) >= zb0468 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs)[:zb0468] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs = make([]applicationArgs, zb0468) - } - for zb0024 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - var zb0470 int - var zb0471 bool - zb0470, zb0471, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0024) - return - } - if zb0470 > transactions.EncodedMaxApplicationArgs { - err = msgp.ErrOverflow(uint64(zb0470), uint64(transactions.EncodedMaxApplicationArgs)) - err = msgp.WrapError(err, "ApplicationArgs", zb0024) - return - } - if zb0471 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024]) >= zb0470 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024])[:zb0470] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] = make(applicationArgs, zb0470) - } - for zb0025 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025], bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - if err != nil { - err = msgp.WrapError(err, "ApplicationArgs", zb0024, zb0025) - return - } - } - } - case "apaabm": - { - var zb0472 []byte - var zb0473 int - zb0473, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - if zb0473 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0473), uint64(maxBitmaskSize)) - return - } - zb0472, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApplicationArgs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs = bitmask(zb0472) - } - case "apat": - var zb0474 int - var zb0475 bool - zb0474, zb0475, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts") - return - } - if zb0474 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0474), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Accounts") - return - } - if zb0475 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts) >= zb0474 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts)[:zb0474] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts = make([]addresses, zb0474) - } - for zb0026 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts { - var zb0476 int - var zb0477 bool - zb0476, zb0477, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0026) - return - } - if zb0476 > transactions.EncodedMaxAccounts { - err = msgp.ErrOverflow(uint64(zb0476), uint64(transactions.EncodedMaxAccounts)) - err = msgp.WrapError(err, "Accounts", zb0026) - return - } - if zb0477 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026]) >= zb0476 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026])[:zb0476] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] = make(addresses, zb0476) - } - for zb0027 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Accounts", zb0026, zb0027) - return - } - } - } - case "apatbm": - { - var zb0478 []byte - var zb0479 int - zb0479, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - if zb0479 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0479), uint64(maxBitmaskSize)) - return - } - zb0478, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) - if err != nil { - err = msgp.WrapError(err, "BitmaskAccounts") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts = bitmask(zb0478) - } - case "apfa": - var zb0480 int - var zb0481 bool - zb0480, zb0481, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0480 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0480), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignApps") - return - } - if zb0481 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps) >= zb0480 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps)[:zb0480] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps = make([]appIndices, zb0480) - } - for zb0028 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - var zb0482 int - var zb0483 bool - zb0482, zb0483, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0028) - return - } - if zb0482 > transactions.EncodedMaxForeignApps { - err = msgp.ErrOverflow(uint64(zb0482), uint64(transactions.EncodedMaxForeignApps)) - err = msgp.WrapError(err, "ForeignApps", zb0028) - return - } - if zb0483 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028]) >= zb0482 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028])[:zb0482] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] = make(appIndices, zb0482) - } - for zb0029 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignApps", zb0028, zb0029) - return - } - } - } - case "apfabm": - { - var zb0484 []byte - var zb0485 int - zb0485, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - if zb0485 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0485), uint64(maxBitmaskSize)) - return - } - zb0484, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignApps") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps = bitmask(zb0484) - } - case "apas": - var zb0486 int - var zb0487 bool - zb0486, zb0487, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0486 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0486), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ForeignAssets") - return - } - if zb0487 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) >= zb0486 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets)[:zb0486] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets = make([]assetIndices, zb0486) - } - for zb0030 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - var zb0488 int - var zb0489 bool - zb0488, zb0489, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0030) - return - } - if zb0488 > transactions.EncodedMaxForeignAssets { - err = msgp.ErrOverflow(uint64(zb0488), uint64(transactions.EncodedMaxForeignAssets)) - err = msgp.WrapError(err, "ForeignAssets", zb0030) - return - } - if zb0489 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030]) >= zb0488 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030])[:zb0488] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] = make(assetIndices, zb0488) - } - for zb0031 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "ForeignAssets", zb0030, zb0031) - return - } - } - } - case "apasbm": - { - var zb0490 []byte - var zb0491 int - zb0491, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - if zb0491 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0491), uint64(maxBitmaskSize)) - return - } - zb0490, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) - if err != nil { - err = msgp.WrapError(err, "BitmaskForeignAssets") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets = bitmask(zb0490) - } - case "lnui": - var zb0492 int - var zb0493 bool - zb0492, zb0493, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0492 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0492), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumUint") - return - } - if zb0493 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) >= zb0492 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint)[:zb0492] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint = make([]uint64, zb0492) - } - for zb0032 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint[zb0032], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumUint", zb0032) - return - } - } - case "lnuibm": - { - var zb0494 []byte - var zb0495 int - zb0495, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - if zb0495 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0495), uint64(maxBitmaskSize)) - return - } - zb0494, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumUint") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint = bitmask(zb0494) - } - case "lnbs": - var zb0496 int - var zb0497 bool - zb0496, zb0497, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0496 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0496), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "LocalNumByteSlice") - return - } - if zb0497 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) >= zb0496 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice)[:zb0496] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice = make([]uint64, zb0496) - } - for zb0033 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice[zb0033], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "LocalNumByteSlice", zb0033) - return - } - } - case "lnbsbm": - { - var zb0498 []byte - var zb0499 int - zb0499, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - if zb0499 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0499), uint64(maxBitmaskSize)) - return - } - zb0498, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskLocalNumByteSlice") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice = bitmask(zb0498) - } - case "gnui": - var zb0500 int - var zb0501 bool - zb0500, zb0501, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0500 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0500), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumUint") - return - } - if zb0501 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) >= zb0500 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint)[:zb0500] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint = make([]uint64, zb0500) - } - for zb0034 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint[zb0034], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumUint", zb0034) - return - } - } - case "gnuibm": - { - var zb0502 []byte - var zb0503 int - zb0503, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - if zb0503 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0503), uint64(maxBitmaskSize)) - return - } - zb0502, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumUint") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint = bitmask(zb0502) - } - case "gnbs": - var zb0504 int - var zb0505 bool - zb0504, zb0505, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0504 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0504), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "GlobalNumByteSlice") - return - } - if zb0505 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) >= zb0504 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice)[:zb0504] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice = make([]uint64, zb0504) - } - for zb0035 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice[zb0035], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "GlobalNumByteSlice", zb0035) - return - } - } - case "gnbsbm": - { - var zb0506 []byte - var zb0507 int - zb0507, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - if zb0507 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0507), uint64(maxBitmaskSize)) - return - } - zb0506, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) - if err != nil { - err = msgp.WrapError(err, "BitmaskGlobalNumByteSlice") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice = bitmask(zb0506) - } - case "apap": - var zb0508 int - var zb0509 bool - zb0508, zb0509, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0508 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0508), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ApprovalProgram") - return - } - if zb0509 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) >= zb0508 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram)[:zb0508] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram = make([]program, zb0508) - } - for zb0036 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - { - var zb0510 []byte - var zb0511 int - zb0511, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0036) - return - } - if zb0511 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0511), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0510, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - if err != nil { - err = msgp.WrapError(err, "ApprovalProgram", zb0036) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036] = program(zb0510) - } - } - case "apapbm": - { - var zb0512 []byte - var zb0513 int - zb0513, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - if zb0513 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0513), uint64(maxBitmaskSize)) - return - } - zb0512, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskApprovalProgram") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram = bitmask(zb0512) - } - case "apsu": - var zb0514 int - var zb0515 bool - zb0514, zb0515, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0514 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0514), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ClearStateProgram") - return - } - if zb0515 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) >= zb0514 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram)[:zb0514] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram = make([]program, zb0514) - } - for zb0037 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - { - var zb0516 []byte - var zb0517 int - zb0517, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0037) - return - } - if zb0517 > config.MaxAvailableAppProgramLen { - err = msgp.ErrOverflow(uint64(zb0517), uint64(config.MaxAvailableAppProgramLen)) - return - } - zb0516, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - if err != nil { - err = msgp.WrapError(err, "ClearStateProgram", zb0037) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037] = program(zb0516) - } - } - case "apsubm": - { - var zb0518 []byte - var zb0519 int - zb0519, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - if zb0519 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0519), uint64(maxBitmaskSize)) - return - } - zb0518, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) - if err != nil { - err = msgp.WrapError(err, "BitmaskClearStateProgram") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram = bitmask(zb0518) - } - case "apep": - var zb0520 int - var zb0521 bool - zb0520, zb0521, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0520 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0520), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "ExtraProgramPages") - return - } - if zb0521 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) >= zb0520 { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = ((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages)[:zb0520] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages = make([]uint32, zb0520) - } - for zb0038 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages { - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages[zb0038], bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "ExtraProgramPages", zb0038) - return - } - } - case "apepbm": - { - var zb0522 []byte - var zb0523 int - zb0523, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - if zb0523 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0523), uint64(maxBitmaskSize)) - return - } - zb0522, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) - if err != nil { - err = msgp.WrapError(err, "BitmaskExtraProgramPages") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages = bitmask(zb0522) - } - case "certrnd": - var zb0524 int - var zb0525 bool - zb0524, zb0525, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound") - return - } - if zb0524 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0524), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertRound") - return - } - if zb0525 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound) >= zb0524 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound)[:zb0524] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound = make([]basics.Round, zb0524) - } - for zb0039 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertRound", zb0039) - return - } - } - case "certrndbm": - { - var zb0526 []byte - var zb0527 int - zb0527, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - if zb0527 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0527), uint64(maxBitmaskSize)) - return - } - zb0526, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertRound") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound = bitmask(zb0526) - } - case "certtype": - var zb0528 int - var zb0529 bool - zb0528, zb0529, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "CertType") - return - } - if zb0528 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0528), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "CertType") - return - } - if zb0529 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType) >= zb0528 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType)[:zb0528] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType = make([]protocol.CompactCertType, zb0528) - } - for zb0040 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "CertType", zb0040) - return - } - } - case "certtypebm": - { - var zb0530 []byte - var zb0531 int - zb0531, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - if zb0531 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0531), uint64(maxBitmaskSize)) - return - } - zb0530, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) - if err != nil { - err = msgp.WrapError(err, "BitmaskCertType") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType = bitmask(zb0530) - } - case "certc": - var zb0532 int - zb0532, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - if zb0532 > maxAddressBytes { - err = msgp.ErrOverflow(uint64(zb0532), uint64(maxAddressBytes)) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit, bts, err = msgp.ReadBytesBytes(bts, (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) - if err != nil { - err = msgp.WrapError(err, "SigCommit") - return - } - case "certcbm": - { - var zb0533 []byte - var zb0534 int - zb0534, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - if zb0534 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0534), uint64(maxBitmaskSize)) - return - } - zb0533, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigCommit") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit = bitmask(zb0533) - } - case "certw": - var zb0535 int - var zb0536 bool - zb0535, zb0536, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0535 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0535), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SignedWeight") - return - } - if zb0536 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) >= zb0535 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight)[:zb0535] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight = make([]uint64, zb0535) - } - for zb0041 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight[zb0041], bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "SignedWeight", zb0041) - return - } - } - case "certwbm": - { - var zb0537 []byte - var zb0538 int - zb0538, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - if zb0538 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0538), uint64(maxBitmaskSize)) - return - } - zb0537, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSignedWeight") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight = bitmask(zb0537) - } - case "certS": - var zb0539 int - var zb0540 bool - zb0539, zb0540, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0539 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0539), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0540 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) >= zb0539 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs)[:zb0539] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs = make([]certProofs, zb0539) - } - for zb0042 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - var zb0541 int - var zb0542 bool - zb0541, zb0542, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0042) - return - } - if zb0541 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0541), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "SigProofs", zb0042) - return - } - if zb0542 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042]) >= zb0541 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042])[:zb0541] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] = make(certProofs, zb0541) - } - for zb0043 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0042, zb0043) - return - } - } - } - case "certSbm": - { - var zb0543 []byte - var zb0544 int - zb0544, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - if zb0544 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0544), uint64(maxBitmaskSize)) - return - } - zb0543, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskSigProofs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs = bitmask(zb0543) - } - case "certP": - var zb0545 int - var zb0546 bool - zb0545, zb0546, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0545 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0545), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0546 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) >= zb0545 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs)[:zb0545] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs = make([]certProofs, zb0545) - } - for zb0044 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - var zb0547 int - var zb0548 bool - zb0547, zb0548, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0044) - return - } - if zb0547 > compactcert.MaxProofDigests { - err = msgp.ErrOverflow(uint64(zb0547), uint64(compactcert.MaxProofDigests)) - err = msgp.WrapError(err, "PartProofs", zb0044) - return - } - if zb0548 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044]) >= zb0547 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044])[:zb0547] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] = make(certProofs, zb0547) - } - for zb0045 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - bts, err = (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0044, zb0045) - return - } - } - } - case "certPbm": - { - var zb0549 []byte - var zb0550 int - zb0550, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - if zb0550 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0550), uint64(maxBitmaskSize)) - return - } - zb0549, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) - if err != nil { - err = msgp.WrapError(err, "BitmaskPartProofs") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs = bitmask(zb0549) - } - case "certr": - var zb0551 int - var zb0552 bool - zb0551, zb0552, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals") - return - } - if zb0551 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0551), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "Reveals") - return - } - if zb0552 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals != nil && cap((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) >= zb0551 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = ((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals)[:zb0551] - } else { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals = make([]revealMap, zb0551) - } - for zb0046 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - var zb0553 int - var zb0554 bool - zb0553, zb0554, bts, err = msgp.ReadMapHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - if zb0553 > compactcert.MaxReveals { - err = msgp.ErrOverflow(uint64(zb0553), uint64(compactcert.MaxReveals)) - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - if zb0554 { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = nil - } else if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] == nil { - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] = make(revealMap, zb0553) - } - for zb0553 > 0 { - var zb0047 uint64 - var zb0048 compactcert.Reveal - zb0553-- - zb0047, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046) - return - } - bts, err = zb0048.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Reveals", zb0046, zb0047) - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046][zb0047] = zb0048 - } - } - case "certrbm": - { - var zb0555 []byte - var zb0556 int - zb0556, err = msgp.ReadBytesBytesHeader(bts) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - if zb0556 > maxBitmaskSize { - err = msgp.ErrOverflow(uint64(zb0556), uint64(maxBitmaskSize)) - return - } - zb0555, bts, err = msgp.ReadBytesBytes(bts, []byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - if err != nil { - err = msgp.WrapError(err, "BitmaskReveals") - return - } - (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals = bitmask(zb0555) - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *txGroupsEncodingStub) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*txGroupsEncodingStub) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *txGroupsEncodingStub) Msgsize() (s int) { - s = 3 + 4 + msgp.Uint64Size + 4 + msgp.Uint64Size + 4 + msgp.BytesPrefixSize + len((*z).TransactionGroupSizes) + 4 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.Sig) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.BitmaskSig)) + 6 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedMsigs.Version) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion)) + 8 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedMsigs.Threshold) + 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold)) + 7 + msgp.ArrayHeaderSize - for zb0001 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs { - s += msgp.ArrayHeaderSize - for zb0002 := range (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001] { - s += (*z).encodedSignedTxns.encodedMsigs.Subsigs[zb0001][zb0002].Msgsize() - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs)) + 6 + msgp.ArrayHeaderSize - for zb0003 := range (*z).encodedSignedTxns.encodedLsigs.Logic { - s += msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedLsigs.Logic[zb0003]) - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic)) + 8 + msgp.ArrayHeaderSize - for zb0004 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs { - s += msgp.ArrayHeaderSize - for zb0005 := range (*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004] { - s += msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedLsigs.LogicArgs[zb0004][zb0005]) - } - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.AuthAddr) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.BitmaskAuthAddr)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.TxType) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.BitmaskTxType)) + 6 + msgp.ByteSize + 4 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender)) + 4 + msgp.ArrayHeaderSize - for zb0006 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee { - s += (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee[zb0006].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee)) + 3 + msgp.ArrayHeaderSize - for zb0007 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid { - s += (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid[zb0007].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid)) + 3 + msgp.ArrayHeaderSize - for zb0008 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid { - s += (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid[zb0008].Msgsize() - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid)) + 5 + msgp.ArrayHeaderSize - for zb0009 := range (*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note { - s += msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note[zb0009]) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID)) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup)) + 3 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease)) + 6 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo)) + 8 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) + 7 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) + 8 + msgp.ArrayHeaderSize - for zb0010 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst { - s += (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst[zb0010].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst)) + 8 + msgp.ArrayHeaderSize - for zb0011 := range (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast { - s += (*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast[zb0011].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast)) + 7 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys)) + 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation)) + 4 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) + 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver)) + 4 + msgp.ArrayHeaderSize - for zb0013 := range (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount { - s += (*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount[zb0013].Msgsize() - } - s += 6 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount)) + 6 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo)) + 5 + msgp.ArrayHeaderSize - for zb0014 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset { - s += (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset[zb0014].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset)) + 2 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) * (msgp.Uint64Size)) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal)) + 3 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) * (msgp.Uint32Size)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals)) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen)) + 3 + msgp.ArrayHeaderSize - for zb0017 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName { - s += msgp.StringPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName[zb0017]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName)) + 3 + msgp.ArrayHeaderSize - for zb0018 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName { - s += msgp.StringPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName[zb0018]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName)) + 3 + msgp.ArrayHeaderSize - for zb0019 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL { - s += msgp.StringPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL[zb0019]) - } - s += 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL)) + 3 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) + 5 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash)) + 2 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager)) + 2 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve)) + 2 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze)) + 2 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) + 4 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback)) + 5 + msgp.ArrayHeaderSize - for zb0020 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset { - s += (*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset[zb0020].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver)) + 7 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) + 9 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount)) + 5 + msgp.ArrayHeaderSize - for zb0022 := range (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset { - s += (*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset[zb0022].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen)) + 5 + msgp.ArrayHeaderSize - for zb0023 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID { - s += (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID[zb0023].Msgsize() - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID)) + 5 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion)) + 5 + msgp.ArrayHeaderSize - for zb0024 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs { - s += msgp.ArrayHeaderSize - for zb0025 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024] { - s += msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs[zb0024][zb0025]) - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs)) + 5 + msgp.ArrayHeaderSize - for zb0026 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts { - s += msgp.ArrayHeaderSize - for zb0027 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026] { - s += (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts[zb0026][zb0027].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts)) + 5 + msgp.ArrayHeaderSize - for zb0028 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps { - s += msgp.ArrayHeaderSize - for zb0029 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028] { - s += (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps[zb0028][zb0029].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps)) + 5 + msgp.ArrayHeaderSize - for zb0030 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets { - s += msgp.ArrayHeaderSize - for zb0031 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030] { - s += (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets[zb0030][zb0031].Msgsize() - } - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) * (msgp.Uint64Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice)) + 5 + msgp.ArrayHeaderSize - for zb0036 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram[zb0036])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram)) + 5 + msgp.ArrayHeaderSize - for zb0037 := range (*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram { - s += msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram[zb0037])) - } - s += 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram)) + 5 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) * (msgp.Uint32Size)) + 7 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages)) + 8 + msgp.ArrayHeaderSize - for zb0039 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound { - s += (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound[zb0039].Msgsize() - } - s += 10 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound)) + 9 + msgp.ArrayHeaderSize - for zb0040 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType { - s += (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType[zb0040].Msgsize() - } - s += 11 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType)) + 6 + msgp.BytesPrefixSize + len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit)) + 6 + msgp.ArrayHeaderSize + (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) * (msgp.Uint64Size)) + 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight)) + 6 + msgp.ArrayHeaderSize - for zb0042 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs { - s += msgp.ArrayHeaderSize - for zb0043 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042] { - s += (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs[zb0042][zb0043].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs)) + 6 + msgp.ArrayHeaderSize - for zb0044 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs { - s += msgp.ArrayHeaderSize - for zb0045 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044] { - s += (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs[zb0044][zb0045].Msgsize() - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs)) + 6 + msgp.ArrayHeaderSize - for zb0046 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals { - s += msgp.MapHeaderSize - if (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] != nil { - for zb0047, zb0048 := range (*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals[zb0046] { - _ = zb0047 - _ = zb0048 - s += 0 + msgp.Uint64Size + zb0048.Msgsize() - } - } - } - s += 8 + msgp.BytesPrefixSize + len([]byte((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals)) - return -} - -// MsgIsZero returns whether this is a zero value -func (z *txGroupsEncodingStub) MsgIsZero() bool { - return ((*z).TotalTransactionsCount == 0) && ((*z).TransactionGroupCount == 0) && (len((*z).TransactionGroupSizes) == 0) && (len((*z).encodedSignedTxns.Sig) == 0) && (len((*z).encodedSignedTxns.BitmaskSig) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.Version) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.BitmaskVersion) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.Threshold) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.BitmaskThreshold) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.Subsigs) == 0) && (len((*z).encodedSignedTxns.encodedMsigs.BitmaskSubsigs) == 0) && (len((*z).encodedSignedTxns.encodedLsigs.Logic) == 0) && (len((*z).encodedSignedTxns.encodedLsigs.BitmaskLogic) == 0) && (len((*z).encodedSignedTxns.encodedLsigs.LogicArgs) == 0) && (len((*z).encodedSignedTxns.encodedLsigs.BitmaskLogicArgs) == 0) && (len((*z).encodedSignedTxns.AuthAddr) == 0) && (len((*z).encodedSignedTxns.BitmaskAuthAddr) == 0) && (len((*z).encodedSignedTxns.encodedTxns.TxType) == 0) && (len((*z).encodedSignedTxns.encodedTxns.BitmaskTxType) == 0) && ((*z).encodedSignedTxns.encodedTxns.TxTypeOffset == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Sender) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskSender) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Fee) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFee) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.FirstValid) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskFirstValid) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.LastValid) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLastValid) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Note) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskNote) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGenesisID) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskGroup) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.Lease) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskLease) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.RekeyTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedTxnHeaders.BitmaskRekeyTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VotePK) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.SelectionPK) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteFirst) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteFirst) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteLast) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskVoteLast) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.VoteKeyDilution) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskKeys) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedKeyregTxnFields.BitmaskNonparticipation) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Receiver) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskReceiver) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.Amount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskAmount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.CloseRemainderTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedPaymentTxnFields.BitmaskCloseRemainderTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.ConfigAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.BitmaskConfigAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Total) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskTotal) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Decimals) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDecimals) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskDefaultFrozen) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.UnitName) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskUnitName) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.AssetName) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskAssetName) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.URL) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskURL) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.MetadataHash) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskMetadataHash) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Manager) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskManager) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Reserve) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskReserve) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Freeze) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskFreeze) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.Clawback) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetConfigTxnFields.encodedAssetParams.BitmaskClawback) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.XferAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskXferAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetAmount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetAmount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetSender) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetSender) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetReceiver) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetReceiver) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.AssetCloseTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetTransferTxnFields.BitmaskAssetCloseTo) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAccount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAccount) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.FreezeAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskFreezeAsset) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedAssetFreezeTxnFields.BitmaskAssetFrozen) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationID) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationID) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.OnCompletion) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskOnCompletion) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApplicationArgs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.Accounts) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskAccounts) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignApps) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ForeignAssets) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskForeignAssets) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumUint) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumUint) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.LocalNumByteSlice) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskLocalNumByteSlice) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumUint) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumUint) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.GlobalNumByteSlice) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskGlobalNumByteSlice) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskApprovalProgram) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ClearStateProgram) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskClearStateProgram) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.ExtraProgramPages) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedApplicationCallTxnFields.BitmaskExtraProgramPages) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertRound) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertRound) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.CertType) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.BitmaskCertType) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigCommit) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigCommit) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SignedWeight) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSignedWeight) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.SigProofs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskSigProofs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.PartProofs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskPartProofs) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.Reveals) == 0) && (len((*z).encodedSignedTxns.encodedTxns.encodedCompactCertTxnFields.encodedCert.BitmaskReveals) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *txGroupsEncodingStubOld) MarshalMsg(b []byte) (o []byte) { - o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values - zb0002Len := uint32(1) - var zb0002Mask uint8 /* 2 bits */ - if len((*z).TxnGroups) == 0 { - zb0002Len-- - zb0002Mask |= 0x2 - } - // variable map header, size zb0002Len - o = append(o, 0x80|uint8(zb0002Len)) - if zb0002Len != 0 { - if (zb0002Mask & 0x2) == 0 { // if not empty - // string "t" - o = append(o, 0xa1, 0x74) - if (*z).TxnGroups == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).TxnGroups))) - } - for zb0001 := range (*z).TxnGroups { - o = (*z).TxnGroups[zb0001].MarshalMsg(o) - } - } - } - return -} - -func (_ *txGroupsEncodingStubOld) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*txGroupsEncodingStubOld) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *txGroupsEncodingStubOld) UnmarshalMsg(bts []byte) (o []byte, err error) { - var field []byte - _ = field - var zb0002 int - var zb0003 bool - zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0002 > 0 { - zb0002-- - var zb0004 int - var zb0005 bool - zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnGroups") - return - } - if zb0004 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0004), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "struct-from-array", "TxnGroups") - return - } - if zb0005 { - (*z).TxnGroups = nil - } else if (*z).TxnGroups != nil && cap((*z).TxnGroups) >= zb0004 { - (*z).TxnGroups = ((*z).TxnGroups)[:zb0004] - } else { - (*z).TxnGroups = make([]txnGroups, zb0004) - } - for zb0001 := range (*z).TxnGroups { - bts, err = (*z).TxnGroups[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnGroups", zb0001) - return - } - } - } - if zb0002 > 0 { - err = msgp.ErrTooManyArrayFields(zb0002) - if err != nil { - err = msgp.WrapError(err, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err) - return - } - if zb0003 { - (*z) = txGroupsEncodingStubOld{} - } - for zb0002 > 0 { - zb0002-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err) - return - } - switch string(field) { - case "t": - var zb0006 int - var zb0007 bool - zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "TxnGroups") - return - } - if zb0006 > maxEncodedTransactionGroups { - err = msgp.ErrOverflow(uint64(zb0006), uint64(maxEncodedTransactionGroups)) - err = msgp.WrapError(err, "TxnGroups") - return - } - if zb0007 { - (*z).TxnGroups = nil - } else if (*z).TxnGroups != nil && cap((*z).TxnGroups) >= zb0006 { - (*z).TxnGroups = ((*z).TxnGroups)[:zb0006] - } else { - (*z).TxnGroups = make([]txnGroups, zb0006) - } - for zb0001 := range (*z).TxnGroups { - bts, err = (*z).TxnGroups[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "TxnGroups", zb0001) - return - } - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - } - o = bts - return -} - -func (_ *txGroupsEncodingStubOld) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*txGroupsEncodingStubOld) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *txGroupsEncodingStubOld) Msgsize() (s int) { - s = 1 + 2 + msgp.ArrayHeaderSize - for zb0001 := range (*z).TxnGroups { - s += (*z).TxnGroups[zb0001].Msgsize() - } - return -} - -// MsgIsZero returns whether this is a zero value -func (z *txGroupsEncodingStubOld) MsgIsZero() bool { - return (len((*z).TxnGroups) == 0) -} - -// MarshalMsg implements msgp.Marshaler -func (z *txnGroups) MarshalMsg(b []byte) []byte { - return ((*(pooldata.SignedTxnSlice))(z)).MarshalMsg(b) -} -func (_ *txnGroups) CanMarshalMsg(z interface{}) bool { - _, ok := (z).(*txnGroups) - return ok -} - -// UnmarshalMsg implements msgp.Unmarshaler -func (z *txnGroups) UnmarshalMsg(bts []byte) ([]byte, error) { - return ((*(pooldata.SignedTxnSlice))(z)).UnmarshalMsg(bts) -} -func (_ *txnGroups) CanUnmarshalMsg(z interface{}) bool { - _, ok := (z).(*txnGroups) - return ok -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *txnGroups) Msgsize() int { - return ((*(pooldata.SignedTxnSlice))(z)).Msgsize() -} - -// MsgIsZero returns whether this is a zero value -func (z *txnGroups) MsgIsZero() bool { - return ((*(pooldata.SignedTxnSlice))(z)).MsgIsZero() -} diff --git a/txnsync/msgp_gen_test.go b/txnsync/msgp_gen_test.go deleted file mode 100644 index 95b7d24516..0000000000 --- a/txnsync/msgp_gen_test.go +++ /dev/null @@ -1,1693 +0,0 @@ -// +build !skip_msgp_testing - -package txnsync - -// Code generated by github.com/algorand/msgp DO NOT EDIT. - -import ( - "testing" - - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" -) - -func TestMarshalUnmarshaladdresses(t *testing.T) { - partitiontest.PartitionTest(t) - v := addresses{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingaddresses(t *testing.T) { - protocol.RunEncodingTest(t, &addresses{}) -} - -func BenchmarkMarshalMsgaddresses(b *testing.B) { - v := addresses{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgaddresses(b *testing.B) { - v := addresses{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshaladdresses(b *testing.B) { - v := addresses{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalappIndices(t *testing.T) { - partitiontest.PartitionTest(t) - v := appIndices{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingappIndices(t *testing.T) { - protocol.RunEncodingTest(t, &appIndices{}) -} - -func BenchmarkMarshalMsgappIndices(b *testing.B) { - v := appIndices{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgappIndices(b *testing.B) { - v := appIndices{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalappIndices(b *testing.B) { - v := appIndices{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalapplicationArgs(t *testing.T) { - partitiontest.PartitionTest(t) - v := applicationArgs{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingapplicationArgs(t *testing.T) { - protocol.RunEncodingTest(t, &applicationArgs{}) -} - -func BenchmarkMarshalMsgapplicationArgs(b *testing.B) { - v := applicationArgs{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgapplicationArgs(b *testing.B) { - v := applicationArgs{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalapplicationArgs(b *testing.B) { - v := applicationArgs{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalassetIndices(t *testing.T) { - partitiontest.PartitionTest(t) - v := assetIndices{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingassetIndices(t *testing.T) { - protocol.RunEncodingTest(t, &assetIndices{}) -} - -func BenchmarkMarshalMsgassetIndices(b *testing.B) { - v := assetIndices{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgassetIndices(b *testing.B) { - v := assetIndices{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalassetIndices(b *testing.B) { - v := assetIndices{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalcertProofs(t *testing.T) { - partitiontest.PartitionTest(t) - v := certProofs{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingcertProofs(t *testing.T) { - protocol.RunEncodingTest(t, &certProofs{}) -} - -func BenchmarkMarshalMsgcertProofs(b *testing.B) { - v := certProofs{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgcertProofs(b *testing.B) { - v := certProofs{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalcertProofs(b *testing.B) { - v := certProofs{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedApplicationCallTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedApplicationCallTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedApplicationCallTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedApplicationCallTxnFields{}) -} - -func BenchmarkMarshalMsgencodedApplicationCallTxnFields(b *testing.B) { - v := encodedApplicationCallTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedApplicationCallTxnFields(b *testing.B) { - v := encodedApplicationCallTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedApplicationCallTxnFields(b *testing.B) { - v := encodedApplicationCallTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedAssetConfigTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedAssetConfigTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedAssetConfigTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedAssetConfigTxnFields{}) -} - -func BenchmarkMarshalMsgencodedAssetConfigTxnFields(b *testing.B) { - v := encodedAssetConfigTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedAssetConfigTxnFields(b *testing.B) { - v := encodedAssetConfigTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedAssetConfigTxnFields(b *testing.B) { - v := encodedAssetConfigTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedAssetFreezeTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedAssetFreezeTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedAssetFreezeTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedAssetFreezeTxnFields{}) -} - -func BenchmarkMarshalMsgencodedAssetFreezeTxnFields(b *testing.B) { - v := encodedAssetFreezeTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedAssetFreezeTxnFields(b *testing.B) { - v := encodedAssetFreezeTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedAssetFreezeTxnFields(b *testing.B) { - v := encodedAssetFreezeTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedAssetParams(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedAssetParams{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedAssetParams(t *testing.T) { - protocol.RunEncodingTest(t, &encodedAssetParams{}) -} - -func BenchmarkMarshalMsgencodedAssetParams(b *testing.B) { - v := encodedAssetParams{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedAssetParams(b *testing.B) { - v := encodedAssetParams{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedAssetParams(b *testing.B) { - v := encodedAssetParams{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedAssetTransferTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedAssetTransferTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedAssetTransferTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedAssetTransferTxnFields{}) -} - -func BenchmarkMarshalMsgencodedAssetTransferTxnFields(b *testing.B) { - v := encodedAssetTransferTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedAssetTransferTxnFields(b *testing.B) { - v := encodedAssetTransferTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedAssetTransferTxnFields(b *testing.B) { - v := encodedAssetTransferTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedBloomFilter(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedBloomFilter{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedBloomFilter(t *testing.T) { - protocol.RunEncodingTest(t, &encodedBloomFilter{}) -} - -func BenchmarkMarshalMsgencodedBloomFilter(b *testing.B) { - v := encodedBloomFilter{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedBloomFilter(b *testing.B) { - v := encodedBloomFilter{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedBloomFilter(b *testing.B) { - v := encodedBloomFilter{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedCert(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedCert{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedCert(t *testing.T) { - protocol.RunEncodingTest(t, &encodedCert{}) -} - -func BenchmarkMarshalMsgencodedCert(b *testing.B) { - v := encodedCert{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedCert(b *testing.B) { - v := encodedCert{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedCert(b *testing.B) { - v := encodedCert{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedCompactCertTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedCompactCertTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedCompactCertTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedCompactCertTxnFields{}) -} - -func BenchmarkMarshalMsgencodedCompactCertTxnFields(b *testing.B) { - v := encodedCompactCertTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedCompactCertTxnFields(b *testing.B) { - v := encodedCompactCertTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedCompactCertTxnFields(b *testing.B) { - v := encodedCompactCertTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedKeyregTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedKeyregTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedKeyregTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedKeyregTxnFields{}) -} - -func BenchmarkMarshalMsgencodedKeyregTxnFields(b *testing.B) { - v := encodedKeyregTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedKeyregTxnFields(b *testing.B) { - v := encodedKeyregTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedKeyregTxnFields(b *testing.B) { - v := encodedKeyregTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedLsigs(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedLsigs{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedLsigs(t *testing.T) { - protocol.RunEncodingTest(t, &encodedLsigs{}) -} - -func BenchmarkMarshalMsgencodedLsigs(b *testing.B) { - v := encodedLsigs{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedLsigs(b *testing.B) { - v := encodedLsigs{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedLsigs(b *testing.B) { - v := encodedLsigs{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedMsigs(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedMsigs{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedMsigs(t *testing.T) { - protocol.RunEncodingTest(t, &encodedMsigs{}) -} - -func BenchmarkMarshalMsgencodedMsigs(b *testing.B) { - v := encodedMsigs{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedMsigs(b *testing.B) { - v := encodedMsigs{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedMsigs(b *testing.B) { - v := encodedMsigs{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedPaymentTxnFields(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedPaymentTxnFields{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedPaymentTxnFields(t *testing.T) { - protocol.RunEncodingTest(t, &encodedPaymentTxnFields{}) -} - -func BenchmarkMarshalMsgencodedPaymentTxnFields(b *testing.B) { - v := encodedPaymentTxnFields{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedPaymentTxnFields(b *testing.B) { - v := encodedPaymentTxnFields{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedPaymentTxnFields(b *testing.B) { - v := encodedPaymentTxnFields{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedSignedTxns(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedSignedTxns{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedSignedTxns(t *testing.T) { - protocol.RunEncodingTest(t, &encodedSignedTxns{}) -} - -func BenchmarkMarshalMsgencodedSignedTxns(b *testing.B) { - v := encodedSignedTxns{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedSignedTxns(b *testing.B) { - v := encodedSignedTxns{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedSignedTxns(b *testing.B) { - v := encodedSignedTxns{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedTxnHeaders(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedTxnHeaders{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedTxnHeaders(t *testing.T) { - protocol.RunEncodingTest(t, &encodedTxnHeaders{}) -} - -func BenchmarkMarshalMsgencodedTxnHeaders(b *testing.B) { - v := encodedTxnHeaders{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedTxnHeaders(b *testing.B) { - v := encodedTxnHeaders{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedTxnHeaders(b *testing.B) { - v := encodedTxnHeaders{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalencodedTxns(t *testing.T) { - partitiontest.PartitionTest(t) - v := encodedTxns{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingencodedTxns(t *testing.T) { - protocol.RunEncodingTest(t, &encodedTxns{}) -} - -func BenchmarkMarshalMsgencodedTxns(b *testing.B) { - v := encodedTxns{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgencodedTxns(b *testing.B) { - v := encodedTxns{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalencodedTxns(b *testing.B) { - v := encodedTxns{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalpackedTransactionGroups(t *testing.T) { - partitiontest.PartitionTest(t) - v := packedTransactionGroups{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingpackedTransactionGroups(t *testing.T) { - protocol.RunEncodingTest(t, &packedTransactionGroups{}) -} - -func BenchmarkMarshalMsgpackedTransactionGroups(b *testing.B) { - v := packedTransactionGroups{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgpackedTransactionGroups(b *testing.B) { - v := packedTransactionGroups{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalpackedTransactionGroups(b *testing.B) { - v := packedTransactionGroups{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalrelayedProposal(t *testing.T) { - partitiontest.PartitionTest(t) - v := relayedProposal{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingrelayedProposal(t *testing.T) { - protocol.RunEncodingTest(t, &relayedProposal{}) -} - -func BenchmarkMarshalMsgrelayedProposal(b *testing.B) { - v := relayedProposal{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgrelayedProposal(b *testing.B) { - v := relayedProposal{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalrelayedProposal(b *testing.B) { - v := relayedProposal{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalrequestParams(t *testing.T) { - partitiontest.PartitionTest(t) - v := requestParams{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingrequestParams(t *testing.T) { - protocol.RunEncodingTest(t, &requestParams{}) -} - -func BenchmarkMarshalMsgrequestParams(b *testing.B) { - v := requestParams{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgrequestParams(b *testing.B) { - v := requestParams{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalrequestParams(b *testing.B) { - v := requestParams{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshalrevealMap(t *testing.T) { - partitiontest.PartitionTest(t) - v := revealMap{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingrevealMap(t *testing.T) { - protocol.RunEncodingTest(t, &revealMap{}) -} - -func BenchmarkMarshalMsgrevealMap(b *testing.B) { - v := revealMap{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgrevealMap(b *testing.B) { - v := revealMap{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshalrevealMap(b *testing.B) { - v := revealMap{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshaltimingParams(t *testing.T) { - partitiontest.PartitionTest(t) - v := timingParams{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingtimingParams(t *testing.T) { - protocol.RunEncodingTest(t, &timingParams{}) -} - -func BenchmarkMarshalMsgtimingParams(b *testing.B) { - v := timingParams{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgtimingParams(b *testing.B) { - v := timingParams{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshaltimingParams(b *testing.B) { - v := timingParams{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshaltransactionBlockMessage(t *testing.T) { - partitiontest.PartitionTest(t) - v := transactionBlockMessage{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingtransactionBlockMessage(t *testing.T) { - protocol.RunEncodingTest(t, &transactionBlockMessage{}) -} - -func BenchmarkMarshalMsgtransactionBlockMessage(b *testing.B) { - v := transactionBlockMessage{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgtransactionBlockMessage(b *testing.B) { - v := transactionBlockMessage{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshaltransactionBlockMessage(b *testing.B) { - v := transactionBlockMessage{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshaltxGroupsEncodingStub(t *testing.T) { - partitiontest.PartitionTest(t) - v := txGroupsEncodingStub{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingtxGroupsEncodingStub(t *testing.T) { - protocol.RunEncodingTest(t, &txGroupsEncodingStub{}) -} - -func BenchmarkMarshalMsgtxGroupsEncodingStub(b *testing.B) { - v := txGroupsEncodingStub{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgtxGroupsEncodingStub(b *testing.B) { - v := txGroupsEncodingStub{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshaltxGroupsEncodingStub(b *testing.B) { - v := txGroupsEncodingStub{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} - -func TestMarshalUnmarshaltxGroupsEncodingStubOld(t *testing.T) { - partitiontest.PartitionTest(t) - v := txGroupsEncodingStubOld{} - bts := v.MarshalMsg(nil) - left, err := v.UnmarshalMsg(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) - } - - left, err = msgp.Skip(bts) - if err != nil { - t.Fatal(err) - } - if len(left) > 0 { - t.Errorf("%d bytes left over after Skip(): %q", len(left), left) - } -} - -func TestRandomizedEncodingtxGroupsEncodingStubOld(t *testing.T) { - protocol.RunEncodingTest(t, &txGroupsEncodingStubOld{}) -} - -func BenchmarkMarshalMsgtxGroupsEncodingStubOld(b *testing.B) { - v := txGroupsEncodingStubOld{} - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - v.MarshalMsg(nil) - } -} - -func BenchmarkAppendMsgtxGroupsEncodingStubOld(b *testing.B) { - v := txGroupsEncodingStubOld{} - bts := make([]byte, 0, v.Msgsize()) - bts = v.MarshalMsg(bts[0:0]) - b.SetBytes(int64(len(bts))) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - bts = v.MarshalMsg(bts[0:0]) - } -} - -func BenchmarkUnmarshaltxGroupsEncodingStubOld(b *testing.B) { - v := txGroupsEncodingStubOld{} - bts := v.MarshalMsg(nil) - b.ReportAllocs() - b.SetBytes(int64(len(bts))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err := v.UnmarshalMsg(bts) - if err != nil { - b.Fatal(err) - } - } -} diff --git a/txnsync/outgoing.go b/txnsync/outgoing.go deleted file mode 100644 index fa18bd3535..0000000000 --- a/txnsync/outgoing.go +++ /dev/null @@ -1,348 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "errors" - "sort" - "time" - - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/util/timers" -) - -const messageTimeWindow = 20 * time.Millisecond - -var errTransactionSyncOutgoingMessageQueueFull = errors.New("transaction sync outgoing message queue is full") -var errTransactionSyncOutgoingMessageSendFailed = errors.New("transaction sync failed to send message") - -// sentMessageMetadata is the message metadata for a message that is being sent. It includes some extra -// pieces of information about the message itself, used for tracking the "content" of the message beyond -// the point where it's being encoded. -type sentMessageMetadata struct { - encodedMessageSize int - sentTransactionsIDs []transactions.Txid - message *transactionBlockMessage - peer *Peer - sentTimestamp time.Duration - sequenceNumber uint64 - partialMessage bool - transactionGroups []pooldata.SignedTxGroup - projectedSequenceNumber uint64 -} - -// messageAsyncEncoder structure encapsulates the encoding and sending of a given message to the network. The encoding -// could be a lengthy operation which does't need to be blocking the main loop. Moving the actual encoding into an -// execution pool thread frees up the main loop, allowing smoother operation. -type messageAsyncEncoder struct { - state *syncState - messageData sentMessageMetadata - roundClock timers.WallClock - lastReceivedMessageTimestamp time.Duration - peerDataExchangeRate uint64 - // sentMessagesCh is a copy of the outgoingMessagesCallbackCh in the syncState object. We want to create a copy of - // the channel so that in case of a txnsync restart ( i.e. fast catchup ), we can still generate a new channel - // without triggering a data race. The alternative is to block the txnsync.Shutdown() until we receive the feedback - // from the network library, but that could be susceptible to undesired network disconnections. - sentMessagesCh chan sentMessageMetadata -} - -// asyncMessageSent called via the network package to inform the txsync that a message was enqueued, and the associated sequence number. -func (encoder *messageAsyncEncoder) asyncMessageSent(enqueued bool, sequenceNumber uint64) error { - if !enqueued { - encoder.state.log.Infof("unable to send message to peer. disconnecting from peer.") - encoder.state.incomingMessagesQ.erase(encoder.messageData.peer, encoder.messageData.peer.networkPeer) - return errTransactionSyncOutgoingMessageSendFailed - } - // record the sequence number here, so that we can store that later on. - encoder.messageData.sequenceNumber = sequenceNumber - - select { - case encoder.sentMessagesCh <- encoder.messageData: - return nil - default: - // if we can't place it on the channel, return an error so that the node could disconnect from this peer. - encoder.state.log.Infof("unable to enqueue outgoing message confirmation; outgoingMessagesCallbackCh is full. disconnecting from peer.") - encoder.state.incomingMessagesQ.erase(encoder.messageData.peer, encoder.messageData.peer.networkPeer) - return errTransactionSyncOutgoingMessageQueueFull - } -} - -// asyncEncodeAndSend encodes transaction groups and sends peer message asynchronously -func (encoder *messageAsyncEncoder) asyncEncodeAndSend(interface{}) interface{} { - defer encoder.state.messageSendWaitGroup.Done() - - var err error - if len(encoder.messageData.transactionGroups) > 0 { - encoder.messageData.message.TransactionGroups, err = encoder.state.encodeTransactionGroups(encoder.messageData.transactionGroups, encoder.peerDataExchangeRate) - if err != nil { - encoder.state.log.Warnf("unable to encode transaction groups : %v", err) - } - encoder.messageData.transactionGroups = nil // clear out to allow GC to reclaim - } - - if encoder.lastReceivedMessageTimestamp >= 0 { - // adding a nanosecond to the elapsed time is meaningless for the data rate calculation, but would ensure that - // the ResponseElapsedTime field has a clear distinction between "being set" vs. "not being set" - encoder.messageData.message.MsgSync.ResponseElapsedTime = uint64((encoder.roundClock.Since() - encoder.lastReceivedMessageTimestamp).Nanoseconds()) - } - - encodedMessage := encoder.messageData.message.MarshalMsg(getMessageBuffer()) - encoder.messageData.encodedMessageSize = len(encodedMessage) - // now that the message is ready, we can discard the encoded transaction group slice to allow the GC to collect it. - releaseEncodedTransactionGroups(encoder.messageData.message.TransactionGroups.Bytes) - // record the timestamp here, before sending the raw bytes to the network : - // the time we spend on the network package might include the network processing time, which - // we want to make sure we avoid. - encoder.messageData.sentTimestamp = encoder.roundClock.Since() - - encoder.state.node.SendPeerMessage(encoder.messageData.peer.networkPeer, encodedMessage, encoder.asyncMessageSent) - releaseMessageBuffer(encodedMessage) - - encoder.messageData.message.TransactionGroups.Bytes = nil - // increase the metric for total messages sent. - txsyncOutgoingMessagesTotal.Inc(nil) - return nil -} - -// enqueue add the given message encoding task to the execution pool, and increase the waitgroup as needed. -func (encoder *messageAsyncEncoder) enqueue() { - encoder.state.messageSendWaitGroup.Add(1) - if err := encoder.state.threadpool.EnqueueBacklog(context.Background(), encoder.asyncEncodeAndSend, nil, nil); err != nil { - encoder.state.messageSendWaitGroup.Done() - } -} - -// pendingTransactionGroupsSnapshot is used to represent a snapshot of a pending transaction groups along with the latestLocallyOriginatedGroupCounter value. -// The goal is to ensure we're "capturing" this only once per `sendMessageLoop` call. In order to do so, we allocate that structure on the stack, and passing -// a pointer to that structure downstream. -type pendingTransactionGroupsSnapshot struct { - pendingTransactionsGroups []pooldata.SignedTxGroup - latestLocallyOriginatedGroupCounter uint64 -} - -func (s *syncState) sendMessageLoop(currentTime time.Duration, deadline timers.DeadlineMonitor, peers []*Peer) { - if len(peers) == 0 { - // no peers - no messages that need to be sent. - return - } - var pendingTransactions pendingTransactionGroupsSnapshot - profGetTxnsGroups := s.profiler.getElement(profElementGetTxnsGroups) - profAssembleMessage := s.profiler.getElement(profElementAssembleMessage) - var assembledBloomFilter bloomFilter - profGetTxnsGroups.start() - pendingTransactions.pendingTransactionsGroups, pendingTransactions.latestLocallyOriginatedGroupCounter = s.node.GetPendingTransactionGroups() - profGetTxnsGroups.end() - for _, peer := range peers { - msgEncoder := &messageAsyncEncoder{state: s, roundClock: s.clock, peerDataExchangeRate: peer.dataExchangeRate, sentMessagesCh: s.outgoingMessagesCallbackCh} - profAssembleMessage.start() - msgEncoder.messageData, assembledBloomFilter, msgEncoder.lastReceivedMessageTimestamp = s.assemblePeerMessage(peer, &pendingTransactions) - profAssembleMessage.end() - isPartialMessage := msgEncoder.messageData.partialMessage - // The message that we've just encoded is expected to be sent out with the next sequence number. - // However, since the enqueue method is using the execution pool, there is a remote chance that we - // would "garble" the message ordering. That's not a huge issue, but we need to be able to tell that - // so we can have accurate elapsed time measurements for the data exchange rate calculations. - msgEncoder.messageData.projectedSequenceNumber = peer.lastSentMessageSequenceNumber + 1 - msgEncoder.enqueue() - - // update the bloom filter right here, since we want to make sure the peer contains the - // correct sent bloom filter, regardless of the message sending timing. If and when we - // generate the next message, we need to ensure that we're aware of this bloom filter, since - // it would affect whether we re-generate another bloom filter or not. - peer.updateSentBoomFilter(assembledBloomFilter, s.round) - - scheduleOffset, ops := peer.getNextScheduleOffset(s.isRelay, s.lastBeta, isPartialMessage, currentTime) - if (ops & peerOpsSetInterruptible) == peerOpsSetInterruptible { - if _, has := s.interruptablePeersMap[peer]; !has { - s.interruptablePeers = append(s.interruptablePeers, peer) - s.interruptablePeersMap[peer] = len(s.interruptablePeers) - 1 - } - } - if (ops & peerOpsClearInterruptible) == peerOpsClearInterruptible { - if idx, has := s.interruptablePeersMap[peer]; has { - delete(s.interruptablePeersMap, peer) - s.interruptablePeers[idx] = nil - } - } - if (ops & peerOpsReschedule) == peerOpsReschedule { - s.scheduler.schedulePeer(peer, currentTime+scheduleOffset) - } - - if deadline.Expired() { - // we ran out of time sending messages, stop sending any more messages. - break - } - } -} - -func (s *syncState) assemblePeerMessage(peer *Peer, pendingTransactions *pendingTransactionGroupsSnapshot) (metaMessage sentMessageMetadata, assembledBloomFilter bloomFilter, lastReceivedMessageTimestamp time.Duration) { - metaMessage = sentMessageMetadata{ - peer: peer, - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: s.round, - }, - } - - bloomFilterSize := 0 - - msgOps := peer.getMessageConstructionOps(s.isRelay, s.fetchTransactions) - - if msgOps&messageConstUpdateRequestParams == messageConstUpdateRequestParams { - // update the UpdatedRequestParams - offset, modulator := peer.getLocalRequestParams() - metaMessage.message.UpdatedRequestParams.Modulator = modulator - if modulator > 0 { - // for relays, the modulator is always one, which means the following would always be zero. - metaMessage.message.UpdatedRequestParams.Offset = byte(uint64(offset) % uint64(modulator)) - } - } - - if (msgOps&messageConstBloomFilter == messageConstBloomFilter) && len(pendingTransactions.pendingTransactionsGroups) > 0 { - var lastBloomFilter *bloomFilter - var excludeTransactions *transactionCache - // for relays, where we send a full bloom filter to everyone, we want to coordinate that with a single - // copy of the bloom filter, to prevent re-creation. - if s.isRelay { - lastBloomFilter = &s.lastBloomFilter - } else { - // for peers, we want to make sure we don't regenerate the same bloom filter as before. - lastBloomFilter = &peer.lastSentBloomFilter - - // for non-relays, we want to be more picky and send bloom filter that excludes the transactions that were send from that relay - // ( since the relay already knows that it sent us these transactions ). we cannot do the same for relay->relay since it would - // conflict with the bloom filters being calculated only once. - excludeTransactions = peer.recentSentTransactions - } - filterTxns := pendingTransactions.pendingTransactionsGroups - minGroupCounter, lastGroupRound := peer.sentFilterParams.nextFilterGroup(metaMessage.message.UpdatedRequestParams) - if lastGroupRound != s.round { - minGroupCounter = 0 - } - if minGroupCounter > 0 { - mgi := sort.Search( - len(filterTxns), - func(i int) bool { - return filterTxns[i].GroupCounter >= minGroupCounter - }, - ) - if mgi >= len(filterTxns) { - goto notxns - } - filterTxns = filterTxns[mgi:] - } - profMakeBloomFilter := s.profiler.getElement(profElementMakeBloomFilter) - profMakeBloomFilter.start() - // generate a bloom filter that matches the requests params. - assembledBloomFilter = s.makeBloomFilter(metaMessage.message.UpdatedRequestParams, filterTxns, excludeTransactions, lastBloomFilter) - // we check here to see if the bloom filter we need happen to be the same as the one that was previously sent to the peer. - // ( note that we check here againt the peer, whereas the hint to makeBloomFilter could be the cached one for the relay ) - if !assembledBloomFilter.sameParams(peer.lastSentBloomFilter) && assembledBloomFilter.encodedLength > 0 { - if lastGroupRound != s.round { - assembledBloomFilter.encoded.ClearPrevious = 1 - } - metaMessage.message.TxnBloomFilter = assembledBloomFilter.encoded - bloomFilterSize = assembledBloomFilter.encodedLength - } - profMakeBloomFilter.end() - if s.isRelay { - s.lastBloomFilter = assembledBloomFilter - } - } -notxns: - - if msgOps&messageConstTransactions == messageConstTransactions { - transactionGroups := pendingTransactions.pendingTransactionsGroups - if !s.isRelay { - // on non-relay, we need to filter out the non-locally originated messages since we don't want - // non-relays to send transaction that they received via the transaction sync back. - transactionGroups = s.locallyGeneratedTransactions(pendingTransactions) - } - - profTxnsSelection := s.profiler.getElement(profElementTxnsSelection) - profTxnsSelection.start() - metaMessage.transactionGroups, metaMessage.sentTransactionsIDs, metaMessage.partialMessage = peer.selectPendingTransactions(transactionGroups, messageTimeWindow, s.round, bloomFilterSize) - profTxnsSelection.end() - - // clear the last sent bloom filter on the end of a series of partial messages. - // this would ensure we generate a new bloom filter every beta, which is needed - // in order to avoid the bloom filter inherent false positive rate. - if !metaMessage.partialMessage { - peer.lastSentBloomFilter = bloomFilter{} - } - } - - metaMessage.message.MsgSync.RefTxnBlockMsgSeq = peer.nextReceivedMessageSeq - 1 - // signify that timestamp is not set - lastReceivedMessageTimestamp = time.Duration(-1) - if peer.lastReceivedMessageTimestamp != 0 && peer.lastReceivedMessageLocalRound == s.round { - lastReceivedMessageTimestamp = peer.lastReceivedMessageTimestamp - // reset the lastReceivedMessageTimestamp so that we won't be using that again on a subsequent outgoing message. - peer.lastReceivedMessageTimestamp = 0 - } - - // use the messages seq number that we've accepted so far, and let the other peer - // know about them. The getAcceptedMessages would delete the returned list from the peer's storage before - // returning. - metaMessage.message.MsgSync.AcceptedMsgSeq = peer.getAcceptedMessages() - - if msgOps&messageConstNextMinDelay == messageConstNextMinDelay { - metaMessage.message.MsgSync.NextMsgMinDelay = uint64(s.lastBeta.Nanoseconds()) * 2 - } - return -} - -func (s *syncState) evaluateOutgoingMessage(msgData sentMessageMetadata) { - timestamp := msgData.sentTimestamp - // test to see if our message got re-ordered between the time we placed it on the execution pool queue and the time - // we received it back from the network: - if msgData.sequenceNumber != msgData.projectedSequenceNumber { - // yes, the order was changed. In this case, we will set the timestamp to zero. This would allow the - // incoming message handler to identify that we shouldn't use this timestamp for calculating the data exchange rate. - timestamp = 0 - } - msgData.peer.updateMessageSent(msgData.message, msgData.sentTransactionsIDs, timestamp, msgData.sequenceNumber, msgData.encodedMessageSize) - s.log.outgoingMessage(msgStats{msgData.sequenceNumber, msgData.message.Round, len(msgData.sentTransactionsIDs), msgData.message.UpdatedRequestParams, len(msgData.message.TxnBloomFilter.BloomFilter), msgData.message.MsgSync.NextMsgMinDelay, msgData.peer.networkAddress()}) -} - -// locallyGeneratedTransactions return a subset of the given transactionGroups array by filtering out transactions that are not locally generated. -func (s *syncState) locallyGeneratedTransactions(pendingTransactions *pendingTransactionGroupsSnapshot) (result []pooldata.SignedTxGroup) { - if pendingTransactions.latestLocallyOriginatedGroupCounter == pooldata.InvalidSignedTxGroupCounter || len(pendingTransactions.pendingTransactionsGroups) == 0 { - return []pooldata.SignedTxGroup{} - } - n := sort.Search(len(pendingTransactions.pendingTransactionsGroups), func(i int) bool { - return pendingTransactions.pendingTransactionsGroups[i].GroupCounter >= pendingTransactions.latestLocallyOriginatedGroupCounter - }) - if n == len(pendingTransactions.pendingTransactionsGroups) { - n-- - } - result = make([]pooldata.SignedTxGroup, n+1) - - count := 0 - for i := 0; i <= n; i++ { - txnGroup := pendingTransactions.pendingTransactionsGroups[i] - if !txnGroup.LocallyOriginated { - continue - } - result[count] = txnGroup - count++ - } - return result[:count] -} diff --git a/txnsync/outgoing_test.go b/txnsync/outgoing_test.go deleted file mode 100644 index 3136161ef3..0000000000 --- a/txnsync/outgoing_test.go +++ /dev/null @@ -1,615 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "reflect" - "sync" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/execpool" - "github.com/algorand/go-algorand/util/timers" -) - -type mockAsyncLogger struct { - logging.Logger - warnCalled *bool -} - -func (m mockAsyncLogger) outgoingMessage(mstat msgStats) { -} - -func (m mockAsyncLogger) incomingMessage(mstat msgStats) { -} - -func (m mockAsyncLogger) Infof(string, ...interface{}) {} - -func (m mockAsyncLogger) Warnf(string, ...interface{}) { - if m.warnCalled != nil { - *m.warnCalled = true - } -} - -func TestAsyncMessageSent(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - s.log = mockAsyncLogger{} - s.incomingMessagesQ = makeIncomingMessageQueue() - defer s.incomingMessagesQ.shutdown() - - asyncEncoder := messageAsyncEncoder{ - state: &s, - messageData: sentMessageMetadata{ - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 1, - }, - peer: &Peer{}, - }, - roundClock: timers.MakeMonotonicClock(time.Now()), - sentMessagesCh: s.outgoingMessagesCallbackCh, - } - - oldTimestamp := asyncEncoder.messageData.sentTimestamp - a.Equal(asyncEncoder.asyncMessageSent(false, 0), errTransactionSyncOutgoingMessageSendFailed) - err := asyncEncoder.asyncMessageSent(true, 1337) - a.Equal(err, errTransactionSyncOutgoingMessageQueueFull) - a.Equal(asyncEncoder.messageData.sentTimestamp, oldTimestamp) - a.Equal(asyncEncoder.messageData.sequenceNumber, uint64(1337)) - - // Make this buffered for now so we catch the select statement - asyncEncoder.sentMessagesCh = make(chan sentMessageMetadata, 1) - - err = asyncEncoder.asyncMessageSent(true, 1337) - a.Nil(err) - a.Equal(1, len(asyncEncoder.sentMessagesCh)) -} - -type mockAsyncNodeConnector struct { - NodeConnector - called *bool - largeTxnGroup bool -} - -func (m mockAsyncNodeConnector) Random(rng uint64) uint64 { - // We need to be deterministic in our "randomness" for the tests - return 42 -} - -func (m mockAsyncNodeConnector) SendPeerMessage(netPeer interface{}, msg []byte, callback SendMessageCallback) { - *m.called = true -} - -func (m mockAsyncNodeConnector) GetPendingTransactionGroups() (txGroups []pooldata.SignedTxGroup, latestLocallyOriginatedGroupCounter uint64) { - if m.largeTxnGroup { - rval := []pooldata.SignedTxGroup{} - for i := 0; i < 100000; i++ { - // Because we use this with non-relay nodes, the syncState will - // use the locallyGeneratedTransactions() function. - // To make sure we fill the values appropriately, we are going to - // set every value here to be locally originated - // Additionally, we want the encoded length to be 1000 (or something rather large) - // to make sure that we can attain partial messages (see TestSendMessageLoop test) - rval = append(rval, pooldata.SignedTxGroup{EncodedLength: 1000, LocallyOriginated: true}) - } - - return rval, 1 - } - return []pooldata.SignedTxGroup{}, 1 -} - -// TestAsyncEncodeAndSendErr Tests response when encodeTransactionGroups doesn't return an error -func TestAsyncEncodeAndSendNonErr(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - warnCalled := false - s.log = mockAsyncLogger{warnCalled: &warnCalled} - sendPeerMessageCalled := false - s.node = mockAsyncNodeConnector{called: &sendPeerMessageCalled} - s.messageSendWaitGroup = sync.WaitGroup{} - - txnGrps := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - transactions.SignedTxn{ - Txn: transactions.Transaction{ - Type: protocol.AssetConfigTx, - }, - }, - }, - }, - } - - asyncEncoder := messageAsyncEncoder{ - state: &s, - messageData: sentMessageMetadata{ - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 1, - }, - transactionGroups: txnGrps, - peer: &Peer{}, - }, - roundClock: timers.MakeMonotonicClock(time.Now()), - } - - asyncEncoder.state.messageSendWaitGroup.Add(1) - - err := asyncEncoder.asyncEncodeAndSend(nil) - - a.Nil(err) - a.False(warnCalled) - a.True(sendPeerMessageCalled) - a.Nil(asyncEncoder.messageData.transactionGroups) -} - -// TestAsyncEncodeAndSendErr Tests response when encodeTransactionGroups returns an error -func TestAsyncEncodeAndSendErr(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - warnCalled := false - s.log = mockAsyncLogger{warnCalled: &warnCalled} - sendPeerMessageCalled := false - s.node = mockAsyncNodeConnector{called: &sendPeerMessageCalled} - s.messageSendWaitGroup = sync.WaitGroup{} - - txnGrps := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - transactions.SignedTxn{ - Txn: transactions.Transaction{ - Type: protocol.UnknownTx, - }, - }, - }, - }, - } - - asyncEncoder := messageAsyncEncoder{ - state: &s, - messageData: sentMessageMetadata{ - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 1, - }, - transactionGroups: txnGrps, - peer: &Peer{}, - }, - roundClock: timers.MakeMonotonicClock(time.Now()), - } - - asyncEncoder.state.messageSendWaitGroup.Add(1) - - err := asyncEncoder.asyncEncodeAndSend(nil) - - a.Nil(err) - a.True(warnCalled) - a.True(sendPeerMessageCalled) - -} - -// TestAsyncEncodeAndSend Tests that SendPeerMessage is called in the node connector -func TestAsyncEncodeAndSend(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - s.log = mockAsyncLogger{} - sendPeerMessageCalled := false - s.node = mockAsyncNodeConnector{called: &sendPeerMessageCalled} - s.messageSendWaitGroup = sync.WaitGroup{} - - asyncEncoder := messageAsyncEncoder{ - state: &s, - messageData: sentMessageMetadata{ - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 1, - }, - peer: &Peer{}, - }, - roundClock: timers.MakeMonotonicClock(time.Now()), - } - - asyncEncoder.state.messageSendWaitGroup.Add(1) - - err := asyncEncoder.asyncEncodeAndSend(nil) - a.Nil(err) - a.True(sendPeerMessageCalled) - a.NotZero(asyncEncoder.messageData.sentTimestamp) - -} - -// TestAssemblePeerMessage_messageConstBloomFilter Tests assemblePeerMessage with messageConstBloomFilter msgOps -func TestAssemblePeerMessage_messageConstBloomFilter(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - s := syncState{ - node: mockAsyncNodeConnector{}, - clock: timers.MakeMonotonicClock(time.Now()), - } - - s.profiler = makeProfiler(1*time.Millisecond, s.clock, s.log, 1*time.Millisecond) - - peer := Peer{} - - pendingTransactions := pendingTransactionGroupsSnapshot{ - pendingTransactionsGroups: []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{}, - }, - } - - peer.setLocalRequestParams(111, 222) - peer.lastReceivedMessageTimestamp = 100 - peer.lastReceivedMessageLocalRound = s.round - - expectedFilter := s.makeBloomFilter(requestParams{Offset: 111, Modulator: 222}, pendingTransactions.pendingTransactionsGroups, nil, &s.lastBloomFilter) - - s.isRelay = true - peer.isOutgoing = true - peer.state = peerStateLateBloom - - metaMessage, _, responseTime := s.assemblePeerMessage(&peer, &pendingTransactions) - - a.Equal(metaMessage.message.UpdatedRequestParams.Modulator, byte(222)) - a.Equal(metaMessage.message.UpdatedRequestParams.Offset, byte(111)) - a.Equal(metaMessage.peer, &peer) - a.Equal(metaMessage.message.Version, int32(txnBlockMessageVersion)) - a.Equal(metaMessage.message.Round, s.round) - a.True(responseTime >= 0) - a.Equal(s.lastBloomFilter, expectedFilter) -} - -// TestAssemblePeerMessage_messageConstBloomFilterNonRelay Tests assemblePeerMessage with messageConstBloomFilter msgOps in a non-relay scenario -func TestAssemblePeerMessage_messageConstBloomFilterNonRelay(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - s := syncState{ - node: mockAsyncNodeConnector{largeTxnGroup: true}, - clock: timers.MakeMonotonicClock(time.Now()), - } - - s.profiler = makeProfiler(1*time.Millisecond, s.clock, s.log, 1*time.Millisecond) - - peer := Peer{} - - pendingTransactions := pendingTransactionGroupsSnapshot{ - pendingTransactionsGroups: []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{}, - }, - } - - peer.setLocalRequestParams(111, 222) - peer.lastReceivedMessageTimestamp = 100 - peer.lastReceivedMessageLocalRound = s.round - - expectedFilter := s.makeBloomFilter(requestParams{Offset: 111, Modulator: 222}, pendingTransactions.pendingTransactionsGroups, nil, &s.lastBloomFilter) - - s.isRelay = false - s.fetchTransactions = true - peer.isOutgoing = true - peer.state = peerStateLateBloom - - metaMessage, _, responseTime := s.assemblePeerMessage(&peer, &pendingTransactions) - - a.Equal(metaMessage.message.UpdatedRequestParams.Modulator, byte(222)) - a.Equal(metaMessage.message.UpdatedRequestParams.Offset, byte(111)) - a.Equal(metaMessage.peer, &peer) - a.Equal(metaMessage.message.Version, int32(txnBlockMessageVersion)) - a.Equal(metaMessage.message.Round, s.round) - a.True(responseTime >= 0) - a.NotEqual(s.lastBloomFilter, expectedFilter) -} - -// TestAssemblePeerMessage_messageConstNextMinDelay_messageConstUpdateRequestParams Tests assemblePeerMessage with messageConstNextMinDelay | messageConstUpdateRequestParams msgOps -func TestAssemblePeerMessage_messageConstNextMinDelay_messageConstUpdateRequestParams(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - s := syncState{clock: timers.MakeMonotonicClock(time.Now())} - - s.profiler = makeProfiler(1*time.Millisecond, s.clock, s.log, 1*time.Millisecond) - - peer := Peer{} - - pendingTransactions := pendingTransactionGroupsSnapshot{} - - peer.setLocalRequestParams(111, 222) - peer.lastReceivedMessageTimestamp = 100 - peer.lastReceivedMessageLocalRound = s.round - - s.isRelay = true - s.lastBeta = 123 * time.Nanosecond - - metaMessage, _, responseTime := s.assemblePeerMessage(&peer, &pendingTransactions) - - a.Equal(metaMessage.message.UpdatedRequestParams.Modulator, byte(222)) - a.Equal(metaMessage.message.UpdatedRequestParams.Offset, byte(111)) - a.Equal(metaMessage.peer, &peer) - a.Equal(metaMessage.message.Version, int32(txnBlockMessageVersion)) - a.Equal(metaMessage.message.Round, s.round) - a.True(responseTime >= 0) - a.Equal(metaMessage.message.MsgSync.NextMsgMinDelay, uint64(s.lastBeta.Nanoseconds())*2) - -} - -// TestAssemblePeerMessage_messageConstTransactions Tests assemblePeerMessage messageConstTransactions msgOps -func TestAssemblePeerMessage_messageConstTransactions(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - s := syncState{clock: timers.MakeMonotonicClock(time.Now())} - - s.profiler = makeProfiler(1*time.Millisecond, s.clock, s.log, 1*time.Millisecond) - - peer := Peer{} - - pendingTransactions := pendingTransactionGroupsSnapshot{ - latestLocallyOriginatedGroupCounter: 1, - pendingTransactionsGroups: []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - LocallyOriginated: true, - EncodedLength: 2, - }, - }, - } - - peer.setLocalRequestParams(111, 222) - peer.lastReceivedMessageTimestamp = 100 - peer.lastReceivedMessageLocalRound = s.round - peer.requestedTransactionsModulator = 2 - peer.recentSentTransactions = makeTransactionCache(5, 10, 20) - - s.isRelay = false - peer.isOutgoing = true - peer.state = peerStateHoldsoff - - metaMessage, _, _ := s.assemblePeerMessage(&peer, &pendingTransactions) - - a.Equal(len(metaMessage.transactionGroups), 1) - a.True(reflect.DeepEqual(metaMessage.transactionGroups[0], pendingTransactions.pendingTransactionsGroups[0])) - -} - -// TestLocallyGeneratedTransactions Separately tests that generating transactions are being -// correctly made given a signed transaction group array. -func TestLocallyGeneratedTransactions(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - pendingTransactions := &pendingTransactionGroupsSnapshot{} - - s := syncState{} - - pendingTransactions.latestLocallyOriginatedGroupCounter = 1 - - a.Equal(s.locallyGeneratedTransactions(pendingTransactions), []pooldata.SignedTxGroup{}) - - pendingTransactions.pendingTransactionsGroups = []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - LocallyOriginated: true, - EncodedLength: 2, - }, - pooldata.SignedTxGroup{ - LocallyOriginated: false, - EncodedLength: 1, - }, - pooldata.SignedTxGroup{ - LocallyOriginated: true, - EncodedLength: 3, - }, - } - - pendingTransactions.latestLocallyOriginatedGroupCounter = pooldata.InvalidSignedTxGroupCounter - - a.Equal(s.locallyGeneratedTransactions(pendingTransactions), []pooldata.SignedTxGroup{}) - - pendingTransactions.latestLocallyOriginatedGroupCounter = 1 - - expected := []pooldata.SignedTxGroup{ - - pooldata.SignedTxGroup{ - LocallyOriginated: true, - EncodedLength: 2, - }, - - pooldata.SignedTxGroup{ - LocallyOriginated: true, - EncodedLength: 3, - }, - } - - a.Equal(s.locallyGeneratedTransactions(pendingTransactions), expected) - -} - -type mockBacklogThreadPool struct { - execpool.BacklogPool - enqueueCalled *int -} - -func (b *mockBacklogThreadPool) EnqueueBacklog(enqueueCtx context.Context, t execpool.ExecFunc, arg interface{}, out chan interface{}) error { - if b.enqueueCalled != nil { - *b.enqueueCalled++ - } - - return nil -} - -// TestEnqueue directly tests that enqueue will call the Done() function for the messageSendWaitGroup -func TestEnqueue(t *testing.T) { - - partitiontest.PartitionTest(t) - - s := syncState{clock: timers.MakeMonotonicClock(time.Now())} - s.log = mockAsyncLogger{} - s.node = &mockNodeConnector{} - s.threadpool = execpool.MakeBacklog(execpool.MakePool(t), 5, execpool.LowPriority, t) - - prof := makeProfiler(2*time.Millisecond, s.clock, s.log, 3*time.Millisecond) - s.profiler = prof - - asyncEncoder := messageAsyncEncoder{ - state: &s, - messageData: sentMessageMetadata{ - message: &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 1, - }, - peer: &Peer{}, - }, - roundClock: timers.MakeMonotonicClock(time.Now()), - } - - asyncEncoder.enqueue() - - // Wait for the enqueued function to return the messageSendWaitGroup - s.messageSendWaitGroup.Wait() - - // Dummy require to make sure we pass this test...the real value of this test - // is to make sure that the wait group is appropriately set - require.True(t, true) - -} - -// TestSendMessageLoop tests the send message loop -func TestSendMessageLoop(t *testing.T) { - - partitiontest.PartitionTest(t) - - enqueueCalled := 0 - - s := syncState{ - clock: timers.MakeMonotonicClock(time.Now()), - scheduler: makePeerScheduler(), - } - s.log = mockAsyncLogger{} - // Get a large amount of signed txns with a low data exchange rate - // to get partial messages to trigger peerOpsClearInterruptible - s.node = &mockAsyncNodeConnector{largeTxnGroup: true} - s.threadpool = &mockBacklogThreadPool{enqueueCalled: &enqueueCalled} - - prof := makeProfiler(2*time.Millisecond, s.clock, s.log, 3*time.Millisecond) - s.profiler = prof - s.interruptablePeersMap = make(map[*Peer]int) - - peers := []*Peer{ - // peerOpsReschedule - &Peer{ - recentSentTransactions: makeTransactionCache(10, 20, 10), - requestedTransactionsModulator: 2, - // Reduced rate to trigger partial messages - dataExchangeRate: 10, - // greater than 0 for state machine logic - nextStateTimestamp: 1 * time.Millisecond, - }, - &Peer{ - recentSentTransactions: makeTransactionCache(10, 20, 10), - requestedTransactionsModulator: 2, - // Reduced rate to trigger partial messages - dataExchangeRate: 10, - // greater than 0 for state machine logic - nextStateTimestamp: 1 * time.Millisecond, - }, - } - - // Add the peers to test that peerOpsClearInterruptible removes them - - for _, p := range peers { - s.interruptablePeers = append(s.interruptablePeers, p) - s.interruptablePeersMap[p] = len(s.interruptablePeers) - 1 - } - - // The deadline is set to a ridiculously high number to make sure that we cycle through all our peers - // and not break - s.sendMessageLoop(s.clock.Since(), s.clock.DeadlineMonitorAt(s.clock.Since()+5*time.Minute), peers) - - require.Equal(t, 2, enqueueCalled) - require.Equal(t, 0, len(s.interruptablePeersMap)) - -} - -// TestEvaluateOutgoingMessage tests the evaluateOutgoingMessage function of syncState -func TestEvaluateOutgoingMessage(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - s := syncState{clock: timers.MakeMonotonicClock(time.Now())} - s.log = mockAsyncLogger{} - - peer := Peer{ - recentSentTransactions: makeTransactionCache(10, 20, 10), - } - - sentMessage := sentMessageMetadata{ - sentTimestamp: time.Duration(time.Millisecond * 1234), - message: &transactionBlockMessage{Round: 3}, - sequenceNumber: 42, - projectedSequenceNumber: 44, - encodedMessageSize: 23, - peer: &peer, - } - - s.evaluateOutgoingMessage(sentMessage) - // This should be zero because sequenceNumber and projectedSequenceNumber are not equal - a.Equal(peer.lastSentMessageTimestamp, 0*time.Millisecond) - - a.Equal(peer.lastSentMessageSequenceNumber, uint64(42)) - a.Equal(peer.lastSentMessageRound, basics.Round(3)) - a.Equal(peer.lastSentMessageSize, 23) - - sentMessage.sequenceNumber = sentMessage.projectedSequenceNumber - - s.evaluateOutgoingMessage(sentMessage) - a.Equal(peer.lastSentMessageTimestamp, 1234*time.Millisecond) - - a.Equal(peer.lastSentMessageSequenceNumber, uint64(44)) - a.Equal(peer.lastSentMessageRound, basics.Round(3)) - a.Equal(peer.lastSentMessageSize, 23) -} diff --git a/txnsync/peer.go b/txnsync/peer.go deleted file mode 100644 index b33ed0ed1c..0000000000 --- a/txnsync/peer.go +++ /dev/null @@ -1,852 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "math" - "sort" - "time" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" -) - -//msgp:ignore peerState -type peerState int - -//msgp:ignore peersOps -type peersOps int - -//msgp:ignore messageConstructionOps -type messageConstructionOps int - -const maxIncomingBloomFilterHistory = 200 - -// shortTermRecentTransactionsSentBufferLength is the size of the short term storage for the recently sent transaction ids. -// it should be configured sufficiently high so that any number of transaction sent would not exceed that number before -// the other peer has a chance of sending a feedback. ( when the feedback is received, we will store these IDs into the long-term cache ) -const shortTermRecentTransactionsSentBufferLength = 5000 - -// pendingUnconfirmedRemoteMessages is the number of messages we would cache before receiving a feedback from the other -// peer that these message have been accepted. The general guideline here is that if we have a message every 200ms on one side -// and a message every 20ms on the other, then the ratio of 200/20 = 10, should be the number of required messages (min). -const pendingUnconfirmedRemoteMessages = 20 - -// longTermRecentTransactionsSentBufferLength is the size of the long term transaction id cache. -const longTermRecentTransactionsSentBufferLength = 15000 -const minDataExchangeRateThreshold = 500 * 1024 // 500KB/s, which is ~3.9Mbps -const maxDataExchangeRateThreshold = 100 * 1024 * 1024 / 8 // 100Mbps -const defaultDataExchangeRate = minDataExchangeRateThreshold -const defaultRelayToRelayDataExchangeRate = 10 * 1024 * 1024 / 8 // 10Mbps -const bloomFilterRetryCount = 3 // number of bloom filters we would try against each transaction group before skipping it. -const maxTransactionGroupTrackers = 15 // number of different bloom filter parameters we store before rolling over - -const ( - // peerStateStartup is before the timeout for the sending the first message to the peer has reached. - // for an outgoing peer, it means that an incoming message arrived, and one or more messages need to be sent out. - peerStateStartup peerState = iota - // peerStateHoldsoff is set once a message was sent to a peer, and we're holding off before sending additional messages. - peerStateHoldsoff - // peerStateInterrupt is set once the holdoff period for the peer have expired. - peerStateInterrupt - // peerStateLateBloom is set for outgoing peers on relays, indicating that the next message should be a bloom filter only message. - peerStateLateBloom - - peerOpsSendMessage peersOps = 1 - peerOpsSetInterruptible peersOps = 2 - peerOpsClearInterruptible peersOps = 4 - peerOpsReschedule peersOps = 8 - - messageConstBloomFilter messageConstructionOps = 1 - messageConstTransactions messageConstructionOps = 2 - messageConstNextMinDelay messageConstructionOps = 4 - messageConstUpdateRequestParams messageConstructionOps = 8 - - // defaultSignificantMessageThreshold is the minimal transmitted message size which would be used for recalculating the - // data exchange rate. - defaultSignificantMessageThreshold = 50000 -) - -// incomingBloomFilter stores an incoming bloom filter, along with the associated round number. -// the round number allow us to prune filters from rounds n-2 and below. -type incomingBloomFilter struct { - filter *testableBloomFilter - round basics.Round -} - -// Peer contains peer-related data which extends the data "known" and managed by the network package. -type Peer struct { - // networkPeer is the network package exported peer. It's created on construction and never change afterward. - networkPeer interface{} - // isOutgoing defines whether the peer is an outgoing peer or not. For relays, this is meaningful as these have - // slightly different message timing logic. - isOutgoing bool - // significantMessageThreshold is the minimal transmitted message size which would be used for recalculating the - // data exchange rate. When significantMessageThreshold is equal to math.MaxUint64, no data exchange rate updates would be - // performed. - significantMessageThreshold uint64 - // state defines the peer state ( in terms of state machine state ). It's touched only by the sync main state machine - state peerState - - log Logger - - // lastRound is the latest round reported by the peer. - lastRound basics.Round - - // incomingMessages contains the incoming messages from this peer. This heap help us to reorder the incoming messages so that - // we could process them in the tcp-transport order. - incomingMessages messageOrderingHeap - - // nextReceivedMessageSeq is a counter containing the next message sequence number that we expect to see from this peer. - nextReceivedMessageSeq uint64 // the next message seq that we expect to receive from that peer; implies that all previous messages have been accepted. - - // recentIncomingBloomFilters contains the recent list of bloom filters sent from the peer. When considering sending transactions, we check this - // array to determine if the peer already has this message. - recentIncomingBloomFilters []incomingBloomFilter - - // recentSentTransactions contains the recently sent transactions. It's needed since we don't want to rely on the other peer's bloom filter while - // sending back-to-back messages. - recentSentTransactions *transactionCache - // recentSentTransactionsRound is the round associated with the cache of recently sent transactions. We keep this variable around so that we can - // flush the cache on every round so that we can give pending transaction another chance of being transmitted. - recentSentTransactionsRound basics.Round - - // these two fields describe "what does that peer asked us to send it" - requestedTransactionsModulator byte - requestedTransactionsOffset byte - - // lastSentMessageSequenceNumber is the last sequence number of the message that we sent. - lastSentMessageSequenceNumber uint64 - // lastSentMessageRound is the round the last sent message was sent on. The timestamps are relative to the beginning of the round - // and therefore need to be evaluated togather. - lastSentMessageRound basics.Round - // lastSentMessageTimestamp the timestamp at which the last message was sent. - lastSentMessageTimestamp time.Duration - // lastSentMessageSize is the encoded message size of the last sent message - lastSentMessageSize int - // lastSentBloomFilter is the last bloom filter that was sent to this peer. - // This bloom filter could be stale if no bloom filter was included in the last message. - lastSentBloomFilter bloomFilter - - // sentFilterParams records the Round and max txn group counter of the last filter sent to a peer (for each {Modulator,Offset}). - // From this an efficient next filter can be calculated for just the new txns, or a full filter after a Round turnover. - sentFilterParams sentFilters - - // lastConfirmedMessageSeqReceived is the last message sequence number that was confirmed by the peer to have been accepted. - lastConfirmedMessageSeqReceived uint64 - lastReceivedMessageLocalRound basics.Round - lastReceivedMessageTimestamp time.Duration - lastReceivedMessageSize int - lastReceivedMessageNextMsgMinDelay time.Duration - - // dataExchangeRate is the combined upload/download rate in bytes/second - dataExchangeRate uint64 - // cachedLatency is the measured network latency of a peer, updated every round - cachedLatency time.Duration - - // these two fields describe "what does the local peer want the remote peer to send back" - localTransactionsModulator byte - localTransactionsBaseOffset byte - - // lastTransactionSelectionTracker tracks the last transaction group counter that we've evaluated on the selectPendingTransactions method. - // it used to ensure that on subsequent calls, we won't need to scan the entire pending transactions array from the beginning. - // the implementation here is breaking it up per request params, so that we can apply the above logic per request params ( i.e. different - // offset/modulator ), as well as add retry attempts for multiple bloom filters. - lastTransactionSelectionTracker transactionGroupCounterTracker - - // nextStateTimestamp indicates the next timestamp where the peer state would need to be changed. - // it used to allow sending partial message while retaining the "next-beta time", or, in the case of outgoing relays, - // its being used to hold when we need to send the last (bloom) message. - nextStateTimestamp time.Duration - // messageSeriesPendingTransactions contain the transactions we are sending in the current "message-series". It allows us to pick a given - // "snapshot" from the transaction pool, and send that "snapshot" to completion before attempting to re-iterate. - messageSeriesPendingTransactions []pooldata.SignedTxGroup - - // transactionPoolAckCh is passed to the transaction handler when incoming transaction arrives. The channel is passed upstream, so that once - // a transaction is added to the transaction pool, we can get some feedback for that. - transactionPoolAckCh chan uint64 - - // transactionPoolAckMessages maintain a list of the recent incoming messages sequence numbers whose transactions were added fully to the transaction - // pool. This list is being flushed out every time we send a message to the peer. - transactionPoolAckMessages []uint64 - - // used by the selectPendingTransactions method, the lastSelectedTransactionsCount contains the number of entries selected on the previous iteration. - // this value is used to optimize the memory preallocation for the selection IDs array. - lastSelectedTransactionsCount int -} - -// requestParamsGroupCounterState stores the latest group counters for a given set of request params. -// we use this to ensure we can have multiple iteration of bloom filter scanning over each individual -// transaction group. This method allow us to reduce the bloom filter errors while avoid scanning the -// list of transactions redundently. -//msgp:ignore transactionGroupCounterState -type requestParamsGroupCounterState struct { - offset byte - modulator byte - groupCounters [bloomFilterRetryCount]uint64 -} - -// transactionGroupCounterTracker manages the group counter state for each request param. -//msgp:ignore transactionGroupCounterTracker -type transactionGroupCounterTracker []requestParamsGroupCounterState - -// get returns the group counter for a given set of request param. -func (t *transactionGroupCounterTracker) get(offset, modulator byte) uint64 { - i := t.index(offset, modulator) - if i >= 0 { - return (*t)[i].groupCounters[0] - } - return 0 -} - -// set updates the group counter for a given set of request param. If no such request -// param currently exists, it create it. -func (t *transactionGroupCounterTracker) set(offset, modulator byte, counter uint64) { - i := t.index(offset, modulator) - if i >= 0 { - (*t)[i].groupCounters[0] = counter - return - } - // if it doesn't exists - - state := requestParamsGroupCounterState{ - offset: offset, - modulator: modulator, - } - state.groupCounters[0] = counter - - if len(*t) == maxTransactionGroupTrackers { - // shift all entries by one. - copy((*t)[0:], (*t)[1:]) - (*t)[maxTransactionGroupTrackers-1] = state - } else { - *t = append(*t, state) - } -} - -// roll the counters for a given requests params, so that we would go back and -// rescan some of the previous transaction groups ( but not all !) when selectPendingTransactions is called. -func (t *transactionGroupCounterTracker) roll(offset, modulator byte) { - i := t.index(offset, modulator) - if i < 0 { - return - } - - if (*t)[i].groupCounters[1] >= (*t)[i].groupCounters[0] { - return - } - firstGroupCounter := (*t)[i].groupCounters[0] - copy((*t)[i].groupCounters[0:], (*t)[i].groupCounters[1:]) - (*t)[i].groupCounters[bloomFilterRetryCount-1] = firstGroupCounter -} - -// index is a helper method for the transactionGroupCounterTracker, helping to locate the index of -// a requestParamsGroupCounterState in the array that matches the provided request params. The method -// uses a linear search, which works best against small arrays. -func (t *transactionGroupCounterTracker) index(offset, modulator byte) int { - for i, counter := range *t { - if counter.offset == offset && counter.modulator == modulator { - return i - } - } - return -1 -} - -func makePeer(networkPeer interface{}, isOutgoing bool, isLocalNodeRelay bool, cfg *config.Local, log Logger, latency time.Duration) *Peer { - p := &Peer{ - networkPeer: networkPeer, - isOutgoing: isOutgoing, - recentSentTransactions: makeTransactionCache(shortTermRecentTransactionsSentBufferLength, longTermRecentTransactionsSentBufferLength, pendingUnconfirmedRemoteMessages), - dataExchangeRate: defaultDataExchangeRate, - cachedLatency: latency, - transactionPoolAckCh: make(chan uint64, maxAcceptedMsgSeq), - transactionPoolAckMessages: make([]uint64, 0, maxAcceptedMsgSeq), - significantMessageThreshold: defaultSignificantMessageThreshold, - log: log, - } - if isLocalNodeRelay { - p.requestedTransactionsModulator = 1 - p.dataExchangeRate = defaultRelayToRelayDataExchangeRate - } - if cfg.TransactionSyncDataExchangeRate > 0 { - p.dataExchangeRate = cfg.TransactionSyncDataExchangeRate - p.significantMessageThreshold = math.MaxUint64 - } - if cfg.TransactionSyncSignificantMessageThreshold > 0 && cfg.TransactionSyncDataExchangeRate == 0 { - p.significantMessageThreshold = cfg.TransactionSyncSignificantMessageThreshold - } - // increase the number of total created peers. - txsyncCreatedPeersTotal.Inc(nil) - return p -} - -// GetNetworkPeer returns the network peer associated with this particular peer. -func (p *Peer) GetNetworkPeer() interface{} { - return p.networkPeer -} - -// GetTransactionPoolAckChannel returns the transaction pool ack channel -func (p *Peer) GetTransactionPoolAckChannel() chan uint64 { - return p.transactionPoolAckCh -} - -// dequeuePendingTransactionPoolAckMessages removed the pending entries from transactionPoolAckCh and add them to transactionPoolAckMessages -func (p *Peer) dequeuePendingTransactionPoolAckMessages() { - for { - select { - case msgSeq := <-p.transactionPoolAckCh: - if len(p.transactionPoolAckMessages) == maxAcceptedMsgSeq { - p.transactionPoolAckMessages = append(p.transactionPoolAckMessages[1:], msgSeq) - } else { - p.transactionPoolAckMessages = append(p.transactionPoolAckMessages, msgSeq) - } - default: - return - } - } -} - -// outgoing related methods : - -// getAcceptedMessages returns the content of the transactionPoolAckMessages and clear the existing buffer. -func (p *Peer) getAcceptedMessages() []uint64 { - p.dequeuePendingTransactionPoolAckMessages() - acceptedMessages := p.transactionPoolAckMessages - p.transactionPoolAckMessages = make([]uint64, 0, maxAcceptedMsgSeq) - return acceptedMessages -} - -func (p *Peer) selectPendingTransactions(pendingTransactions []pooldata.SignedTxGroup, sendWindow time.Duration, round basics.Round, bloomFilterSize int) (selectedTxns []pooldata.SignedTxGroup, selectedTxnIDs []transactions.Txid, partialTransactionsSet bool) { - // if peer is too far back, don't send it any transactions ( or if the peer is not interested in transactions ) - if p.lastRound < round.SubSaturate(1) || p.requestedTransactionsModulator == 0 { - return nil, nil, false - } - - if len(p.messageSeriesPendingTransactions) > 0 { - pendingTransactions = p.messageSeriesPendingTransactions - } - - if len(pendingTransactions) == 0 { - return nil, nil, false - } - - // flush the recent sent transaction cache on the beginning of a new round to give pending transactions another - // chance of being transmitted. - if p.recentSentTransactionsRound != round { - p.recentSentTransactions.reset() - p.recentSentTransactionsRound = round - } - - windowLengthBytes := int(uint64(sendWindow) * p.dataExchangeRate / uint64(time.Second)) - windowLengthBytes -= bloomFilterSize - - accumulatedSize := 0 - - lastTransactionSelectionGroupCounter := p.lastTransactionSelectionTracker.get(p.requestedTransactionsOffset, p.requestedTransactionsModulator) - - startIndex := sort.Search(len(pendingTransactions), func(i int) bool { - return pendingTransactions[i].GroupCounter >= lastTransactionSelectionGroupCounter - }) - - selectedIDsSliceLength := len(pendingTransactions) - startIndex - if selectedIDsSliceLength > p.lastSelectedTransactionsCount*2 { - selectedIDsSliceLength = p.lastSelectedTransactionsCount * 2 - } - selectedTxnIDs = make([]transactions.Txid, 0, selectedIDsSliceLength) - selectedTxns = make([]pooldata.SignedTxGroup, 0, selectedIDsSliceLength) - - windowSizedReached := false - hasMorePendingTransactions := false - - // create a list of all the bloom filters that might need to be tested. This list excludes bloom filters - // which has the same modulator and a different offset. - var effectiveBloomFilters []int - effectiveBloomFilters = make([]int, 0, len(p.recentIncomingBloomFilters)) - for filterIdx := len(p.recentIncomingBloomFilters) - 1; filterIdx >= 0; filterIdx-- { - if p.recentIncomingBloomFilters[filterIdx].filter == nil { - continue - } - if p.recentIncomingBloomFilters[filterIdx].filter.encodingParams.Modulator != p.requestedTransactionsModulator || p.recentIncomingBloomFilters[filterIdx].filter.encodingParams.Offset != p.requestedTransactionsOffset { - continue - } - effectiveBloomFilters = append(effectiveBloomFilters, filterIdx) - } - - // removedTxn := 0 - grpIdx := startIndex -scanLoop: - for ; grpIdx < len(pendingTransactions); grpIdx++ { - txID := pendingTransactions[grpIdx].GroupTransactionID - - // check if the peer would be interested in these messages - - if p.requestedTransactionsModulator > 1 { - if txidToUint64(txID)%uint64(p.requestedTransactionsModulator) != uint64(p.requestedTransactionsOffset) { - continue - } - } - - // filter out transactions that we already previously sent. - if p.recentSentTransactions.contained(txID) { - // we already sent that transaction. no need to send again. - continue - } - - // check if the peer already received these messages from a different source other than us. - for _, filterIdx := range effectiveBloomFilters { - if p.recentIncomingBloomFilters[filterIdx].filter.test(txID) { - // removedTxn++ - continue scanLoop - } - } - - if windowSizedReached { - hasMorePendingTransactions = true - break - } - selectedTxns = append(selectedTxns, pendingTransactions[grpIdx]) - selectedTxnIDs = append(selectedTxnIDs, txID) - - // add the size of the transaction group - accumulatedSize += pendingTransactions[grpIdx].EncodedLength - - if accumulatedSize > windowLengthBytes { - windowSizedReached = true - } - } - - p.lastSelectedTransactionsCount = len(selectedTxnIDs) - - // if we've over-allocated, resize the buffer; This becomes important on relays, - // as storing these arrays can consume considerable amount of memory. - if len(selectedTxnIDs)*2 < cap(selectedTxnIDs) { - exactBuffer := make([]transactions.Txid, len(selectedTxnIDs)) - copy(exactBuffer, selectedTxnIDs) - selectedTxnIDs = exactBuffer - } - - // update the lastTransactionSelectionGroupCounter if needed - - // if we selected any transaction to be sent, update the lastTransactionSelectionGroupCounter with the latest - // group counter. If the startIndex was *after* the last pending transaction, it means that we don't - // need to update the lastTransactionSelectionGroupCounter since it's already ahead of everything in the pending transactions. - if grpIdx >= 0 && startIndex < len(pendingTransactions) { - if grpIdx == len(pendingTransactions) { - if grpIdx > 0 { - p.lastTransactionSelectionTracker.set(p.requestedTransactionsOffset, p.requestedTransactionsModulator, pendingTransactions[grpIdx-1].GroupCounter+1) - } - } else { - p.lastTransactionSelectionTracker.set(p.requestedTransactionsOffset, p.requestedTransactionsModulator, pendingTransactions[grpIdx].GroupCounter) - } - } - - if !hasMorePendingTransactions { - // we're done with the current sequence. - p.messageSeriesPendingTransactions = nil - } - - // fmt.Printf("selectPendingTransactions : selected %d transactions, %d not needed and aborted after exceeding data length %d/%d more = %v\n", len(selectedTxnIDs), removedTxn, accumulatedSize, windowLengthBytes, hasMorePendingTransactions) - - return selectedTxns, selectedTxnIDs, hasMorePendingTransactions -} - -// getLocalRequestParams returns the local requests params -func (p *Peer) getLocalRequestParams() (offset, modulator byte) { - return p.localTransactionsBaseOffset, p.localTransactionsModulator -} - -// update the peer once the message was sent successfully. -func (p *Peer) updateMessageSent(txMsg *transactionBlockMessage, selectedTxnIDs []transactions.Txid, timestamp time.Duration, sequenceNumber uint64, messageSize int) { - p.recentSentTransactions.addSlice(selectedTxnIDs, sequenceNumber, timestamp) - p.lastSentMessageSequenceNumber = sequenceNumber - p.lastSentMessageRound = txMsg.Round - p.lastSentMessageTimestamp = timestamp - p.lastSentMessageSize = messageSize -} - -// update the peer's lastSentBloomFilter. -func (p *Peer) updateSentBoomFilter(filter bloomFilter, round basics.Round) { - if filter.encodedLength > 0 { - p.lastSentBloomFilter = filter - p.sentFilterParams.setSentFilter(filter, round) - } -} - -// setLocalRequestParams stores the peer request params. -func (p *Peer) setLocalRequestParams(offset, modulator uint64) { - if modulator > 255 { - modulator = 255 - } - p.localTransactionsModulator = byte(modulator) - if modulator != 0 { - p.localTransactionsBaseOffset = byte(offset % modulator) - } -} - -// peers array functions - -// incomingPeersOnly scan the input peers array and return a subset of the peers that are incoming peers. -func incomingPeersOnly(peers []*Peer) (incomingPeers []*Peer) { - incomingPeers = make([]*Peer, 0, len(peers)) - for _, peer := range peers { - if !peer.isOutgoing { - incomingPeers = append(incomingPeers, peer) - } - } - return -} - -// incoming related functions - -// addIncomingBloomFilter keeps the most recent {maxIncomingBloomFilterHistory} filters -func (p *Peer) addIncomingBloomFilter(round basics.Round, incomingFilter *testableBloomFilter, currentRound basics.Round) { - minRound := currentRound.SubSaturate(2) - if round < minRound { - // ignore data from the past - return - } - bf := incomingBloomFilter{ - round: round, - filter: incomingFilter, - } - elemOk := func(i int) bool { - ribf := p.recentIncomingBloomFilters[i] - if ribf.filter == nil { - return false - } - if ribf.round < minRound { - return false - } - if incomingFilter.clearPrevious && ribf.filter.encodingParams.Offset == incomingFilter.encodingParams.Offset && ribf.filter.encodingParams.Modulator == incomingFilter.encodingParams.Modulator { - return false - } - return true - } - // compact the prior list to the front of the array. - // order doesn't matter. - pos := 0 - last := len(p.recentIncomingBloomFilters) - 1 - oldestRound := currentRound + 1 - firstOfOldest := -1 - for pos <= last { - if elemOk(pos) { - if p.recentIncomingBloomFilters[pos].round < oldestRound { - oldestRound = p.recentIncomingBloomFilters[pos].round - firstOfOldest = pos - } - pos++ - continue - } - p.recentIncomingBloomFilters[pos] = p.recentIncomingBloomFilters[last] - p.recentIncomingBloomFilters[last].filter = nil // GC - last-- - } - p.recentIncomingBloomFilters = p.recentIncomingBloomFilters[:last+1] - // Simple case: append - if last+1 < maxIncomingBloomFilterHistory { - p.recentIncomingBloomFilters = append(p.recentIncomingBloomFilters, bf) - return - } - // Too much traffic case: replace the first thing we find of the oldest round - if firstOfOldest >= 0 { - p.recentIncomingBloomFilters[firstOfOldest] = bf - return - } - // This line should be unreachable, but putting in an error log to test that assumption. - p.log.Error("addIncomingBloomFilter failed to trim p.recentIncomingBloomFilters (new filter lost)") -} - -func (p *Peer) updateRequestParams(modulator, offset byte) { - p.requestedTransactionsModulator = modulator - p.requestedTransactionsOffset = offset -} - -// update the recentSentTransactions with the incoming transaction groups. This would prevent us from sending the received transactions back to the -// peer that sent it to us. This comes in addition to the bloom filter, if being sent by the other peer. -func (p *Peer) updateIncomingTransactionGroups(txnGroups []pooldata.SignedTxGroup) { - for _, txnGroup := range txnGroups { - if len(txnGroup.Transactions) > 0 { - // The GroupTransactionID field is not yet updated, so we'll be calculating it's value here and passing it. - p.recentSentTransactions.add(txnGroup.Transactions.ID()) - } - } -} - -func (p *Peer) updateIncomingMessageTiming(timings timingParams, currentRound basics.Round, currentTime time.Duration, timeInQueue time.Duration, peerLatency time.Duration, incomingMessageSize int) { - p.lastConfirmedMessageSeqReceived = timings.RefTxnBlockMsgSeq - // if we received a message that references our previous message, see if they occurred on the same round - if p.lastConfirmedMessageSeqReceived == p.lastSentMessageSequenceNumber && p.lastSentMessageRound == currentRound && p.lastSentMessageTimestamp > 0 { - // if so, we might be able to calculate the bandwidth. - timeSinceLastMessageWasSent := currentTime - timeInQueue - p.lastSentMessageTimestamp - networkMessageSize := uint64(p.lastSentMessageSize + incomingMessageSize) - if timings.ResponseElapsedTime != 0 && peerLatency > 0 && timeSinceLastMessageWasSent > time.Duration(timings.ResponseElapsedTime)+peerLatency && networkMessageSize >= p.significantMessageThreshold { - networkTrasmitTime := timeSinceLastMessageWasSent - time.Duration(timings.ResponseElapsedTime) - peerLatency - dataExchangeRate := uint64(time.Second) * networkMessageSize / uint64(networkTrasmitTime) - - // clamp data exchange rate to realistic metrics - if dataExchangeRate < minDataExchangeRateThreshold { - dataExchangeRate = minDataExchangeRateThreshold - } else if dataExchangeRate > maxDataExchangeRateThreshold { - dataExchangeRate = maxDataExchangeRateThreshold - } - // fmt.Printf("incoming message : updating data exchange to %d; network msg size = %d+%d, transmit time = %v\n", dataExchangeRate, p.lastSentMessageSize, incomingMessageSize, networkTrasmitTime) - p.dataExchangeRate = dataExchangeRate - } - - // given that we've (maybe) updated the data exchange rate, we need to clear out the lastSendMessage information - // so we won't use that again on a subsequent incoming message. - p.lastSentMessageSequenceNumber = 0 - p.lastSentMessageRound = 0 - p.lastSentMessageTimestamp = 0 - p.lastSentMessageSize = 0 - } - p.lastReceivedMessageLocalRound = currentRound - p.lastReceivedMessageTimestamp = currentTime - timeInQueue - p.lastReceivedMessageSize = incomingMessageSize - p.lastReceivedMessageNextMsgMinDelay = time.Duration(timings.NextMsgMinDelay) * time.Nanosecond - p.recentSentTransactions.acknowledge(timings.AcceptedMsgSeq) -} - -// advancePeerState is called when a peer schedule arrives, before we're doing any operation. -// The method would determine whether a message need to be sent, and adjust the peer state -// accordingly. -func (p *Peer) advancePeerState(currenTime time.Duration, isRelay bool) (ops peersOps) { - if isRelay { - if p.isOutgoing { - // outgoing peers are "special", as they respond to messages rather then generating their own. - // we need to figure the special state needed for "late bloom filter message" - switch p.state { - case peerStateStartup: - p.nextStateTimestamp = currenTime + p.lastReceivedMessageNextMsgMinDelay - messagesCount := p.lastReceivedMessageNextMsgMinDelay / messageTimeWindow - if messagesCount <= 2 { - // we have time to send only a single message. This message need to include both transactions and bloom filter. - p.state = peerStateLateBloom - } else { - // we have enough time to send multiple messages, make the first n-1 message have no bloom filter, and have the last one - // include a bloom filter. - p.state = peerStateHoldsoff - } - - // send a message - ops |= peerOpsSendMessage - case peerStateHoldsoff: - // calculate how more messages we can send ( if needed ) - messagesCount := (p.nextStateTimestamp - currenTime) / messageTimeWindow - if messagesCount <= 2 { - // we have time to send only a single message. This message need to include both transactions and bloom filter. - p.state = peerStateLateBloom - } - - // send a message - ops |= peerOpsSendMessage - - // the rescehduling would be done in the sendMessageLoop, since we need to know if additional messages are needed. - case peerStateLateBloom: - // send a message - ops |= peerOpsSendMessage - - default: - // this isn't expected, so we can just ignore this. - // todo : log - } - } else { - // non-outgoing - switch p.state { - case peerStateStartup: - p.state = peerStateHoldsoff - fallthrough - case peerStateHoldsoff: - // prepare the send message array. - ops |= peerOpsSendMessage - default: // peerStateInterrupt & peerStateLateBloom - // this isn't expected, so we can just ignore this. - // todo : log - } - } - } else { - switch p.state { - case peerStateStartup: - p.state = peerStateHoldsoff - ops |= peerOpsSendMessage - - case peerStateHoldsoff: - if p.nextStateTimestamp == 0 { - p.state = peerStateInterrupt - ops |= peerOpsSetInterruptible | peerOpsReschedule - } else { - ops |= peerOpsSendMessage - } - - case peerStateInterrupt: - p.state = peerStateHoldsoff - ops |= peerOpsSendMessage | peerOpsClearInterruptible - - default: // peerStateLateBloom - // this isn't expected, so we can just ignore this. - // todo : log - } - } - return ops -} - -// getMessageConstructionOps constructs the messageConstructionOps that would be needed when -// sending a message back to the peer. The two arguments are: -// - isRelay defines whether the local node is a relay. -// - fetchTransactions defines whether the local node is interested in receiving transactions from -// the peer ( this is essentially allow us to skip receiving transactions for non-relays that aren't going -// to make any proposals ) -func (p *Peer) getMessageConstructionOps(isRelay bool, fetchTransactions bool) (ops messageConstructionOps) { - // on outgoing peers of relays, we want have some custom logic. - if isRelay { - if p.isOutgoing { - switch p.state { - case peerStateLateBloom: - if p.localTransactionsModulator != 0 { - ops |= messageConstBloomFilter - } - case peerStateHoldsoff: - ops |= messageConstTransactions - } - } else { - if p.requestedTransactionsModulator != 0 { - ops |= messageConstTransactions - if p.nextStateTimestamp == 0 && p.localTransactionsModulator != 0 { - ops |= messageConstBloomFilter - } - } - if p.nextStateTimestamp == 0 { - ops |= messageConstNextMinDelay - } - } - ops |= messageConstUpdateRequestParams - } else { - ops |= messageConstTransactions // send transactions to the other peer - if fetchTransactions { - switch p.localTransactionsModulator { - case 0: - // don't send bloom filter. - case 1: - // special optimization if we have just one relay that we're connected to: - // generate the bloom filter only once per 2*beta message. - // this would reduce the number of unneeded bloom filters generation dramatically. - // that single relay would know which messages it previously sent us, and would refrain from - // sending these again. - if p.nextStateTimestamp == 0 { - ops |= messageConstBloomFilter - } - default: - ops |= messageConstBloomFilter - } - ops |= messageConstUpdateRequestParams - } - } - return ops -} - -// getNextScheduleOffset is called after a message was sent to the peer, and we need to evaluate the next -// scheduling time. -func (p *Peer) getNextScheduleOffset(isRelay bool, beta time.Duration, partialMessage bool, currentTime time.Duration) (offset time.Duration, ops peersOps) { - if partialMessage { - if isRelay { - if p.isOutgoing { - if p.state == peerStateHoldsoff { - // we have enough time to send another message. - return messageTimeWindow, peerOpsReschedule - } - } else { - // a partial message was sent to an incoming peer - if p.nextStateTimestamp > time.Duration(0) { - if currentTime+messageTimeWindow*2 < p.nextStateTimestamp { - // we have enough time to send another message - return messageTimeWindow, peerOpsReschedule - } - // we don't have enough time to send another message. - next := p.nextStateTimestamp - p.nextStateTimestamp = 0 - return next - currentTime, peerOpsReschedule - } - p.nextStateTimestamp = currentTime + 2*beta - return messageTimeWindow, peerOpsReschedule - } - } else { - if p.nextStateTimestamp > time.Duration(0) { - if currentTime+messageTimeWindow*2 < p.nextStateTimestamp { - // we have enough time to send another message - return messageTimeWindow, peerOpsReschedule - } - // we don't have enough time, so don't get into "interrupt" state, - // since we're already sending messages. - next := p.nextStateTimestamp - p.nextStateTimestamp = 0 - p.messageSeriesPendingTransactions = nil - // move to the next state. - p.state = peerStateHoldsoff - return next - currentTime, peerOpsReschedule | peerOpsClearInterruptible - - } - // this is the first message - p.nextStateTimestamp = currentTime + 2*beta - - return messageTimeWindow, peerOpsReschedule - } - } else { - if isRelay { - if p.isOutgoing { - if p.state == peerStateHoldsoff { - // even that we're done now, we need to send another message that would contain the bloom filter - p.state = peerStateLateBloom - - bloomMessageExtrapolatedSendingTime := messageTimeWindow - // try to improve the sending time by using the last sent bloom filter as the expected message size. - if p.lastSentBloomFilter.containedTxnsRange.transactionsCount > 0 { - lastBloomFilterSize := uint64(p.lastSentBloomFilter.encodedLength) - bloomMessageExtrapolatedSendingTime = time.Duration(lastBloomFilterSize * p.dataExchangeRate) - } - - next := p.nextStateTimestamp - bloomMessageExtrapolatedSendingTime - currentTime - p.nextStateTimestamp = 0 - return next, peerOpsReschedule - } - p.nextStateTimestamp = 0 - } else { - // we sent a message to an incoming connection. No more data to send. - if p.nextStateTimestamp > time.Duration(0) { - next := p.nextStateTimestamp - p.nextStateTimestamp = 0 - return next - currentTime, peerOpsReschedule - } - p.nextStateTimestamp = 0 - return beta * 2, peerOpsReschedule - } - } else { - if p.nextStateTimestamp > time.Duration(0) { - next := p.nextStateTimestamp - p.nextStateTimestamp = 0 - return next - currentTime, peerOpsReschedule - } - return beta, peerOpsReschedule - } - } - return time.Duration(0), 0 -} - -func (p *Peer) networkAddress() string { - if peerAddress, supportInterface := p.networkPeer.(networkPeerAddress); supportInterface { - return peerAddress.GetAddress() - } - return "" -} diff --git a/txnsync/peer_test.go b/txnsync/peer_test.go deleted file mode 100644 index fb18e7d222..0000000000 --- a/txnsync/peer_test.go +++ /dev/null @@ -1,1011 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "fmt" - "reflect" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/test/partitiontest" -) - -// TestGetSetTransactionGroupCounterTracker tests the get/set capabilities for the counter -func TestGetSetTransactionGroupCounterTracker(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - grp := transactionGroupCounterTracker{} - - a.Equal(grp.get(0, 0), uint64(0)) - - grp.set(0, 0, 2) - a.Equal(grp.get(0, 0), uint64(2)) - grp.set(1, 0, 5) - a.Equal(grp.get(1, 0), uint64(5)) - - grp = transactionGroupCounterTracker{} - - for i := 0; i < maxTransactionGroupTrackers+1; i++ { - grp.set(byte(i+1), 0, uint64(i+1)) - } - - a.True(reflect.DeepEqual(grp[0], requestParamsGroupCounterState{offset: 2, groupCounters: [bloomFilterRetryCount]uint64{2, 0, 0}})) - - for i := 1; i < maxTransactionGroupTrackers; i++ { - if !reflect.DeepEqual(grp[i], requestParamsGroupCounterState{offset: byte(i + 2), groupCounters: [bloomFilterRetryCount]uint64{uint64(i + 2), 0, 0}}) { - t.Errorf("For value %d got: %v", i, grp[i]) - } - } - -} - -// TestIndexTransactionGroupCounterTracker tests the index function specifically -func TestIndexTransactionGroupCounterTracker(t *testing.T) { - partitiontest.PartitionTest(t) - - grp := transactionGroupCounterTracker{ - { - offset: 0, - modulator: 0, - groupCounters: [bloomFilterRetryCount]uint64{}, - }, - { - offset: 1, - modulator: 23, - groupCounters: [bloomFilterRetryCount]uint64{}, - }, - } - - a := require.New(t) - a.Equal(grp.index(2, 2), -1) - a.Equal(grp.index(0, 0), 0) - a.Equal(grp.index(1, 23), 1) -} - -// TestRollTransactionGroupCounterTracker tests that rolling works and doesn't panic -func TestRollTransactionGroupCounterTracker(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - defer func() { - if r := recover(); r != nil { - a.False(true, "Something panicked during TestRollTransactionGroupCounterTracker") - } - }() - - grp1 := transactionGroupCounterTracker{ - { - offset: 0, - modulator: 0, - groupCounters: [bloomFilterRetryCount]uint64{}, - }, - } - - grp1.roll(0, 0) - grp1.roll(0, 2) - - grp2 := transactionGroupCounterTracker{ - { - offset: 0, - modulator: 0, - groupCounters: [bloomFilterRetryCount]uint64{0, 1}, - }, - } - - grp2.roll(0, 0) - grp2.roll(0, 2) - a.True(grp2[0].groupCounters[0] == 0) - a.True(grp2[0].groupCounters[1] == 1) - - grp3 := transactionGroupCounterTracker{ - { - offset: 0, - modulator: 0, - groupCounters: [bloomFilterRetryCount]uint64{2, 1, 0}, - }, - } - - grp3.roll(0, 0) - a.Equal(grp3[0].groupCounters, [bloomFilterRetryCount]uint64{1, 0, 2}) - grp3.roll(0, 1) - -} - -// TestGetNextScheduleOffset tests the state machine of getNextScheduleOffset -func TestGetNextScheduleOffset(t *testing.T) { - partitiontest.PartitionTest(t) - - type args struct { - isRelay bool - beta time.Duration - partialMessage bool - currentTime time.Duration - } - - type results struct { - offset time.Duration - ops peersOps - } - - tests := []struct { - fxn func(p *Peer) - arg args - result results - postFxn func(s peerState) bool - }{ - { - fxn: func(p *Peer) { p.nextStateTimestamp = 2 * time.Millisecond }, - arg: args{false, time.Millisecond, false, 1 * time.Millisecond}, - result: results{1 * time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.nextStateTimestamp = 0 * time.Millisecond }, - arg: args{false, 3 * time.Millisecond, false, 1 * time.Millisecond}, - result: results{3 * time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - // -- - - { - fxn: func(p *Peer) { p.isOutgoing = false; p.nextStateTimestamp = 0 * time.Millisecond }, - arg: args{true, 3 * time.Millisecond, false, 1 * time.Millisecond}, - result: results{6 * time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = false; p.nextStateTimestamp = 9 * time.Millisecond }, - arg: args{true, 3 * time.Millisecond, false, 1 * time.Millisecond}, - result: results{8 * time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - // -- - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateLateBloom }, - arg: args{true, 3 * time.Millisecond, false, 1 * time.Millisecond}, - result: results{0 * time.Millisecond, 0}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { - p.isOutgoing = true - p.state = peerStateHoldsoff - p.lastSentBloomFilter.containedTxnsRange.transactionsCount = 0 - p.nextStateTimestamp = 2 * messageTimeWindow - }, - arg: args{true, 3 * time.Millisecond, false, 1 * time.Millisecond}, - result: results{messageTimeWindow - 1*time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return s == peerStateLateBloom }, - }, - - { - fxn: func(p *Peer) { p.nextStateTimestamp = 0 }, - arg: args{false, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{messageTimeWindow, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.nextStateTimestamp = messageTimeWindow * 3 }, - arg: args{false, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{messageTimeWindow, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.nextStateTimestamp = messageTimeWindow * 2 }, - arg: args{false, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{2*messageTimeWindow - 1*time.Millisecond, peerOpsReschedule | peerOpsClearInterruptible}, - postFxn: func(s peerState) bool { return s == peerStateHoldsoff }, - }, - - // -- - - { - fxn: func(p *Peer) { p.isOutgoing = true }, - arg: args{true, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{time.Duration(0), 0}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateHoldsoff }, - arg: args{true, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{messageTimeWindow, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = false; p.nextStateTimestamp = 0 }, - arg: args{true, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{messageTimeWindow, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = false; p.nextStateTimestamp = 9 * time.Millisecond }, - arg: args{true, 3 * time.Millisecond, true, 1 * time.Millisecond}, - result: results{8 * time.Millisecond, peerOpsReschedule}, - postFxn: func(s peerState) bool { return true }, - }, - } - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - - for i, test := range tests { - t.Run(fmt.Sprint(i), func(t *testing.T) { - p := makePeer(nil, true, true, &config, log, 0) - if test.fxn != nil { - test.fxn(p) - } - - offset, ops := p.getNextScheduleOffset(test.arg.isRelay, test.arg.beta, test.arg.partialMessage, test.arg.currentTime) - - r := results{offset, ops} - - if !test.postFxn(p.state) { - t.Errorf("getNextScheduleOffset() state = %v", p.state) - } - - if !reflect.DeepEqual(r, test.result) { - t.Errorf("getNextScheduleOffset() = %v, want %v", r, test.result) - } - - }) - } - -} - -// TestGetMessageConstructionOps tests the state machine of getMessageConstructionOps -func TestGetMessageConstructionOps(t *testing.T) { - partitiontest.PartitionTest(t) - - type args struct { - isRelay bool - fetchTransactions bool - } - - peerStateLateBloomState := peerStateLateBloom - peerStateHoldsoffState := peerStateHoldsoff - - tests := []struct { - fxn func(p *Peer) - arg args - result messageConstructionOps - state *peerState - }{ - { - fxn: func(p *Peer) {}, - arg: args{false, false}, - result: messageConstTransactions, - state: nil, - }, - { - fxn: func(p *Peer) { p.localTransactionsModulator = 0 }, - arg: args{false, true}, - result: messageConstUpdateRequestParams | messageConstTransactions, - state: nil, - }, - { - fxn: func(p *Peer) { p.localTransactionsModulator = 1; p.nextStateTimestamp = 1 }, - arg: args{false, true}, - result: messageConstUpdateRequestParams | messageConstTransactions, - state: nil, - }, - { - fxn: func(p *Peer) { p.localTransactionsModulator = 1; p.nextStateTimestamp = 0 }, - arg: args{false, true}, - result: messageConstUpdateRequestParams | messageConstTransactions | messageConstBloomFilter, - state: nil, - }, - { - fxn: func(p *Peer) { p.localTransactionsModulator = 1; p.nextStateTimestamp = 99 }, - arg: args{false, true}, - result: messageConstUpdateRequestParams | messageConstTransactions, - state: nil, - }, - // -- - - { - fxn: func(p *Peer) { p.isOutgoing = false; p.requestedTransactionsModulator = 0; p.nextStateTimestamp = 0 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams | messageConstNextMinDelay, - state: nil, - }, - { - fxn: func(p *Peer) { p.isOutgoing = false; p.requestedTransactionsModulator = 0; p.nextStateTimestamp = 1 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams, - state: nil, - }, - - { - fxn: func(p *Peer) { - p.isOutgoing = false - p.localTransactionsModulator = 1 - p.requestedTransactionsModulator = 1 - p.nextStateTimestamp = 0 - }, - arg: args{true, true}, - result: messageConstUpdateRequestParams | messageConstNextMinDelay | messageConstTransactions | messageConstBloomFilter, - state: nil, - }, - { - fxn: func(p *Peer) { p.isOutgoing = false; p.requestedTransactionsModulator = 1; p.nextStateTimestamp = 1 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams | messageConstTransactions, - state: nil, - }, - - // -- - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateLateBloom; p.localTransactionsModulator = 0 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams, - state: &peerStateLateBloomState, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateLateBloom; p.localTransactionsModulator = 1 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams | messageConstBloomFilter, - state: &peerStateLateBloomState, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateHoldsoff; p.localTransactionsModulator = 1 }, - arg: args{true, true}, - result: messageConstUpdateRequestParams | messageConstTransactions, - state: &peerStateHoldsoffState, - }, - } - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - for i, test := range tests { - t.Run(fmt.Sprint(i), func(t *testing.T) { - p := makePeer(nil, true, true, &config, log, 0) - if test.fxn != nil { - test.fxn(p) - } - - gotOps := p.getMessageConstructionOps(test.arg.isRelay, test.arg.fetchTransactions) - - if test.state != nil && p.state != *test.state { - t.Errorf("getMessageConstructionOps() state = %v, want %v", p.state, test.state) - } - - if gotOps != test.result { - t.Errorf("getMessageConstructionOps() = %v, want %v", gotOps, test.result) - } - - }) - } - -} - -// TestAdvancePeerState tests the state machine of advancePeerState -func TestAdvancePeerState(t *testing.T) { - partitiontest.PartitionTest(t) - - type args struct { - currentTime time.Duration - isRelay bool - } - - tests := []struct { - fxn func(p *Peer) - arg args - result peersOps - state peerState - }{ - { - fxn: func(p *Peer) { p.state = peerStateStartup }, - arg: args{time.Millisecond, false}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - { - fxn: func(p *Peer) { p.state = peerStateHoldsoff; p.nextStateTimestamp = 0 }, - arg: args{time.Millisecond, false}, - result: peerOpsSetInterruptible | peerOpsReschedule, - state: peerStateInterrupt, - }, - { - fxn: func(p *Peer) { p.state = peerStateHoldsoff; p.nextStateTimestamp = 1 }, - arg: args{time.Millisecond, false}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - { - fxn: func(p *Peer) { p.state = peerStateInterrupt }, - arg: args{time.Millisecond, false}, - result: peerOpsSendMessage | peerOpsClearInterruptible, - state: peerStateHoldsoff, - }, - // -- - { - fxn: func(p *Peer) { p.isOutgoing = false; p.state = peerStateStartup }, - arg: args{time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - { - fxn: func(p *Peer) { p.isOutgoing = false; p.state = peerStateHoldsoff }, - arg: args{time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - // -- - - { - fxn: func(p *Peer) { - p.isOutgoing = true - p.state = peerStateStartup - p.lastReceivedMessageNextMsgMinDelay = messageTimeWindow * 2 - }, - arg: args{time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateLateBloom, - }, - { - fxn: func(p *Peer) { - p.isOutgoing = true - p.state = peerStateStartup - p.lastReceivedMessageNextMsgMinDelay = messageTimeWindow * 3 - }, - arg: args{time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - - { - fxn: func(p *Peer) { - p.isOutgoing = true - p.state = peerStateHoldsoff - p.nextStateTimestamp = messageTimeWindow * 2 - }, - arg: args{0 * time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateLateBloom, - }, - - { - fxn: func(p *Peer) { - p.isOutgoing = true - p.state = peerStateHoldsoff - p.nextStateTimestamp = messageTimeWindow * 3 - }, - arg: args{0 * time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateHoldsoff, - }, - - { - fxn: func(p *Peer) { p.isOutgoing = true; p.state = peerStateLateBloom }, - arg: args{time.Millisecond, true}, - result: peerOpsSendMessage, - state: peerStateLateBloom, - }, - } - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - for i, test := range tests { - t.Run(string(rune(i)), func(t *testing.T) { - p := makePeer(nil, true, true, &config, log, 0) - if test.fxn != nil { - test.fxn(p) - } - - gotOps := p.advancePeerState(test.arg.currentTime, test.arg.isRelay) - - if p.state != test.state { - t.Errorf("advancePeerState() state = %v, want %v", p.state, test.state) - } - - if gotOps != test.result { - t.Errorf("advancePeerState() = %v, want %v", gotOps, test.result) - } - - }) - } -} - -// TestUpdateIncomingMessageTiming tests updating the incoming message timing -func TestUpdateIncomingMessageTiming(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - currentRound := basics.Round(1) - currentTime := time.Millisecond * 123 - currentMessageSize := int(p.significantMessageThreshold) - timing := timingParams{NextMsgMinDelay: 42} - - // Test direct assignment - - p.lastConfirmedMessageSeqReceived = p.lastSentMessageSequenceNumber + 1 - - p.updateIncomingMessageTiming(timing, currentRound, currentTime, 0, time.Millisecond, currentMessageSize) - - a.Equal(p.lastReceivedMessageLocalRound, currentRound) - a.Equal(p.lastReceivedMessageTimestamp, currentTime) - a.Equal(p.lastReceivedMessageSize, currentMessageSize) - a.Equal(p.lastReceivedMessageNextMsgMinDelay, time.Duration(timing.NextMsgMinDelay)*time.Nanosecond) - - // Test entering if statement - - p.lastConfirmedMessageSeqReceived = p.lastSentMessageSequenceNumber - p.lastSentMessageRound = currentRound - timing.ResponseElapsedTime = 1 - p.lastSentMessageTimestamp = 1 * time.Millisecond - currentMessageSize = maxDataExchangeRateThreshold + 1 - p.updateIncomingMessageTiming(timing, currentRound, currentTime, 0, time.Millisecond, currentMessageSize) - - a.Equal(uint64(maxDataExchangeRateThreshold), p.dataExchangeRate) - - p.lastConfirmedMessageSeqReceived = p.lastSentMessageSequenceNumber - p.lastSentMessageRound = currentRound - timing.ResponseElapsedTime = 1 - p.lastSentMessageTimestamp = 1 * time.Millisecond - p.lastSentMessageSize = 0 - currentMessageSize = int(p.significantMessageThreshold) - currentTime = time.Millisecond * 1000 - p.updateIncomingMessageTiming(timing, currentRound, currentTime, 0, time.Millisecond, currentMessageSize) - - a.Equal(uint64(minDataExchangeRateThreshold), p.dataExchangeRate) - - p.lastConfirmedMessageSeqReceived = p.lastSentMessageSequenceNumber - p.lastSentMessageRound = currentRound - timing.ResponseElapsedTime = uint64(time.Millisecond) - p.lastSentMessageTimestamp = 1 * time.Millisecond - p.lastSentMessageSize = 0 - currentMessageSize = 100000 - currentTime = time.Millisecond * 123 - p.updateIncomingMessageTiming(timing, currentRound, currentTime, time.Millisecond, time.Millisecond*100, currentMessageSize) - - a.Equal(uint64(5000000), p.dataExchangeRate) -} - -// TestUpdateIncomingTransactionGroups tests updating the incoming transaction groups -func TestUpdateIncomingTransactionGroups(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var txnGroups []pooldata.SignedTxGroup - - for i := 0; i < 10; i++ { - - tmp := pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{transactions.SignedTxn{ - Sig: crypto.Signature{}, - Msig: crypto.MultisigSig{}, - Lsig: transactions.LogicSig{}, - Txn: transactions.Transaction{}, - AuthAddr: basics.Address{}, - }}, - LocallyOriginated: false, - GroupCounter: 0, - GroupTransactionID: transactions.Txid{byte(i)}, - EncodedLength: 0, - } - txnGroups = append(txnGroups, tmp) - } - - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - p.recentSentTransactions.reset() - - for i := 0; i < 10; i++ { - txid := transactions.Txid{byte(i)} - a.False(p.recentSentTransactions.contained(txid)) - } - -} - -// TestUpdateRequestParams tests updating the request parameters -func TestUpdateRequestParams(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - oldModulator := p.requestedTransactionsModulator - oldOffset := p.requestedTransactionsOffset - - p.updateRequestParams(oldModulator, oldOffset) - a.Equal(p.requestedTransactionsModulator, oldModulator) - a.Equal(p.requestedTransactionsOffset, oldOffset) - - p.updateRequestParams(oldModulator+1, oldOffset+1) - a.Equal(p.requestedTransactionsModulator, oldModulator+1) - a.Equal(p.requestedTransactionsOffset, oldOffset+1) - -} - -// bloom.GenericFilter -type nopFilter struct{} - -func (nf *nopFilter) Set(x []byte) {} -func (nf *nopFilter) Test(x []byte) bool { - return false -} -func (nf *nopFilter) MarshalBinary() ([]byte, error) { - return nil, nil -} -func (nf *nopFilter) UnmarshalBinary(data []byte) error { - return nil -} - -// TestAddIncomingBloomFilter tests adding an incoming bloom filter -func TestAddIncomingBloomFilter(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - for i := 0; i < 2*maxIncomingBloomFilterHistory; i++ { - bf := &testableBloomFilter{ - encodingParams: requestParams{ - _struct: struct{}{}, - Offset: byte(i), - Modulator: 0, - }, - filter: &nopFilter{}, - } - p.addIncomingBloomFilter(basics.Round(i), bf, basics.Round(i)) - } - - // filters from current round, -1, and -2 are kept. => 3 - a.Equal(3, len(p.recentIncomingBloomFilters)) - - for i := 0; i < 2*maxIncomingBloomFilterHistory; i++ { - bf := &testableBloomFilter{ - encodingParams: requestParams{ - _struct: struct{}{}, - Offset: byte(i), - Modulator: 0, - }, - filter: &nopFilter{}, - } - p.addIncomingBloomFilter(basics.Round(i), bf, 0) - } - - a.Equal(maxIncomingBloomFilterHistory, len(p.recentIncomingBloomFilters)) -} - -// TestSelectPendingTransactions tests selectPendingTransactions -func TestSelectPendingTransactions(t *testing.T) { - partitiontest.PartitionTest(t) - - type args struct { - pendingTransactions []pooldata.SignedTxGroup - sendWindow time.Duration - round basics.Round - bloomFilterSize int - } - - type results struct { - selectedTxns []pooldata.SignedTxGroup - selectedTxnIDs []transactions.Txid - partialTransactionsSet bool - } - - tests := []struct { - name string - fxn func(p *Peer) - arg args - result results - }{ - {"Case 1", func(p *Peer) { p.lastRound = 98 }, args{nil, time.Millisecond, 100, 0}, results{nil, nil, false}}, - {"Case 2", func(p *Peer) { p.lastRound = 101; p.requestedTransactionsModulator = 0 }, args{nil, time.Millisecond, 100, 0}, results{nil, nil, false}}, - {"Case 3", func(p *Peer) { p.lastRound = 200; p.messageSeriesPendingTransactions = nil }, args{[]pooldata.SignedTxGroup{}, time.Millisecond, 100, 0}, results{nil, nil, false}}, - } - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - p := makePeer(nil, true, true, &config, log, 0) - if test.fxn != nil { - test.fxn(p) - } - var r results - r.selectedTxns, r.selectedTxnIDs, r.partialTransactionsSet = p.selectPendingTransactions(test.arg.pendingTransactions, test.arg.sendWindow, test.arg.round, test.arg.bloomFilterSize) - if !reflect.DeepEqual(r, test.result) { - t.Errorf("selectPendingTransactions() gotSelectedTxns = %v, want %v", r, test.result) - } - }) - } -} - -// TestSelectedMessagesModulator tests the use of the modulator on the returned list -func TestSelectedMessagesModulator(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - peer := Peer{} - - peer.lastRound = 10 - peer.requestedTransactionsModulator = 2 - peer.requestedTransactionsOffset = 1 - peer.lastSelectedTransactionsCount = 1 - peer.dataExchangeRate = 1000 - peer.recentSentTransactions = makeTransactionCache(10, 10, 0) - - dig1 := crypto.Digest{0x1, 0, 0, 0, 0, 0, 0, 0, 0} - dig2 := crypto.Digest{0x2, 0, 0, 0, 0, 0, 0, 0, 0} - dig3 := crypto.Digest{0x3, 0, 0, 0, 0, 0, 0, 0, 0} - dig4 := crypto.Digest{0x4, 0, 0, 0, 0, 0, 0, 0, 0} - dig5 := crypto.Digest{0x5, 0, 0, 0, 0, 0, 0, 0, 0} - dig6 := crypto.Digest{0x6, 0, 0, 0, 0, 0, 0, 0, 0} - - a.Equal(txidToUint64(transactions.Txid(dig1)), uint64(1)) - a.Equal(txidToUint64(transactions.Txid(dig2)), uint64(2)) - a.Equal(txidToUint64(transactions.Txid(dig3)), uint64(3)) - a.Equal(txidToUint64(transactions.Txid(dig4)), uint64(4)) - a.Equal(txidToUint64(transactions.Txid(dig5)), uint64(5)) - a.Equal(txidToUint64(transactions.Txid(dig6)), uint64(6)) - - pendingTransations := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{GroupCounter: 1, GroupTransactionID: transactions.Txid(dig1), EncodedLength: 1}, - pooldata.SignedTxGroup{GroupCounter: 2, GroupTransactionID: transactions.Txid(dig2), EncodedLength: 1}, - pooldata.SignedTxGroup{GroupCounter: 3, GroupTransactionID: transactions.Txid(dig3), EncodedLength: 1}, - pooldata.SignedTxGroup{GroupCounter: 4, GroupTransactionID: transactions.Txid(dig4), EncodedLength: 1}, - pooldata.SignedTxGroup{GroupCounter: 5, GroupTransactionID: transactions.Txid(dig5), EncodedLength: 1}, - pooldata.SignedTxGroup{GroupCounter: 6, GroupTransactionID: transactions.Txid(dig6), EncodedLength: 1}, - } - - selectedTxns, _, _ := peer.selectPendingTransactions(pendingTransations, time.Millisecond, 5, 0) - - a.Equal(len(selectedTxns), 2) - a.Equal(selectedTxns[0].GroupCounter, uint64(1)) - a.Equal(selectedTxns[1].GroupCounter, uint64(3)) - -} - -// TestGetAcceptedMessages tests get accepted messages -func TestGetAcceptedMessages(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - var testList []uint64 - chPtr := &p.transactionPoolAckCh - - for i := uint64(0); i < maxAcceptedMsgSeq; i++ { - *chPtr <- i - testList = append(testList, i) - } - - a.Equal(len(*chPtr), 64) - a.Equal(p.getAcceptedMessages(), testList) - a.Equal(len(*chPtr), 0) - a.Equal(len(p.transactionPoolAckMessages), 0) - -} - -// TestDequeuePendingTransactionPoolAckMessages tests dequeuePendingTransactionPoolAckMessages -func TestDequeuePendingTransactionPoolAckMessages(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - ch := p.transactionPoolAckCh - var testList []uint64 - - for i := uint64(0); i < maxAcceptedMsgSeq; i++ { - ch <- i - testList = append(testList, i) - } - - p.dequeuePendingTransactionPoolAckMessages() - - a.Equal(p.transactionPoolAckMessages, testList) - - testList = testList[:0] - - ch = p.transactionPoolAckCh - - // Note the +1 - for i := uint64(0); i < (maxAcceptedMsgSeq + 1); i++ { - if i >= maxAcceptedMsgSeq { - // Channel is bounded at maxAcceptedMsgSeq so we need to flush it - p.dequeuePendingTransactionPoolAckMessages() - testList = append(testList[1:], i) - } else { - testList = append(testList, i) - } - - ch <- i - } - - p.dequeuePendingTransactionPoolAckMessages() - - a.Equal(p.transactionPoolAckMessages, testList) - -} - -// TestUpdateMessageSent Tests whether we can update the messages sent fields -func TestUpdateMessageSent(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - txMsg := &transactionBlockMessage{ - Version: txnBlockMessageVersion, - Round: 42, - } - - txnIds := []transactions.Txid{transactions.Txid(crypto.Hash([]byte{0x31, 0x32}))} - timestamp := 10 * time.Second - sequenceNumber := uint64(23) - messageSize := 35 - bFilter := bloomFilter{} - - a.False(p.recentSentTransactions.contained(txnIds[0])) - - p.updateMessageSent(txMsg, txnIds, timestamp, sequenceNumber, messageSize) - - a.True(p.recentSentTransactions.contained(txnIds[0])) - a.Equal(p.lastSentMessageSequenceNumber, sequenceNumber) - a.Equal(p.lastSentMessageRound, txMsg.Round) - a.Equal(p.lastSentMessageTimestamp, timestamp) - a.Equal(p.lastSentMessageSize, messageSize) - - p.updateSentBoomFilter(bFilter, 0) - - a.Equal(p.lastSentBloomFilter, bFilter) - -} - -// TestIncomingPeersOnly Tests whether we can extract outgoing peers only -func TestIncomingPeersOnly(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p1 := makePeer(nil, true, true, &config, log, 0) - p2 := makePeer(nil, true, false, &config, log, 0) - p3 := makePeer(nil, false, true, &config, log, 0) - p4 := makePeer(nil, false, false, &config, log, 0) - - peers := []*Peer{p1, p2, p3, p4} - - incomingPeers := incomingPeersOnly(peers) - - a.Equal(len(incomingPeers), 2) - a.Equal(incomingPeers[0], p3) - a.Equal(incomingPeers[1], p4) -} - -// TestLocalRequestParams Tests setting and getting local request params -func TestLocalRequestParams(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(nil, true, true, &config, log, 0) - - p.setLocalRequestParams(256, 256) - offset, modulator := p.getLocalRequestParams() - a.Equal(offset, uint8(1)) - a.Equal(modulator, uint8(255)) - - p.setLocalRequestParams(23, 256) - offset, modulator = p.getLocalRequestParams() - a.Equal(offset, uint8(23)) - a.Equal(modulator, uint8(255)) - -} - -// TestSimpleGetters Tests the "simple" getters for the Peer Object -func TestSimpleGetters(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - var sentinelInterface interface{} - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p := makePeer(sentinelInterface, true, true, &config, log, 0) - - a.Equal(p.GetNetworkPeer(), sentinelInterface) - a.Equal(p.GetTransactionPoolAckChannel(), p.transactionPoolAckCh) -} - -// TestMakePeer Tests the Peer factory function -func TestMakePeer(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var sentinelInterface interface{} - config := config.GetDefaultLocal() - tlog := logging.TestingLog(t) - log := wrapLogger(tlog, &config) - p1 := makePeer(sentinelInterface, true, true, &config, log, 0) - - a.NotNil(p1) - a.Equal(p1.networkPeer, sentinelInterface) - a.Equal(p1.isOutgoing, true) - a.Equal(p1.recentSentTransactions, makeTransactionCache(shortTermRecentTransactionsSentBufferLength, longTermRecentTransactionsSentBufferLength, pendingUnconfirmedRemoteMessages)) - a.Equal(p1.requestedTransactionsModulator, uint8(1)) - a.Equal(p1.dataExchangeRate, uint64(defaultRelayToRelayDataExchangeRate)) - - // Check that we have different values if the local node relay is false - p2 := makePeer(sentinelInterface, true, false, &config, log, 0) - - a.NotNil(p2) - a.Equal(p1.networkPeer, sentinelInterface) - a.Equal(p1.isOutgoing, true) - a.Equal(p1.recentSentTransactions, makeTransactionCache(shortTermRecentTransactionsSentBufferLength, longTermRecentTransactionsSentBufferLength, pendingUnconfirmedRemoteMessages)) - a.Equal(p2.requestedTransactionsModulator, uint8(0)) - a.Equal(p2.dataExchangeRate, uint64(defaultDataExchangeRate)) - -} diff --git a/txnsync/peerscheduler.go b/txnsync/peerscheduler.go deleted file mode 100644 index fc1481c853..0000000000 --- a/txnsync/peerscheduler.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "container/heap" - "sort" - "time" -) - -//msgp:ignore peerBuckets -type peerBuckets []peerBucket - -type peerScheduler struct { - peers peerBuckets - nextPeers map[*Peer][]int // nextPeers holds an array of ordered indices where this Peer object is on the peers peerBuckets - node NodeConnector -} - -// makePeerScheduler initializes a peer scheduler object. -func makePeerScheduler() peerScheduler { - return peerScheduler{ - nextPeers: make(map[*Peer][]int), - } -} - -//msgp:ignore peerBucket -type peerBucket struct { - peer *Peer - next time.Duration -} - -// Push implements heap.Interface -func (p *peerScheduler) Push(x interface{}) { - entry := x.(peerBucket) - p.peers = append(p.peers, entry) - p.nextPeers[entry.peer] = append(p.nextPeers[entry.peer], len(p.peers)-1) - - if len(p.nextPeers[entry.peer]) > 1 { - peerIndices := p.nextPeers[entry.peer] - sort.Slice(peerIndices, func(i, j int) bool { - return p.peers[peerIndices[i]].next < p.peers[peerIndices[j]].next - }) - } - -} - -// Pop implements heap.Interface -func (p *peerScheduler) Pop() interface{} { - end := len(p.peers) - 1 - res := p.peers[end] - - // delete from the map only if it's the last entry - peerIndices := p.nextPeers[res.peer] - - if peerIndices[0] != end { - // this case is possible when the peer has two elements in p.peers. - // and both have the same next value. - for idx, x := range peerIndices { - if x == end { - peerIndices[0], peerIndices[idx] = peerIndices[idx], peerIndices[0] - break - } - } - } - // the peer index must be the first entry. - peerIndices = peerIndices[1:] - - // store if non-empty. - if len(peerIndices) > 0 { - p.nextPeers[res.peer] = peerIndices - } else { - delete(p.nextPeers, res.peer) - } - - p.peers[end] = peerBucket{} - p.peers = p.peers[0:end] - return res -} - -// Len implements heap.Interface -func (p *peerScheduler) Len() int { - return len(p.peers) -} - -func (p *peerScheduler) replaceIndices(indices []int, i, j int) { - - for idx, x := range indices { - if x == i { - indices[idx] = j - } else if x == j { - indices[idx] = i - } - } - sort.Slice(indices, func(i, j int) bool { - return p.peers[indices[i]].next < p.peers[indices[j]].next - }) -} - -// Swap implements heap.Interface -func (p *peerScheduler) Swap(i, j int) { - p.peers[i], p.peers[j] = p.peers[j], p.peers[i] - if p.peers[i].peer == p.peers[j].peer { - indices := p.nextPeers[p.peers[i].peer] - sort.Slice(indices, func(x, y int) bool { - return p.peers[indices[x]].next < p.peers[indices[y]].next - }) - return - } - p.replaceIndices(p.nextPeers[p.peers[i].peer], i, j) - p.replaceIndices(p.nextPeers[p.peers[j].peer], i, j) -} - -// Less implements heap.Interface -func (p *peerScheduler) Less(i, j int) bool { - return p.peers[i].next < p.peers[j].next -} - -// refresh the current schedule by creating new schedule for each of the peers. -func (p *peerScheduler) scheduleNewRound(peers []*Peer) { - // clear the existings peers list. - p.peers = make(peerBuckets, 0, len(peers)) - p.nextPeers = make(map[*Peer][]int) - for _, peer := range peers { - peerEntry := peerBucket{peer: peer} - peerEntry.next = kickoffTime + time.Duration(p.node.Random(uint64(randomRange))) - - p.peers = append(p.peers, peerEntry) - p.nextPeers[peer] = []int{len(p.peers) - 1} - } - heap.Init(p) -} - -func (p *peerScheduler) nextDuration() time.Duration { - if len(p.peers) == 0 { - return time.Duration(0) - } - return p.peers[0].next -} - -func (p *peerScheduler) getNextPeers() (outPeers []*Peer) { - next := p.nextDuration() - - // pull out of the heap all the entries that have next smaller or equal to the above next. - for len(p.peers) > 0 && p.peers[0].next <= next { - bucket := heap.Remove(p, 0).(peerBucket) - outPeers = append(outPeers, bucket.peer) - } - - // in many cases, we'll have only a single peer; however, in case we have multiple - // ( which is more likely when we're "running late" ), we want to make sure to remove - // duplicate ones. - if len(outPeers) > 1 { - // note that the algorithm here ensures that we retain the peer order from above - // while dropping off recurring peers. - peersMap := make(map[*Peer]bool, len(outPeers)) - offset := 0 - peersMap[outPeers[0]] = true - for i := 1; i < len(outPeers); i++ { - if peersMap[outPeers[i]] { - // we already had this peer. - offset++ - continue - } - // we haven't seen this peer. - outPeers[i-offset] = outPeers[i] - peersMap[outPeers[i]] = true - } - outPeers = outPeers[:len(outPeers)-offset] - } - return -} - -func (p *peerScheduler) schedulePeer(peer *Peer, next time.Duration) { - bucket := peerBucket{peer: peer, next: next} - heap.Push(p, bucket) -} - -func (p *peerScheduler) peerDuration(peer *Peer) time.Duration { - peerIndices := p.nextPeers[peer] - if len(peerIndices) == 0 { - return time.Duration(0) - } - bucket := heap.Remove(p, peerIndices[0]).(peerBucket) - return bucket.next -} diff --git a/txnsync/peerscheduler_test.go b/txnsync/peerscheduler_test.go deleted file mode 100644 index 7da6a0dd0d..0000000000 --- a/txnsync/peerscheduler_test.go +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "math" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/test/partitiontest" -) - -// TestBasics tests that the push, pop, len, swap and less functions perform appropriately -func TestBasics(t *testing.T) { - partitiontest.PartitionTest(t) - - ps := makePeerScheduler() - - require.Equal(t, 0, ps.Len()) - - peers := []Peer{ - Peer{ - lastSentMessageSequenceNumber: 123, - }, - Peer{ - lastSentMessageSequenceNumber: 456, - }, - } - - ps.Push(peerBucket{&peers[0], 0 * time.Millisecond}) - ps.Push(peerBucket{&peers[1], 1 * time.Millisecond}) - - require.Equal(t, 2, ps.Len()) - - require.Equal(t, uint64(123), ps.peers[0].peer.lastSentMessageSequenceNumber) - require.Equal(t, uint64(456), ps.peers[1].peer.lastSentMessageSequenceNumber) - require.True(t, ps.Less(0, 1)) - - ps.Swap(0, 1) - require.Equal(t, uint64(123), ps.peers[1].peer.lastSentMessageSequenceNumber) - require.Equal(t, uint64(456), ps.peers[0].peer.lastSentMessageSequenceNumber) - require.True(t, ps.Less(1, 0)) - - backPeer := ps.Pop().(peerBucket) - - require.Equal(t, uint64(123), backPeer.peer.lastSentMessageSequenceNumber) - - backPeer = ps.Pop().(peerBucket) - - require.Equal(t, uint64(456), backPeer.peer.lastSentMessageSequenceNumber) - - require.Equal(t, 0, ps.Len()) -} - -// TestSchedulerBasics tests the basic scheduler helper functions -func TestSchedulerBasics(t *testing.T) { - partitiontest.PartitionTest(t) - - ps := makePeerScheduler() - - peers := []Peer{ - Peer{ - lastSentMessageSequenceNumber: 123, - }, - Peer{ - lastSentMessageSequenceNumber: 456, - }, - Peer{ - lastSentMessageSequenceNumber: 789, - }, - } - - require.Equal(t, 0*time.Millisecond, ps.nextDuration()) - ps.schedulePeer(&peers[0], 2*time.Millisecond) - ps.schedulePeer(&peers[1], 1*time.Millisecond) - ps.schedulePeer(&peers[2], 3*time.Millisecond) - - require.Equal(t, 3, ps.Len()) - - require.Equal(t, 1*time.Millisecond, ps.nextDuration()) - - require.Equal(t, 3*time.Millisecond, ps.peerDuration(&peers[2])) - require.Equal(t, 2, ps.Len()) - - require.Equal(t, 1*time.Millisecond, ps.peerDuration(&peers[1])) - require.Equal(t, 1, ps.Len()) - - require.Equal(t, 2*time.Millisecond, ps.peerDuration(&peers[0])) - require.Equal(t, 0, ps.Len()) - - require.Equal(t, 0*time.Millisecond, ps.peerDuration(&peers[0])) -} - -// TestScheduleNewRound tests the scheduleNewRound method -func TestScheduleNewRound(t *testing.T) { - partitiontest.PartitionTest(t) - - ps := makePeerScheduler() - ps.node = &mockNodeConnector{} - - peers := []Peer{ - Peer{ - lastSentMessageSequenceNumber: 123, - }, - Peer{ - lastSentMessageSequenceNumber: 456, - }, - Peer{ - lastSentMessageSequenceNumber: 789, - }, - } - - peers2 := []Peer{ - Peer{ - lastSentMessageSequenceNumber: 321, - }, - Peer{ - lastSentMessageSequenceNumber: 654, - }, - Peer{ - lastSentMessageSequenceNumber: 987, - }, - Peer{ - lastSentMessageSequenceNumber: 146, - }, - } - - ps.schedulePeer(&peers[0], 2*time.Millisecond) - ps.schedulePeer(&peers[1], 1*time.Millisecond) - ps.schedulePeer(&peers[2], 3*time.Millisecond) - require.Equal(t, 3, ps.Len()) - - ps.scheduleNewRound([]*Peer{&peers2[0], &peers2[1], &peers2[2], &peers2[3]}) - require.Equal(t, 4, ps.Len()) - -} - -// TestNextPeers tests that the nextPeers function -func TestNextPeers(t *testing.T) { - partitiontest.PartitionTest(t) - - ps := makePeerScheduler() - ps.node = &mockNodeConnector{} - - peers := []Peer{ - Peer{ - lastSentMessageSequenceNumber: 1, - }, - Peer{ - lastSentMessageSequenceNumber: 2, - }, - Peer{ - lastSentMessageSequenceNumber: 3, - }, - } - - ps.schedulePeer(&peers[0], 1*time.Millisecond) - ps.schedulePeer(&peers[1], 2*time.Millisecond) - ps.schedulePeer(&peers[1], 2*time.Millisecond) - ps.schedulePeer(&peers[2], 2*time.Millisecond) - - require.Equal(t, 4, ps.Len()) - - outPeers := ps.getNextPeers() - - require.Equal(t, 3, ps.Len()) - require.Equal(t, 1, len(outPeers)) - require.Equal(t, uint64(1), outPeers[0].lastSentMessageSequenceNumber) - - outPeers = ps.getNextPeers() - - require.Equal(t, 0, ps.Len()) - require.Equal(t, 2, len(outPeers)) - require.Equal(t, uint64(3), outPeers[0].lastSentMessageSequenceNumber) - require.Equal(t, uint64(2), outPeers[1].lastSentMessageSequenceNumber) - -} - -func TestNextPeersLargeSet(t *testing.T) { - - partitiontest.PartitionTest(t) - - ps := makePeerScheduler() - ps.node = &mockNodeConnector{} - - numPeers := 100 - dupTimesPerPeer := 3 - numTimeSamples := 10 - - peers := make([]*Peer, 0, numPeers) - for x := 1; x <= numPeers; x++ { - peer := Peer{lastSentMessageSequenceNumber: uint64(x)} - peers = append(peers, &peer) - } - require.Equal(t, int64(0), int64(ps.nextDuration())) - - // Add peers with random next values - ps.scheduleNewRound(peers) - checkMonotonicNexts(&ps, t) - checkIndexMatch(&ps, t) - - // Add nexts with defined values to guarantee duplicate values - for dups := 0; dups < dupTimesPerPeer; dups++ { - for x := 1; x <= numTimeSamples; x++ { - for p := 0; p < len(peers); p++ { - val := int64(math.Abs(math.Sin(float64(x))) * 100.00) - ps.schedulePeer(peers[p], time.Millisecond*time.Duration(val)) - } - } - } - outPeers := ps.getNextPeers() - require.Equal(t, numPeers, len(outPeers)) - checkMonotonicNexts(&ps, t) - checkIndexMatch(&ps, t) - - // Repeatedly schedule and remove peers, and varify the invariants are honored - for dups := 0; dups < dupTimesPerPeer; dups++ { - for x := 1; x <= numTimeSamples*numPeers; { - for p := 0; p < len(peers); p++ { - val := int64(math.Abs(math.Sin(float64(x))) * 10.00) - ps.schedulePeer(peers[p], time.Millisecond*time.Duration(val)) - x++ - } - checkMonotonicNexts(&ps, t) - checkIndexMatch(&ps, t) - outPeers := ps.getNextPeers() - require.GreaterOrEqual(t, len(outPeers), 0) - } - } - - // Drain the peers and make sure goes down to 0 without errors - for _, peerB := range ps.peers { - prev := int64(0) - for { - dur := int64(ps.peerDuration(peerB.peer)) - if dur == 0 { - break - } - require.GreaterOrEqual(t, dur, prev) - prev = dur - } - checkMonotonicNexts(&ps, t) - checkIndexMatch(&ps, t) - } -} - -func checkMonotonicNexts(ps *peerScheduler, t *testing.T) { - for _, s := range ps.nextPeers { - prevIdx := -1 - for _, idx := range s { - if prevIdx == -1 { - prevIdx = idx - } - require.LessOrEqual(t, int64(ps.peers[prevIdx].next), int64(ps.peers[idx].next)) - prevIdx = idx - } - } -} - -func checkIndexMatch(ps *peerScheduler, t *testing.T) { - for peer, s := range ps.nextPeers { - for _, peerIdx := range s { - require.Equal(t, peer, ps.peers[peerIdx].peer) - - } - } -} diff --git a/txnsync/profiler.go b/txnsync/profiler.go deleted file mode 100644 index 0332faa3a5..0000000000 --- a/txnsync/profiler.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "time" - - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/logging/telemetryspec" - "github.com/algorand/go-algorand/util/timers" -) - -//msgp:ignore profElements -type profElements int - -const ( - profElementIdle = iota - profElementTxChange - profElementNewRound - profElementPeerState - profElementIncomingMsg - profElementOutgoingMsg - profElementNextOffset - - // detached elements - profElementGetTxnsGroups - profElementAssembleMessage - profElementMakeBloomFilter - profElementTxnsSelection - - profElementLast - profFirstDetachedElement = profElementGetTxnsGroups -) - -// The profiler struct provides profiling information regarding the main loop performance -// characteristics. Using it provides statistics information about the recent duty cycle utilization, -// that could be used when trying to throttle the accuracy and performance of the transaction sync. -type profiler struct { - // clock used as the source clock for measurements. - clock timers.WallClock - // elements contains the elements we want to measure. The user of this struct would not interact - // with this variable directly. Instead, he/she would use getElement to get the element for a specific - // profElements and use the start()/end() methods on that element. - elements []*element - // log is used to report the outcome of the measuring. - log logging.Logger - - // profile contains all the elements indices, in order of arrival. It allows us to maintain a moving window. - profile []int - // profileSum is the total amount of time tracked by the profile array. - profileSum time.Duration - // profileSpan is the max span of the array ( or - the window ) that we would like to maintain. - profileSpan time.Duration - // lastProfileLog is the last time we've logged to the telemetry. - lastProfileLog time.Duration - // logInterval defines what is the frequency at which we send an event to the telemetry. Zero to disable. - logInterval time.Duration -} - -// element represent a single tracked element that would be profiled. -type element struct { - // id is the index of the element in the profiler's elements array. - id int - // lastStart is the timestamp of the last time we called "start" - lastStart time.Duration - // profiler points to the parent profiler. - profiler *profiler - // times contains the times we've monitored for this element. - times []time.Duration - // total is the total accumulated time for this element ( i.e. sum(times) ) - total time.Duration - // detached indicate whether this is a detached elements or not. Detached elements don't add to the total amount of time - // counted by the profiler, allowing them to overlap with other elements. - detached bool -} - -func makeProfiler(span time.Duration, clock timers.WallClock, log logging.Logger, logInterval time.Duration) *profiler { - prof := &profiler{ - profileSpan: span, - clock: clock, - log: log, - logInterval: logInterval, - } - prof.createElements() - return prof -} - -func (p *profiler) createElements() { - for element := 0; element < profElementLast; element++ { - p.createElement(element >= profFirstDetachedElement) - } -} - -func (p *profiler) createElement(detached bool) *element { - i := len(p.elements) - e := &element{ - id: i, - profiler: p, - detached: detached, - } - p.elements = append(p.elements, e) - return e -} - -func (p *profiler) getElement(el profElements) *element { - return p.elements[el] -} - -func (p *profiler) prune() { - for p.profileSum > p.profileSpan { - // remove the first elements from the profile. - i := p.profile[0] - e := p.elements[i] - dt := e.times[0] - - e.total -= dt - if !e.detached { - p.profileSum -= dt - } - - p.profile = p.profile[1:] - e.times = e.times[1:] - } -} - -func (p *profiler) maybeLogProfile() { - // do we have the log profile enabled ? - if p.logInterval == 0 { - return - } - // do we have enough samples ? ( i.e. at least 50% sample time ) - if p.profileSum < p.profileSpan/2 { - return - } - // have we sent metrics recently ? - curTime := p.clock.Since() - if curTime-p.lastProfileLog <= p.logInterval { - return - } - p.lastProfileLog = curTime - p.logProfile() -} - -func (p *profiler) logProfile() { - metrics := telemetryspec.TransactionSyncProfilingMetrics{ - TotalOps: uint64(len(p.profile)), - IdleOps: uint64(len(p.elements[profElementIdle].times)), - TransactionPoolChangedOps: uint64(len(p.elements[profElementTxChange].times)), - NewRoundOps: uint64(len(p.elements[profElementNewRound].times)), - PeerStateOps: uint64(len(p.elements[profElementPeerState].times)), - IncomingMsgOps: uint64(len(p.elements[profElementIncomingMsg].times)), - OutgoingMsgOps: uint64(len(p.elements[profElementOutgoingMsg].times)), - NextOffsetOps: uint64(len(p.elements[profElementNextOffset].times)), - GetTxnGroupsOps: uint64(len(p.elements[profElementGetTxnsGroups].times)), - AssembleMessageOps: uint64(len(p.elements[profElementAssembleMessage].times)), - MakeBloomFilterOps: uint64(len(p.elements[profElementMakeBloomFilter].times)), - SelectPendingTransactionsOps: uint64(len(p.elements[profElementTxnsSelection].times)), - - TotalDuration: p.profileSum, - IdlePercent: float64(p.elements[profElementIdle].total) * 100.0 / float64(p.profileSum), - TransactionPoolChangedPercent: float64(p.elements[profElementTxChange].total) * 100.0 / float64(p.profileSum), - NewRoundPercent: float64(p.elements[profElementNewRound].total) * 100.0 / float64(p.profileSum), - PeerStatePercent: float64(p.elements[profElementPeerState].total) * 100.0 / float64(p.profileSum), - IncomingMsgPercent: float64(p.elements[profElementIncomingMsg].total) * 100.0 / float64(p.profileSum), - OutgoingMsgPercent: float64(p.elements[profElementOutgoingMsg].total) * 100.0 / float64(p.profileSum), - NextOffsetPercent: float64(p.elements[profElementNextOffset].total) * 100.0 / float64(p.profileSum), - GetTxnGroupsPercent: float64(p.elements[profElementGetTxnsGroups].total) * 100.0 / float64(p.profileSum), - AssembleMessagePercent: float64(p.elements[profElementAssembleMessage].total) * 100.0 / float64(p.profileSum), - MakeBloomFilterPercent: float64(p.elements[profElementMakeBloomFilter].total) * 100.0 / float64(p.profileSum), - SelectPendingTransactionsPercent: float64(p.elements[profElementTxnsSelection].total) * 100.0 / float64(p.profileSum), - } - - p.log.Metrics(telemetryspec.Transaction, metrics, struct{}{}) -} - -func (e *element) start() { - if e.profiler.logInterval > 0 { - e.lastStart = e.profiler.clock.Since() - } -} - -func (e *element) end() { - if e.profiler.logInterval == 0 { - return - } - diff := e.profiler.clock.Since() - e.lastStart - e.total += diff - e.times = append(e.times, diff) - e.profiler.profile = append(e.profiler.profile, e.id) - - if !e.detached { - e.profiler.profileSum += diff - e.profiler.prune() - e.profiler.maybeLogProfile() - } -} diff --git a/txnsync/profiler_test.go b/txnsync/profiler_test.go deleted file mode 100644 index 6ac4e0f063..0000000000 --- a/txnsync/profiler_test.go +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/logging/telemetryspec" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/timers" -) - -// Create a logger that hooks the "Metrics" function to signal that we have -// indeed sent some metrics -type metricsLogger struct { - Logger - sentLogger *bool -} - -func makeMetricsLogger(sentLogger *bool) metricsLogger { - return metricsLogger{ - sentLogger: sentLogger, - } -} - -func (n metricsLogger) Metrics(category telemetryspec.Category, metrics telemetryspec.MetricDetails, details interface{}) { - *n.sentLogger = true -} - -// TestPrune Test the prune capabilities of the profiler. We want to simulate -// the conditions to show that the profiler will "remove" elements when needed. -func TestPrune(t *testing.T) { - partitiontest.PartitionTest(t) - - prof := makeProfiler(2*time.Millisecond, nil, nil, 3*time.Millisecond) - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - prof.profileSum = 2 - prof.profileSpan = 1 - - prof.profile = append(prof.profile, 0) - - firstElement := &prof.elements[0] - - (*firstElement).detached = false - - (*firstElement).times = append((*firstElement).times, time.Duration(2), time.Duration(2)) - (*firstElement).total = time.Duration(4) - - a.Equal(len(prof.profile), 1) - a.Equal(len((*firstElement).times), 2) - - prof.prune() - - a.Equal(len(prof.profile), 0) - a.Equal(len((*firstElement).times), 1) - a.Equal((*firstElement).total, time.Duration(2)) - -} - -// TestProfilerStartEndZero Test functionality if the log interval is 0 -func TestProfilerStartEndZero(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - prof := makeProfiler(2*time.Millisecond, s.clock, nil, 0*time.Millisecond) - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - firstElement := &prof.elements[0] - - oldLastStart := (*firstElement).lastStart - oldTotal := (*firstElement).total - - (*firstElement).start() - time.Sleep(5 * time.Millisecond) - (*firstElement).end() - - a.Equal(oldLastStart, (*firstElement).lastStart) - a.Equal(oldTotal, (*firstElement).total) - -} - -// TestProfilerStartEndEnabled Test profiler functionality if log interval is non-zero. -// This test will assume that a successful start()-end() call -// will produce a non-zero profile sum. -// -// This test forces "detached element" logic to be run. -func TestProfilerStartEndEnabled(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - tmp := false - // Need to supply logger just in case log profile is called - nl := makeMetricsLogger(&tmp) - prof := makeProfiler(2*time.Millisecond, s.clock, nl, 3*time.Millisecond) - - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - element := prof.getElement(0) - - // Ensure that we trip the if statement - element.detached = false - - a.Equal(element.total, time.Duration(0)) - a.Equal(len(element.times), 0) - a.Equal(len(element.profiler.profile), 0) - a.Equal(element.profiler.profileSum, time.Duration(0)) - - element.start() - element.end() - a.NotEqual(element.total, time.Duration(0)) - a.Equal(len(element.times), 1) - a.Equal(len(element.profiler.profile), 1) - a.NotEqual(element.profiler.profileSum, time.Duration(0)) - -} - -// TestProfilerStartEndDisabled Test start-end functionality with detached elements. -func TestProfilerStartEndDisabled(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - s.clock = timers.MakeMonotonicClock(time.Now()) - prof := makeProfiler(2*time.Millisecond, s.clock, nil, 3*time.Millisecond) - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - element := prof.getElement(0) - - // Set to true so we don't trip the if statement for now - element.detached = true - - a.Equal(element.total, time.Duration(0)) - a.Equal(len(element.times), 0) - a.Equal(len(element.profiler.profile), 0) - - element.start() - element.end() - a.NotEqual(element.total, time.Duration(0)) - a.Equal(len(element.times), 1) - a.Equal(len(element.profiler.profile), 1) - -} - -// TestMaybeLogProfile Test that Metrics are only sent when all conditions are met and not -// sent if they are not. -func TestMaybeLogProfile(t *testing.T) { - partitiontest.PartitionTest(t) - - sentMetrics := false - - var s syncState - nl := makeMetricsLogger(&sentMetrics) - s.clock = timers.MakeMonotonicClock(time.Now()) - prof := makeProfiler(2*time.Millisecond, s.clock, nl, 3*time.Millisecond) - - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - // -- - prof.logInterval = 0 - prof.maybeLogProfile() - a.False(sentMetrics) - prof.logInterval = 1 - - // -- - - prof.profileSum = 1 - prof.profileSpan = 4 - prof.maybeLogProfile() - a.False(sentMetrics) - - prof.profileSum = 4 - prof.profileSpan = 4 - - // -- - prof.logInterval = 2147483647 // Make this stupidly high to make sure we hit the if statement - prof.lastProfileLog = prof.clock.Since() - prof.maybeLogProfile() - a.False(sentMetrics) - - // The last call to maybeLogProfile should set lastProfileLog to cur time - prof.logInterval = 1 * time.Nanosecond - // Sleep some time so we are above 1 ns of duration with a high degree of certainty - time.Sleep(200 * time.Millisecond) - - prof.maybeLogProfile() - a.True(sentMetrics) - -} - -// TestGetElement Tests that getting an element returns it properly -func TestGetElement(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - prof := makeProfiler(2*time.Millisecond, s.clock, s.log, 3*time.Millisecond) - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - for i := 0; i < profElementLast; i++ { - e := prof.getElement(profElements(i)) - - a.Equal(e.id, i) - } - -} - -// TestMakeProfiler Ensures that makeProfiler() returns a valid profiler. -func TestMakeProfiler(t *testing.T) { - partitiontest.PartitionTest(t) - - var s syncState - prof := makeProfiler(2*time.Millisecond, s.clock, s.log, 3*time.Millisecond) - a := require.New(t) - - a.NotNil(prof) - a.NotNil(prof.elements) - - a.Equal(prof.profileSpan, 2*time.Millisecond) - a.Equal(prof.logInterval, 3*time.Millisecond) - a.Equal(len(prof.elements), profElementLast) - - for i, e := range prof.elements { - a.Equal(e.id, i) - a.Equal(e.profiler, prof) - - if i < profFirstDetachedElement { - a.False(e.detached) - } else { - a.True(e.detached) - } - } - -} diff --git a/txnsync/sent_filter.go b/txnsync/sent_filter.go deleted file mode 100644 index 603a73a129..0000000000 --- a/txnsync/sent_filter.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "github.com/algorand/go-algorand/data/basics" -) - -//msgp:ignore sentFilterStat -type sentFilterStat struct { - // .Modulator .Offset - EncodingParams requestParams - - // lastCounter is the group counter of the last txn group included in a sent filter - lastCounter uint64 - - round basics.Round -} - -// sentFilters is the set of filter stats for one peer to another peer. -// There should be at most one entry per (Modulator,Offset) -//msgp:ignore sentFilters -type sentFilters []sentFilterStat - -const maxSentFilterSet = 10 - -func (sf *sentFilters) setSentFilter(filter bloomFilter, round basics.Round) { - encodingParams := filter.encoded.EncodingParams - for i, sfs := range *sf { - if sfs.EncodingParams == encodingParams { - (*sf)[i].lastCounter = filter.containedTxnsRange.lastCounter - (*sf)[i].round = round - return - } - } - nsf := sentFilterStat{ - EncodingParams: encodingParams, - lastCounter: filter.containedTxnsRange.lastCounter, - round: round, - } - *sf = append(*sf, nsf) - // trim oldest content if we're too long - for len(*sf) > maxSentFilterSet { - oldestRound := round - popCandidate := -1 - for i, sfs := range *sf { - if sfs.round < oldestRound { - oldestRound = sfs.round - popCandidate = i - } - } - if popCandidate >= 0 { - last := len(*sf) - 1 - (*sf)[popCandidate] = (*sf)[last] - *sf = (*sf)[:last] - break - } - } -} - -func (sf *sentFilters) nextFilterGroup(encodingParams requestParams) (lastCounter uint64, round basics.Round) { - for _, sfs := range *sf { - if sfs.EncodingParams == encodingParams { - return sfs.lastCounter + 1, sfs.round - } - } - return 0, 0 // include everything since the start -} diff --git a/txnsync/sent_filter_test.go b/txnsync/sent_filter_test.go deleted file mode 100644 index f441dc76d2..0000000000 --- a/txnsync/sent_filter_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "testing" - - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/stretchr/testify/require" -) - -func TestSentFilterSet(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - var sf sentFilters - - ep := requestParams{Offset: 4, Modulator: 255} - bf := bloomFilter{ - containedTxnsRange: transactionsRange{1, 42, 99}, - encoded: encodedBloomFilter{EncodingParams: ep}, - } - - // what goes in .. - sf.setSentFilter(bf, basics.Round(13)) - - // .. comes out - lastCounter, lcRound := sf.nextFilterGroup(ep) - a.Equal(uint64(42+1), lastCounter) - a.Equal(basics.Round(13), lcRound) - - for i := 0; i < maxSentFilterSet; i++ { - bf.encoded.EncodingParams.Offset++ - sf.setSentFilter(bf, basics.Round(14+i)) - } - - // first oldest entry will have been lost - lastCounter, lcRound = sf.nextFilterGroup(ep) - a.Equal(uint64(0), lastCounter) - a.Equal(basics.Round(0), lcRound) -} diff --git a/txnsync/service.go b/txnsync/service.go deleted file mode 100644 index e931072e3d..0000000000 --- a/txnsync/service.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "sync" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/util/execpool" -) - -// Service is the transaction sync main service object. -type Service struct { - ctx context.Context - cancelCtx context.CancelFunc - waitGroup sync.WaitGroup - - state syncState -} - -// MakeTransactionSyncService creates a new Service object -func MakeTransactionSyncService(log logging.Logger, conn NodeConnector, isRelay bool, genesisID string, genesisHash crypto.Digest, cfg config.Local, threadpool execpool.BacklogPool) *Service { - s := &Service{ - state: syncState{ - node: conn, - log: wrapLogger(log, &cfg), - isRelay: isRelay, - genesisID: genesisID, - genesisHash: genesisHash, - config: cfg, - threadpool: threadpool, - scheduler: makePeerScheduler(), - }, - } - s.state.service = s - s.state.xorBuilder.MaxIterations = 10 - - setTransactionSyncVariables(cfg) - return s -} - -func setTransactionSyncVariables(cfg config.Local) { - if cfg.TxPoolSize < maxEncodedTransactionGroups { - return - } - maxEncodedTransactionGroups = cfg.TxPoolSize - maxEncodedTransactionGroupEntries = cfg.TxPoolSize - maxBitmaskSize = (maxEncodedTransactionGroupEntries+7)/8 + 1 - maxSignatureBytes = maxEncodedTransactionGroupEntries * len(crypto.Signature{}) - maxAddressBytes = maxEncodedTransactionGroupEntries * crypto.DigestSize - - maxBloomFilterSize = cfg.TxPoolSize * 5 // 32 bit xor uses slightly more than 4 bytes/element. - maxEncodedTransactionGroupBytes = cfg.TxPoolSize * 10000 // assume each transaction takes 10KB, as a worst-case-scenario for bounding purposes only. -} - -// Start starts the transaction sync -func (s *Service) Start() { - s.ctx, s.cancelCtx = context.WithCancel(context.Background()) - s.waitGroup.Add(1) - - go s.state.mainloop(s.ctx, &s.waitGroup) -} - -// Stop stops the transaction sync -func (s *Service) Stop() { - // cancel the context - s.cancelCtx() - // wait until the mainloop exists. - s.waitGroup.Wait() - // clear the context, as we won't be using it anymore. - s.cancelCtx, s.ctx = nil, nil -} - -// GetIncomingMessageHandler returns the message handler. -func (s *Service) GetIncomingMessageHandler() IncomingMessageHandler { - return s.state.asyncIncomingMessageHandler -} - -func init() { - setTransactionSyncVariables(config.GetDefaultLocal()) -} diff --git a/txnsync/service_test.go b/txnsync/service_test.go deleted file mode 100644 index 2b262fc185..0000000000 --- a/txnsync/service_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "encoding/binary" - "math/rand" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/execpool" - "github.com/algorand/go-algorand/util/timers" -) - -type mockLogger struct { - logging.Logger -} - -type mockNodeConnector struct { - NodeConnector - calledEvents *bool - peerInfo PeerInfo - updatingPeers bool - transactionPoolSize int - peers []PeerInfo -} - -func makeMockNodeConnector(calledEvents *bool) mockNodeConnector { - return mockNodeConnector{calledEvents: calledEvents} -} - -func (fn *mockNodeConnector) Events() <-chan Event { - if fn.calledEvents != nil { - *fn.calledEvents = true - } - return nil -} - -func (fn *mockNodeConnector) GetCurrentRoundSettings() (out RoundSettings) { return } - -func (fn *mockNodeConnector) Clock() (out timers.WallClock) { - return timers.MakeMonotonicClock(time.Now()) -} - -func (fn *mockNodeConnector) Random(rng uint64) uint64 { - var xb [8]byte - rand.Read(xb[:]) - rv := binary.LittleEndian.Uint64(xb[:]) - return rv % rng -} - -func (fn *mockNodeConnector) GetPeers() []PeerInfo { return fn.peers } - -func (fn *mockNodeConnector) GetPeer(interface{}) (out PeerInfo) { - return fn.peerInfo -} - -func (fn *mockNodeConnector) UpdatePeers(txsyncPeers []*Peer, netPeers []interface{}, peersAverageDataExchangeRate uint64) { - fn.updatingPeers = true -} -func (fn *mockNodeConnector) SendPeerMessage(netPeer interface{}, msg []byte, callback SendMessageCallback) { -} - -func (fn *mockNodeConnector) GetPeerLatency(netPeer interface{}) time.Duration { - return 0 -} - -func (fn *mockNodeConnector) GetPendingTransactionGroups() (txGroups []pooldata.SignedTxGroup, latestLocallyOriginatedGroupCounter uint64) { - return -} -func (fn *mockNodeConnector) IncomingTransactionGroups(peer *Peer, messageSeq uint64, txGroups []pooldata.SignedTxGroup) (transactionPoolSize int) { - return fn.transactionPoolSize -} -func (fn *mockNodeConnector) NotifyMonitor() chan struct{} { return nil } - -type mockThreadPool struct { - execpool.BacklogPool -} - -// TestStartStopTransactionSyncService test that we can start and stop the transaction sync service -func TestStartStopTransactionSyncService(t *testing.T) { - partitiontest.PartitionTest(t) - - calledEventsInNodeConnector := false - - a := require.New(t) - - mLogger := mockLogger{} - mNodeConnector := makeMockNodeConnector(&calledEventsInNodeConnector) - cfg := config.GetDefaultLocal() - mThreadPool := mockThreadPool{} - - hashDigest := crypto.Hash([]byte{0x41, 0x6b, 0x69, 0x6b, 0x69}) - - service := MakeTransactionSyncService(mLogger, &mNodeConnector, true, "GENID", hashDigest, cfg, mThreadPool) - - a.NotNil(service) - - service.Start() - service.Stop() - - a.True(calledEventsInNodeConnector) - - a.Nil(service.cancelCtx) - a.Nil(service.ctx) - -} - -// TestMakeTransactionSyncService tests that an appropriate transaction sync service was made -func TestMakeTransactionSyncService(t *testing.T) { - partitiontest.PartitionTest(t) - - a := require.New(t) - - mLogger := mockLogger{} - mNodeConnector := &mockNodeConnector{} - cfg := config.GetDefaultLocal() - mThreadPool := mockThreadPool{} - - hashDigest := crypto.Hash([]byte{0x41, 0x6b, 0x69, 0x6b, 0x69}) - - service1 := MakeTransactionSyncService(mLogger, mNodeConnector, true, "GENID", hashDigest, cfg, mThreadPool) - - a.NotNil(service1) - - a.Equal(service1.state.node, mNodeConnector) - a.Equal(service1.state.log, wrapLogger(mLogger, &cfg)) - a.Equal(service1.state.isRelay, true) - a.Equal(service1.state.genesisID, "GENID") - a.Equal(service1.state.genesisHash, hashDigest) - a.Equal(service1.state.config, cfg) - a.Equal(service1.state.threadpool, mThreadPool) - a.Equal(service1.state.service, service1) - a.Equal(service1.state.xorBuilder.MaxIterations, 10) - - service2 := MakeTransactionSyncService(mLogger, mNodeConnector, false, "GENID2", hashDigest, cfg, mThreadPool) - - a.NotNil(service1) - - a.Equal(service2.state.node, mNodeConnector) - a.Equal(service2.state.log, wrapLogger(mLogger, &cfg)) - a.Equal(service2.state.isRelay, false) - a.Equal(service2.state.genesisID, "GENID2") - a.Equal(service2.state.genesisHash, hashDigest) - a.Equal(service2.state.config, cfg) - a.Equal(service2.state.threadpool, mThreadPool) - a.Equal(service2.state.service, service2) - a.Equal(service2.state.xorBuilder.MaxIterations, 10) - -} diff --git a/txnsync/transactionCache.go b/txnsync/transactionCache.go deleted file mode 100644 index 69569547d6..0000000000 --- a/txnsync/transactionCache.go +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "sort" - "time" - - "github.com/algorand/go-algorand/data/transactions" -) - -// cachedEntriesPerMap is the number of entries the longTermTransactionCache will have in each of it's -// buckets. When looking up an entry, we don't want to have too many entries, hence, the number of maps we -// maintain shouldn't be too high. On the flip side, keeping small number of maps means that we drop out -// large portion of our cache. The number 917 here was picked as a sufficiently large prime number, which -// would mean that if longTermRecentTransactionsSentBufferLength=15K, then we would have about 16 maps. -const cachedEntriesPerMap = 917 - -// cacheHistoryDuration is the time we will keep a transaction in the cache, assuming that the cache -// storage would not get recycled first. When applied to transactions maps in the longTermTransactionCache, this -// applies to the timestamp of the most recent transaction in the map. -const cacheHistoryDuration = 10 * time.Second - -// transactionCache is a cache of recently sent transactions ids, allowing to limit the size of the historical kept transactions. -// transactionCache has FIFO replacement. -// implementation is a simple cyclic-buffer with a map to accelerate lookups. -// internally, it's being manages as two tier cache, where the long-term cache is bigger and requires acknowledgements. -//msgp:ignore transactionCache -type transactionCache struct { - shortTermCache shortTermTransactionCache - longTermCache longTermTransactionCache - ackPendingTxids []ackPendingTxids -} - -//msgp:ignore ackPendingTxids -type ackPendingTxids struct { - txids []transactions.Txid - seq uint64 - timestamp time.Duration -} - -// shortTermCacheEntry is used as the data container of a double linked list item -// in the shortTermTransactionCache object. -//msgp:ignore shortTermCacheEntry -type shortTermCacheEntry struct { - txid transactions.Txid // the transaction ID - prev *shortTermCacheEntry // previous entry in the circular linked list - next *shortTermCacheEntry // next entry in the circular linked list -} - -//msgp:ignore shortTermTransactionCache -type shortTermTransactionCache struct { - size int // the maximum number of elements in the short term cache - head *shortTermCacheEntry // pointer to first element in the linked list; the head is the "oldest" entry in the list, and would get pruned first. - free *shortTermCacheEntry // pointer to a free element list - transactionsMap map[transactions.Txid]*shortTermCacheEntry // map of the entries included -} - -//msgp:ignore longTermTransactionCache -type longTermTransactionCache struct { - current int - transactionsMap []map[transactions.Txid]bool - timestamps []time.Duration -} - -// detach remove the entry from the list it's currently part of. -// the return value is false if the item is the only entry in the list -// or true otherwise. -func (ce *shortTermCacheEntry) detach() bool { - if ce.next == ce.prev { - return false - } - ce.prev.next = ce.next - ce.next.prev = ce.prev - return true -} - -// addToList add the element to the tail of the list who's head is provided. -func (ce *shortTermCacheEntry) addToList(head *shortTermCacheEntry) { - tail := head.prev - tail.next = ce - head.prev = ce - ce.prev = tail - ce.next = head -} - -// makeTransactionCache creates the transaction cache -func makeTransactionCache(shortTermSize, longTermSize, pendingAckTxids int) *transactionCache { - txnCache := &transactionCache{ - shortTermCache: shortTermTransactionCache{ - size: shortTermSize, - transactionsMap: make(map[transactions.Txid]*shortTermCacheEntry, shortTermSize), - }, - ackPendingTxids: make([]ackPendingTxids, 0, pendingAckTxids), - longTermCache: longTermTransactionCache{ - transactionsMap: make([]map[transactions.Txid]bool, (longTermSize+cachedEntriesPerMap-1)/cachedEntriesPerMap), - timestamps: make([]time.Duration, (longTermSize+cachedEntriesPerMap-1)/cachedEntriesPerMap), - }, - } - // initialize only the first entry; the rest would be created dynamically. - txnCache.longTermCache.transactionsMap[0] = make(map[transactions.Txid]bool, cachedEntriesPerMap) - return txnCache -} - -// add adds a single trasaction ID to the short term cache. -func (lru *transactionCache) add(txid transactions.Txid) { - lru.shortTermCache.add(txid) -} - -// addSlice adds a slice to both the short term cache as well as the pending ack transaction ids. -func (lru *transactionCache) addSlice(txids []transactions.Txid, msgSeq uint64, timestamp time.Duration) { - for _, txid := range txids { - lru.shortTermCache.add(txid) - } - // verify that the new msgSeq is bigger than the previous we have. - if len(lru.ackPendingTxids) > 0 { - if lru.ackPendingTxids[len(lru.ackPendingTxids)-1].seq >= msgSeq { - return - } - } - - if len(lru.ackPendingTxids) == cap(lru.ackPendingTxids) { - // roll this array without reallocation. - copy(lru.ackPendingTxids, lru.ackPendingTxids[1:]) - // update the last entry of the array. - lru.ackPendingTxids[len(lru.ackPendingTxids)-1] = ackPendingTxids{txids: txids, seq: msgSeq, timestamp: timestamp} - } else { - lru.ackPendingTxids = append(lru.ackPendingTxids, ackPendingTxids{txids: txids, seq: msgSeq, timestamp: timestamp}) - } - - // clear the entries that are too old. - lastValidEntry := -1 - for i, entry := range lru.ackPendingTxids { - if entry.timestamp < timestamp-cacheHistoryDuration { - lastValidEntry = i - } else { - break - } - } - if lastValidEntry >= 0 { - // copy the elements - var i int - for i = 0; i < len(lru.ackPendingTxids)-1-lastValidEntry; i++ { - lru.ackPendingTxids[i] = lru.ackPendingTxids[i+lastValidEntry+1] - } - // clear the rest of the entries. - for ; i < len(lru.ackPendingTxids); i++ { - lru.ackPendingTxids[i] = ackPendingTxids{} - } - // reset the slice - lru.ackPendingTxids = lru.ackPendingTxids[:len(lru.ackPendingTxids)-lastValidEntry-1] - } -} - -// contained checks if a given transaction ID is contained in either the short term or long term cache -func (lru *transactionCache) contained(txid transactions.Txid) bool { - return lru.shortTermCache.contained(txid) || lru.longTermCache.contained(txid) -} - -// reset clears the short term cache -func (lru *transactionCache) reset() { - lru.shortTermCache.reset() -} - -// acknowledge process a given slice of previously sent message sequence numbers. The transaction IDs that -// were previously sent with these sequence numbers are being added to the long term cache. -func (lru *transactionCache) acknowledge(seqs []uint64) { - for _, seq := range seqs { - i := sort.Search(len(lru.ackPendingTxids), func(i int) bool { - return lru.ackPendingTxids[i].seq >= seq - }) - // if not found, skip it. - if i >= len(lru.ackPendingTxids) || seq != lru.ackPendingTxids[i].seq { - continue - } - lru.longTermCache.add(lru.ackPendingTxids[i].txids, lru.ackPendingTxids[i].timestamp) - lru.longTermCache.prune(lru.ackPendingTxids[i].timestamp - cacheHistoryDuration) - // clear out the entry at lru.ackPendingTxids[i] so that the GC could reclaim it. - lru.ackPendingTxids[i] = ackPendingTxids{} - // and delete the entry from the array - lru.ackPendingTxids = append(lru.ackPendingTxids[:i], lru.ackPendingTxids[i+1:]...) - } -} - -// add a given transaction ID to the short term cache. -func (st *shortTermTransactionCache) add(txid transactions.Txid) { - entry, exists := st.transactionsMap[txid] - if exists { - // promote - if entry.next != entry.prev { - // disconnect the current one; no need to test return code since we know - // there will be more elements on the list. - entry.detach() - - // there are other elements on the list. - // if the given entry happen to be the first entry, then pick - // the next entry. - if entry == st.head { - st.head = entry.next - } - // add to the tail of the list. - entry.addToList(st.head) - } else { //nolint:staticcheck - // no other elements on the list - - // nothing to do in this case. - } - return - } - - mapLen := len(st.transactionsMap) - if mapLen >= st.size { - // we reached size, delete the oldest entry. - t := st.head - - // disconnect the current one; no need to test return code since we know - // there will be more elements on the list. - t.detach() - - // replace the first entry with the next one. - st.head = t.next - - // delete the current value from the map. - delete(st.transactionsMap, t.txid) - - // copy the new transaction id into the existing object. - copy(t.txid[:], txid[:]) - - // place the new entry as the last entry on the list. - t.addToList(st.head) - - // add the new entry to the map - st.transactionsMap[txid] = t - return - } - - // grab an entry from the free list ( if any ) - entry = st.free - if entry != nil { - if entry.detach() { - st.free = entry.next - } else { - st.free = nil - } - copy(entry.txid[:], txid[:]) - } else { - // the free list doesn't have an entry - allocate a new one. - entry = &shortTermCacheEntry{ - txid: txid, - } - } - if st.head == nil { - st.head = entry - entry.next = entry - entry.prev = entry - } else { - entry.addToList(st.head) - } - st.transactionsMap[txid] = entry -} - -// contained checks if the given transaction id presents in the short term cache -func (st *shortTermTransactionCache) contained(txid transactions.Txid) bool { - return st.transactionsMap[txid] != nil -} - -// reset clears the short term cache -func (st *shortTermTransactionCache) reset() { - if st.head == nil { - return - } - st.transactionsMap = make(map[transactions.Txid]*shortTermCacheEntry, st.size) - if st.free == nil { - st.free = st.head - st.head = nil - return - } - used := st.head - free := st.free - free.prev.next = used - used.prev.next = free - lastFree := free.prev - free.prev = used.prev - used.prev = lastFree - st.head = nil -} - -// contained checks if the given transaction id presents in the log term cache -func (lt *longTermTransactionCache) contained(txid transactions.Txid) bool { - for i := lt.current; i >= 0; i-- { - if lt.transactionsMap[i][txid] { - return true - } - } - for i := len(lt.transactionsMap) - 1; i > lt.current; i-- { - if lt.transactionsMap[i][txid] { - return true - } - } - return false -} - -// add a given slice of transaction IDs to the long term transaction cache, at a given timestamp. -func (lt *longTermTransactionCache) add(slice []transactions.Txid, timestamp time.Duration) { - for { - lt.timestamps[lt.current] = timestamp - availableEntries := cachedEntriesPerMap - len(lt.transactionsMap[lt.current]) - txMap := lt.transactionsMap[lt.current] - if txMap == nil { - txMap = make(map[transactions.Txid]bool, cachedEntriesPerMap) - } - if len(slice) <= availableEntries { - // just add them all. - for _, txid := range slice { - txMap[txid] = true - } - lt.transactionsMap[lt.current] = txMap - return - } - - // otherwise, add as many as we can fit - - for i := 0; i < availableEntries; i++ { - txMap[slice[i]] = true - } - lt.transactionsMap[lt.current] = txMap - - // remove the ones we've already added from the slice. - slice = slice[availableEntries:] - - // move to the next map. - lt.current = (lt.current + 1) % len(lt.transactionsMap) - - // if full, reset bucket. - if len(lt.transactionsMap[lt.current]) >= cachedEntriesPerMap || lt.transactionsMap[lt.current] == nil { - // reset. - lt.transactionsMap[lt.current] = make(map[transactions.Txid]bool, cachedEntriesPerMap) - } - } -} - -// prune the long term cache by clearing out all the cached transaction IDs maps that are dated before the given -// timestamp -func (lt *longTermTransactionCache) prune(timestamp time.Duration) { - // find the index of the first entry where the timestamp is still valid. - latestValidIndex := sort.Search(len(lt.transactionsMap), func(i int) bool { - arrayIndex := (i + lt.current + 1) % len(lt.transactionsMap) - return lt.timestamps[arrayIndex] > timestamp - }) - - // find the first non-empty map index. - firstValidIndex := sort.Search(len(lt.transactionsMap), func(i int) bool { - arrayIndex := (i + lt.current + 1) % len(lt.transactionsMap) - return lt.timestamps[arrayIndex] != time.Duration(0) - }) - - for i := firstValidIndex - 1; i < latestValidIndex; i++ { - arrayIndex := (i + lt.current + 1) % len(lt.transactionsMap) - lt.timestamps[arrayIndex] = time.Duration(0) - lt.transactionsMap[lt.current] = nil - } -} diff --git a/txnsync/transactionCache_test.go b/txnsync/transactionCache_test.go deleted file mode 100644 index daf6cb8bce..0000000000 --- a/txnsync/transactionCache_test.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "reflect" - "strconv" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/test/partitiontest" -) - -// TestTransactionCache General smoke test for the transaction cache -func TestTransactionCache(t *testing.T) { - partitiontest.PartitionTest(t) - - var txid transactions.Txid - a := makeTransactionCache(5, 10, 20) - for repeat := 0; repeat < 2; repeat++ { - // add 5 - for i := 0; i < 5; i++ { - txid[0] = byte(i) - a.add(txid) - } - - // all 5 still there - for i := 0; i < 5; i++ { - txid[0] = byte(i) - require.True(t, a.contained(txid), "txid: %v", txid[:]) - } - - // repeatedly adding existing data doesn't lose anything - txid[0] = 1 - a.add(txid) - a.add(txid) - a.add(txid) - for i := 0; i < 5; i++ { - txid[0] = byte(i) - require.True(t, a.contained(txid), "txid: %v", txid[:]) - } - - // adding a sixth forgets the first - txid[0] = 5 - a.add(txid) - for i := 1; i < 6; i++ { - txid[0] = byte(i) - require.True(t, a.contained(txid), "txid: %v", txid[:]) - } - txid[0] = 0 - require.False(t, a.contained(txid)) - - // adding a seventh forgets the third - txid[0] = 6 - a.add(txid) - for i := 3; i < 7; i++ { - txid[0] = byte(i) - require.True(t, a.contained(txid), "txid: %v", txid[:]) - } - txid[0] = 1 - require.True(t, a.contained(txid), "txid: %v", txid[:]) - txid[0] = 2 - require.False(t, a.contained(txid)) - a.reset() - } -} - -// TestTransactionCacheResetting is a simple reset testing, ensuring we know how to recycle entries from the free list. -func TestTransactionCacheResetting(t *testing.T) { - partitiontest.PartitionTest(t) - - var txid transactions.Txid - a := makeTransactionCache(5, 10, 20) - // add 5 - for i := 0; i < 5; i++ { - txid[0] = byte(i) - a.add(txid) - } - // re-add the first one again, to promote it. - txid[0] = 0 - a.add(txid) - a.reset() - // add 3 - for i := 0; i < 3; i++ { - txid[0] = byte(i) - a.add(txid) - } - a.reset() - // add 2 - for i := 0; i < 2; i++ { - txid[0] = byte(i) - a.add(txid) - } - // verify the two are there. - for i := 0; i < 2; i++ { - txid[0] = byte(i) - require.True(t, a.contained(txid), "txid: %v", txid[:]) - } -} - -// TestTransactionCacheAddSlice tests addSlice functionality of the transaction cache -func TestTransactionCacheAddSlice(t *testing.T) { - partitiontest.PartitionTest(t) - - tc := makeTransactionCache(5, 10, 20) - curTimestamp := time.Duration(0) - msgSeq := uint64(0) - slice := make([]transactions.Txid, 10) - for i := 0; i < 50; i++ { - tc.addSlice(slice, msgSeq, curTimestamp) - curTimestamp += cacheHistoryDuration / 10 - msgSeq++ - require.LessOrEqual(t, len(tc.ackPendingTxids), 11) - } - curTimestamp += cacheHistoryDuration - tc.addSlice(slice, msgSeq, curTimestamp) - require.LessOrEqual(t, len(tc.ackPendingTxids), 1) -} - -// TestAddSliceSeqReturn Tests that if the ackPendingTxIds is bigger that the msgSeq then we return -func TestAddSliceSeqReturn(t *testing.T) { - partitiontest.PartitionTest(t) - - tc := makeTransactionCache(5, 10, 20) - curTimestamp := time.Duration(cacheHistoryDuration) - msgSeq := uint64(1) - slice := make([]transactions.Txid, 10) - tc.addSlice(slice, msgSeq, curTimestamp) - - tcLen := len(tc.ackPendingTxids) - - tc.addSlice(slice, 0, curTimestamp) - require.Equal(t, tcLen, len(tc.ackPendingTxids)) - msgSeq++ - tc.addSlice(slice, msgSeq, curTimestamp+(cacheHistoryDuration/10)) - require.Equal(t, tcLen+1, len(tc.ackPendingTxids)) - -} - -// TestAddSliceCapacity tests that we correctly copy the ackPendingTxids when at capacity -func TestAddSliceCapacity(t *testing.T) { - partitiontest.PartitionTest(t) - tc := makeTransactionCache(5, 10, 5) - - curTimestamp := time.Duration(0) - msgSeq := uint64(0) - slice := make([]transactions.Txid, 10) - for i := 0; i < 50; i++ { - tc.addSlice(slice, msgSeq, curTimestamp) - curTimestamp += cacheHistoryDuration / 10 - msgSeq++ - require.LessOrEqual(t, len(tc.ackPendingTxids), 6) - } - -} - -func (ce *shortTermCacheEntry) getLength() int { - length := 0 - if ce == nil { - return length - } - length++ - cur := ce - for ; cur != nil && ce != cur.next; cur = cur.next { - length++ - } - return length -} - -// TestShortTermCacheReset tests that the short term cache is reset -func TestShortTermCacheReset(t *testing.T) { - partitiontest.PartitionTest(t) - tc := makeTransactionCache(5, 10, 5) - require.Nil(t, tc.shortTermCache.head) - require.Nil(t, tc.shortTermCache.free) - require.Equal(t, 0, len(tc.shortTermCache.transactionsMap)) - - var txid transactions.Txid - for i := 0; i < 5; i++ { - txid[0] = byte(i) - tc.add(txid) - } - require.Equal(t, 5, tc.shortTermCache.head.getLength()) - - require.Nil(t, tc.shortTermCache.free) - require.NotNil(t, tc.shortTermCache.head) - require.Equal(t, 5, len(tc.shortTermCache.transactionsMap)) - - tc.reset() - require.Equal(t, 0, tc.shortTermCache.head.getLength()) - require.Equal(t, 5, tc.shortTermCache.free.getLength()) - - require.Nil(t, tc.shortTermCache.head) - require.NotNil(t, tc.shortTermCache.free) - require.Equal(t, 0, len(tc.shortTermCache.transactionsMap)) - - for i := 0; i < 2; i++ { - txid[0] = byte(i) - tc.add(txid) - } - - tc.reset() - require.Equal(t, 5, tc.shortTermCache.free.getLength()) -} - -// TestCacheAcknowledge tests that the acknowledge function correctly adds entries -func TestCacheAcknowledge(t *testing.T) { - partitiontest.PartitionTest(t) - tc := makeTransactionCache(5, 10, 5) - - curTimestamp := time.Duration(0) - msgSeq := uint64(0) - slice := make([]transactions.Txid, 10) - for i := 0; i < 5; i++ { - tc.addSlice(slice, msgSeq, curTimestamp) - curTimestamp += cacheHistoryDuration / 20 - msgSeq++ - require.LessOrEqual(t, len(tc.ackPendingTxids), 5) - } - - require.Equal(t, 1, len(tc.longTermCache.transactionsMap)) - require.Equal(t, 0, tc.longTermCache.current) - - // The 10 is purposely past the range for the checking - seqs := []uint64{10, 1, 2, 3} - tc.acknowledge(seqs) - require.Equal(t, 2, len(tc.ackPendingTxids)) - require.Equal(t, uint64(0), tc.ackPendingTxids[0].seq) - require.Equal(t, uint64(4), tc.ackPendingTxids[1].seq) - -} - -// TestCacheAddAndContains tests adding to the long term cache and if we can test if it contains it -func TestCacheAddAndContains(t *testing.T) { - partitiontest.PartitionTest(t) - tc := makeTransactionCache(5, 2*cachedEntriesPerMap, 5) - - // We want two scenarios: Smaller than cachedEntriesPerMap and bigger - smallSlice := make([]transactions.Txid, cachedEntriesPerMap/2) - - // Fill with random numbers - for i := 0; i < cachedEntriesPerMap/2; i++ { - tx := &smallSlice[i] - tx[0] = byte((i + 37) % 255) - tx[1] = byte((i + 2) % 255) - tx[2] = byte((i + 42) % 255) - tx[3] = byte((i + 23) % 255) - } - - bigSlice := make([]transactions.Txid, 2*cachedEntriesPerMap) - - // Fill with sequential numbers - for i := 0; i < 2*cachedEntriesPerMap; i++ { - tx := &bigSlice[i] - bs := []byte(strconv.Itoa(i)) - d := crypto.Hash(bs) - - *tx = transactions.Txid(d) - } - - curTimestamp := time.Duration(0) - - ltc := &tc.longTermCache - require.Equal(t, 2, len(ltc.transactionsMap)) - - require.Equal(t, 0, ltc.current) - - ltc.add(smallSlice, curTimestamp) - - require.Equal(t, 0, ltc.current) - - sliceMap := make(map[transactions.Txid]bool) - for _, txid := range smallSlice { - sliceMap[txid] = true - } - - require.True(t, reflect.DeepEqual(sliceMap, ltc.transactionsMap[0])) - - ltc.add(bigSlice, curTimestamp) - - // Given that we already added small slice, we should "overflow" - // and expect that the transaction map contains a modified version of big slice - - slice := bigSlice - for { - availableEntries := cachedEntriesPerMap - len(sliceMap) - if len(slice) <= availableEntries { - for _, txid := range slice { - sliceMap[txid] = true - } - break - } - - for i := 0; i < availableEntries; i++ { - sliceMap[slice[i]] = true - } - - slice = slice[availableEntries:] - - if len(sliceMap) >= cachedEntriesPerMap { - sliceMap = make(map[transactions.Txid]bool) - } - - } - - require.Equal(t, 0, ltc.current) - require.True(t, reflect.DeepEqual(sliceMap, ltc.transactionsMap[0])) - - bs := []byte(strconv.Itoa(cachedEntriesPerMap)) - d := crypto.Hash(bs) - targetTxID := transactions.Txid(d) - - require.True(t, ltc.contained(targetTxID)) - -} diff --git a/txnsync/txngroups.go b/txnsync/txngroups.go deleted file mode 100644 index e1b82cc5c8..0000000000 --- a/txnsync/txngroups.go +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "errors" - "fmt" - - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/util/compress" -) - -// Deflate performance constants measured by BenchmarkTxnGroupCompression -const estimatedDeflateCompressionSpeed = 121123260.0 // bytes per second of how fast Deflate compresses data -const estimatedDeflateCompressionGains = 0.32 // fraction of data reduced by Deflate on txnsync msgs - -const minEncodedTransactionGroupsCompressionThreshold = 1000 - -const maxCompressionRatio = 20 // don't allow more than 95% compression - -func (s *syncState) encodeTransactionGroups(inTxnGroups []pooldata.SignedTxGroup, dataExchangeRate uint64) (packedTransactionGroups, error) { - txnCount := 0 - for _, txGroup := range inTxnGroups { - txnCount += len(txGroup.Transactions) - } - stub := txGroupsEncodingStub{ - TotalTransactionsCount: uint64(txnCount), - TransactionGroupCount: uint64(len(inTxnGroups)), - TransactionGroupSizes: make([]byte, 0, len(inTxnGroups)), - } - - bitmaskLen := bytesNeededBitmask(int(stub.TotalTransactionsCount)) - index := 0 - for _, txGroup := range inTxnGroups { - if len(txGroup.Transactions) > 1 { - for _, txn := range txGroup.Transactions { - if err := stub.deconstructSignedTransaction(index, &txn); err != nil { - return packedTransactionGroups{}, fmt.Errorf("failed to encodeTransactionGroups: %w", err) - } - index++ - } - stub.TransactionGroupSizes = append(stub.TransactionGroupSizes, byte(len(txGroup.Transactions)-1)) - } - } - compactNibblesArray(&stub.TransactionGroupSizes) - for _, txGroup := range inTxnGroups { - if len(txGroup.Transactions) == 1 { - for _, txn := range txGroup.Transactions { - if !txn.Txn.Group.MsgIsZero() { - if len(stub.BitmaskGroup) == 0 { - stub.BitmaskGroup = make(bitmask, bitmaskLen) - } - stub.BitmaskGroup.setBit(index) - } - if err := stub.deconstructSignedTransaction(index, &txn); err != nil { - return packedTransactionGroups{}, fmt.Errorf("failed to encodeTransactionGroups: %w", err) - } - index++ - } - } - } - stub.finishDeconstructSignedTransactions() - - encoded := stub.MarshalMsg(getMessageBuffer()) - - // check if time saved by compression: estimatedDeflateCompressionGains * len(msg) / dataExchangeRate - // is greater than by time spent during compression: len(msg) / estimatedDeflateCompressionSpeed - if len(encoded) > minEncodedTransactionGroupsCompressionThreshold && float32(dataExchangeRate) < (estimatedDeflateCompressionGains*estimatedDeflateCompressionSpeed) { - compressedBytes, compressionFormat := s.compressTransactionGroupsBytes(encoded) - if compressionFormat != compressionFormatNone { - packedGroups := packedTransactionGroups{ - Bytes: compressedBytes, - CompressionFormat: compressionFormat, - LenDecompressedBytes: uint64(len(encoded)), - } - releaseMessageBuffer(encoded) - return packedGroups, nil - } - } - - return packedTransactionGroups{ - Bytes: encoded, - CompressionFormat: compressionFormatNone, - }, nil -} - -func (s *syncState) compressTransactionGroupsBytes(uncompressedData []byte) ([]byte, byte) { - b := getMessageBuffer() - if cap(b) < len(uncompressedData) { - releaseMessageBuffer(b) - b = make([]byte, 0, len(uncompressedData)) - } - _, compressedData, err := compress.Compress(uncompressedData, b, 1) - if err != nil { - if errors.Is(err, compress.ErrShortBuffer) { - s.log.Debugf("compression had negative effect, made message bigger: original msg length: %d", len(uncompressedData)) - } else { - s.log.Warnf("failed to compress %d bytes txnsync msg: %v", len(uncompressedData), err) - } - releaseMessageBuffer(b) - return uncompressedData, compressionFormatNone - } - if len(uncompressedData) > len(compressedData)*maxCompressionRatio { - s.log.Infof("compression exceeded compression ratio: compressed data len: %d", len(compressedData)) - releaseMessageBuffer(b) - return uncompressedData, compressionFormatNone - } else if len(uncompressedData) <= len(compressedData) { - // compression wasn't effective and ended up spending more data. - releaseMessageBuffer(b) - return uncompressedData, compressionFormatNone - } - return compressedData, compressionFormatDeflate -} - -func decodeTransactionGroups(ptg packedTransactionGroups, genesisID string, genesisHash crypto.Digest) (txnGroups []pooldata.SignedTxGroup, err error) { - data := ptg.Bytes - if len(data) == 0 { - return nil, nil - } - - switch ptg.CompressionFormat { - case compressionFormatNone: - case compressionFormatDeflate: - data, err = decompressTransactionGroupsBytes(data, ptg.LenDecompressedBytes) - if err != nil { - return - } - defer releaseMessageBuffer(data) - default: - return nil, fmt.Errorf("invalid compressionFormat, %d", ptg.CompressionFormat) - } - var stub txGroupsEncodingStub - _, err = stub.UnmarshalMsg(data) - if err != nil { - return nil, err - } - - if stub.TransactionGroupCount > uint64(maxEncodedTransactionGroups) { - return nil, errors.New("invalid TransactionGroupCount") - } - - if stub.TotalTransactionsCount > uint64(maxEncodedTransactionGroups*config.MaxTxGroupSize) { - return nil, errors.New("invalid TotalTransactionsCount") - } - - stx := make([]transactions.SignedTxn, stub.TotalTransactionsCount) - - err = stub.reconstructSignedTransactions(stx, genesisID, genesisHash) - if err != nil { - return nil, err - } - - txnGroups = make([]pooldata.SignedTxGroup, stub.TransactionGroupCount) - for txnCounter, txnGroupIndex := 0, 0; txnCounter < int(stub.TotalTransactionsCount); txnGroupIndex++ { - size := 1 - if txnGroupIndex < len(stub.TransactionGroupSizes)*2 { - nibble, err := getNibble(stub.TransactionGroupSizes, txnGroupIndex) - if err != nil { - return nil, err - } - size = int(nibble) + 1 - } - txnGroups[txnGroupIndex].Transactions = stx[txnCounter : txnCounter+size] - txnCounter += size - } - - err = addGroupHashes(txnGroups, int(stub.TotalTransactionsCount), stub.BitmaskGroup) - if err != nil { - return nil, err - } - - return txnGroups, nil -} - -func decompressTransactionGroupsBytes(data []byte, lenDecompressedBytes uint64) (decoded []byte, err error) { - compressionRatio := lenDecompressedBytes / uint64(len(data)) // data should have been compressed between 0 and 95% - if lenDecompressedBytes > uint64(maxEncodedTransactionGroupBytes) || compressionRatio <= 0 || compressionRatio >= maxCompressionRatio { - return nil, fmt.Errorf("invalid lenDecompressedBytes: %d, len(data): %d", lenDecompressedBytes, len(data)) - } - - out := getMessageBuffer() - if uint64(cap(out)) < lenDecompressedBytes { - releaseMessageBuffer(out) - out = make([]byte, 0, lenDecompressedBytes) - } - - decoded, err = compress.Decompress(data, out) - if err != nil { - releaseMessageBuffer(out) - decoded = nil - return - } - if uint64(len(decoded)) != lenDecompressedBytes { - releaseMessageBuffer(out) - decoded = nil - return nil, fmt.Errorf("lenDecompressedBytes didn't match: expected %d, actual %d", lenDecompressedBytes, len(decoded)) - } - return -} - -func releaseEncodedTransactionGroups(buffer []byte) { - if buffer == nil { - return - } - - releaseMessageBuffer(buffer) -} diff --git a/txnsync/txngroups_test.go b/txnsync/txngroups_test.go deleted file mode 100644 index e957cd7a0c..0000000000 --- a/txnsync/txngroups_test.go +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package txnsync - -import ( - "context" - "database/sql" - "flag" - "io" - "io/ioutil" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/pooldata" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/ledger/ledgercore" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/rpcs" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/go-algorand/util/db" -) - -var blockDBFilename = flag.String("db", "", "Location of block db") -var startRound = flag.Int("start", 0, "Starting round") -var endRound = flag.Int("end", 10, "Ending round") - -func TestNibble(t *testing.T) { - partitiontest.PartitionTest(t) - - var b []byte - for i := 0; i < 10; i++ { - b = append(b, byte(i)) - } - compactNibblesArray(&b) - for i := 0; i < 10; i++ { - val, err := getNibble(b, i) - require.NoError(t, err) - require.Equal(t, byte(i), val) - } -} - -// old encoding method -func encodeTransactionGroupsOld(inTxnGroups []pooldata.SignedTxGroup) []byte { - stub := txGroupsEncodingStubOld{ - TxnGroups: make([]txnGroups, len(inTxnGroups)), - } - for i := range inTxnGroups { - stub.TxnGroups[i] = txnGroups(inTxnGroups[i].Transactions) - } - - return stub.MarshalMsg(protocol.GetEncodingBuf()[:0]) -} - -// old decoding method -func decodeTransactionGroupsOld(bytes []byte) (txnGroups []pooldata.SignedTxGroup, err error) { - if len(bytes) == 0 { - return nil, nil - } - var stub txGroupsEncodingStubOld - _, err = stub.UnmarshalMsg(bytes) - if err != nil { - return nil, err - } - txnGroups = make([]pooldata.SignedTxGroup, len(stub.TxnGroups)) - for i := range stub.TxnGroups { - txnGroups[i].Transactions = pooldata.SignedTxnSlice(stub.TxnGroups[i]) - } - return txnGroups, nil -} - -func TestTxnGroupEncodingSmall(t *testing.T) { - partitiontest.PartitionTest(t) - - genesisHash := crypto.Hash([]byte("gh")) - genesisID := "gID" - - inTxnGroups := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("2"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: basics.Address(crypto.Hash([]byte("4"))), - Amount: basics.MicroAlgos{Raw: 1000}, - }, - }, - Sig: crypto.Signature{1}, - }, - }, - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - GenesisID: genesisID, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: basics.Address(crypto.Hash([]byte("2"))), - Amount: basics.MicroAlgos{Raw: 1000}, - }, - }, - Sig: crypto.Signature{2}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.KeyRegistrationTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - GenesisID: genesisID, - }, - }, - Sig: crypto.Signature{3}, - }, - }, - }, - pooldata.SignedTxGroup{ - Transactions: []transactions.SignedTxn{ - { - Txn: transactions.Transaction{ - Type: protocol.AssetConfigTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - Fee: basics.MicroAlgos{Raw: 100}, - GenesisHash: genesisHash, - }, - }, - Sig: crypto.Signature{4}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.AssetFreezeTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - }, - }, - Sig: crypto.Signature{5}, - }, - { - Txn: transactions.Transaction{ - Type: protocol.CompactCertTx, - Header: transactions.Header{ - Sender: basics.Address(crypto.Hash([]byte("1"))), - GenesisHash: genesisHash, - }, - }, - Msig: crypto.MultisigSig{Version: 1}, - }, - }, - }, - } - err := addGroupHashes(inTxnGroups, 6, []byte{1}) - require.NoError(t, err) - var s syncState - ptg, err := s.encodeTransactionGroups(inTxnGroups, 1000000000) - require.NoError(t, err) - require.Equal(t, ptg.CompressionFormat, compressionFormatNone) - out, err := decodeTransactionGroups(ptg, genesisID, genesisHash) - require.NoError(t, err) - require.ElementsMatch(t, inTxnGroups, out) -} - -// txnGroupsData fetches a sample dataset of txns, specify numBlocks up to 969 -func txnGroupsData(numBlocks int) (txnGroups []pooldata.SignedTxGroup, genesisID string, genesisHash crypto.Digest, err error) { - dat, err := ioutil.ReadFile("../test/testdata/mainnetblocks") - if err != nil { - return - } - dec := protocol.NewDecoderBytes(dat) - blocksData := make([]rpcs.EncodedBlockCert, numBlocks) - for i := 0; i < len(blocksData); i++ { - err = dec.Decode(&blocksData[i]) - if err == io.EOF { - break - } - if err != nil { - return - } - } - - for _, blockData := range blocksData { - block := blockData.Block - genesisID = block.GenesisID() - genesisHash = block.GenesisHash() - var payset [][]transactions.SignedTxnWithAD - payset, err = block.DecodePaysetGroups() - if err != nil { - return - } - for _, txns := range payset { - var txnGroup pooldata.SignedTxGroup - for _, txn := range txns { - txnGroup.Transactions = append(txnGroup.Transactions, txn.SignedTxn) - } - txnGroups = append(txnGroups, txnGroup) - } - } - return -} - -func TestTxnGroupEncodingLarge(t *testing.T) { - partitiontest.PartitionTest(t) - - txnGroups, genesisID, genesisHash, err := txnGroupsData(500) - require.NoError(t, err) - - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 0) - require.NoError(t, err) - require.Equal(t, ptg.CompressionFormat, compressionFormatDeflate) - out, err := decodeTransactionGroups(ptg, genesisID, genesisHash) - require.NoError(t, err) - require.ElementsMatch(t, txnGroups, out) - - encodedGroupsBytes := encodeTransactionGroupsOld(txnGroups) - out, err = decodeTransactionGroupsOld(encodedGroupsBytes) - require.NoError(t, err) - require.ElementsMatch(t, txnGroups, out) - - // check dataset - count := make(map[protocol.TxType]int) - sigs := 0 - msigs := 0 - lsigs := 0 - for _, txg := range txnGroups { - for _, txn := range txg.Transactions { - count[txn.Txn.Type]++ - if !txn.Sig.MsgIsZero() { - sigs++ - } - if !txn.Msig.MsgIsZero() { - msigs++ - } - if !txn.Lsig.MsgIsZero() { - lsigs++ - } - } - } - require.Equal(t, 2, len(count)) - require.Equal(t, 9834, count["axfer"]) - require.Equal(t, 850, count["pay"]) - require.Equal(t, 10678, sigs) - require.Equal(t, 6, msigs) - require.Equal(t, 0, lsigs) -} - -func BenchmarkTxnGroupEncoding(b *testing.B) { - txnGroups, _, _, err := txnGroupsData(4) - require.NoError(b, err) - var size int - var s syncState - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - ptg, err := s.encodeTransactionGroups(txnGroups, 1000000000) - require.NoError(b, err) - size = len(ptg.Bytes) - releaseEncodedTransactionGroups(ptg.Bytes) - } - - b.ReportMetric(float64(size), "encodedDataBytes") -} - -func BenchmarkTxnGroupCompression(b *testing.B) { - txnGroups, _, _, err := txnGroupsData(4) - require.NoError(b, err) - var size int - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 1000000000) - require.NoError(b, err) - require.Equal(b, ptg.CompressionFormat, compressionFormatNone) - - b.ReportAllocs() - b.ResetTimer() - loopStartTime := time.Now() - for i := 0; i < b.N; i++ { - compressedGroupBytes, compressionFormat := s.compressTransactionGroupsBytes(ptg.Bytes) - require.Equal(b, compressionFormat, compressionFormatDeflate) - size = len(compressedGroupBytes) - } - loopDuration := time.Since(loopStartTime) - b.StopTimer() - b.ReportMetric(float64(len(ptg.Bytes)*b.N)/loopDuration.Seconds(), "estimatedGzipCompressionSpeed") - b.ReportMetric(float64(len(ptg.Bytes)-size)/float64(len(ptg.Bytes)), "estimatedGzipCompressionGains") -} - -func BenchmarkTxnGroupDecoding(b *testing.B) { - txnGroups, genesisID, genesisHash, err := txnGroupsData(4) - require.NoError(b, err) - - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 1000000000) - require.NoError(b, err) - require.Equal(b, ptg.CompressionFormat, compressionFormatNone) - require.NoError(b, err) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = decodeTransactionGroups(ptg, genesisID, genesisHash) - require.NoError(b, err) - } -} - -func BenchmarkTxnGroupDecompression(b *testing.B) { - txnGroups, _, _, err := txnGroupsData(4) - require.NoError(b, err) - - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 0) - require.NoError(b, err) - require.Equal(b, ptg.CompressionFormat, compressionFormatDeflate) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = decompressTransactionGroupsBytes(ptg.Bytes, ptg.LenDecompressedBytes) - require.NoError(b, err) - } -} - -func BenchmarkTxnGroupEncodingOld(b *testing.B) { - txnGroups, _, _, err := txnGroupsData(4) - require.NoError(b, err) - var encodedGroupsBytes []byte - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - encodedGroupsBytes = encodeTransactionGroupsOld(txnGroups) - releaseEncodedTransactionGroups(encodedGroupsBytes) - } - - b.ReportMetric(float64(len(encodedGroupsBytes)), "encodedDataBytes") -} - -func BenchmarkTxnGroupDecodingOld(b *testing.B) { - txnGroups, _, _, err := txnGroupsData(4) - require.NoError(b, err) - - encodedGroupsBytes := encodeTransactionGroupsOld(txnGroups) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = decodeTransactionGroupsOld(encodedGroupsBytes) - require.NoError(b, err) - } -} - -// TestTxnGroupEncodingReflection generates random -// txns of each type using reflection -func TestTxnGroupEncodingReflection(t *testing.T) { - partitiontest.PartitionTest(t) - - for i := 0; i < 10; i++ { - v0, err := protocol.RandomizeObject(&transactions.SignedTxn{}) - require.NoError(t, err) - stx, ok := v0.(*transactions.SignedTxn) - require.True(t, ok) - - var txns []transactions.SignedTxn - for _, txType := range protocol.TxnTypes { - txn := *stx - txn.Txn.PaymentTxnFields = transactions.PaymentTxnFields{} - txn.Txn.KeyregTxnFields = transactions.KeyregTxnFields{} - txn.Txn.AssetConfigTxnFields = transactions.AssetConfigTxnFields{} - txn.Txn.AssetTransferTxnFields = transactions.AssetTransferTxnFields{} - txn.Txn.AssetFreezeTxnFields = transactions.AssetFreezeTxnFields{} - txn.Txn.ApplicationCallTxnFields = transactions.ApplicationCallTxnFields{} - txn.Txn.CompactCertTxnFields = transactions.CompactCertTxnFields{} - txn.Txn.Type = txType - txn.Lsig.Logic = []byte("logic") - switch i % 3 { - case 0: // only have normal sig - txn.Msig = crypto.MultisigSig{} - txn.Lsig = transactions.LogicSig{} - case 1: // only have multi sig - txn.Sig = crypto.Signature{} - txn.Lsig = transactions.LogicSig{} - case 2: // only have logic sig - txn.Msig = crypto.MultisigSig{} - txn.Sig = crypto.Signature{} - } - switch txType { - case protocol.UnknownTx: - continue - case protocol.PaymentTx: - v0, err := protocol.RandomizeObject(&txn.Txn.PaymentTxnFields) - require.NoError(t, err) - PaymentTxnFields, ok := v0.(*transactions.PaymentTxnFields) - require.True(t, ok) - txn.Txn.PaymentTxnFields = *PaymentTxnFields - case protocol.KeyRegistrationTx: - v0, err := protocol.RandomizeObject(&txn.Txn.KeyregTxnFields) - require.NoError(t, err) - KeyregTxnFields, ok := v0.(*transactions.KeyregTxnFields) - require.True(t, ok) - txn.Txn.KeyregTxnFields = *KeyregTxnFields - case protocol.AssetConfigTx: - v0, err := protocol.RandomizeObject(&txn.Txn.AssetConfigTxnFields) - require.NoError(t, err) - AssetConfigTxnFields, ok := v0.(*transactions.AssetConfigTxnFields) - require.True(t, ok) - txn.Txn.AssetConfigTxnFields = *AssetConfigTxnFields - case protocol.AssetTransferTx: - v0, err := protocol.RandomizeObject(&txn.Txn.AssetTransferTxnFields) - require.NoError(t, err) - AssetTransferTxnFields, ok := v0.(*transactions.AssetTransferTxnFields) - require.True(t, ok) - txn.Txn.AssetTransferTxnFields = *AssetTransferTxnFields - case protocol.AssetFreezeTx: - v0, err := protocol.RandomizeObject(&txn.Txn.AssetFreezeTxnFields) - require.NoError(t, err) - AssetFreezeTxnFields, ok := v0.(*transactions.AssetFreezeTxnFields) - require.True(t, ok) - txn.Txn.AssetFreezeTxnFields = *AssetFreezeTxnFields - case protocol.ApplicationCallTx: - v0, err := protocol.RandomizeObject(&txn.Txn.ApplicationCallTxnFields) - require.NoError(t, err) - ApplicationCallTxnFields, ok := v0.(*transactions.ApplicationCallTxnFields) - require.True(t, ok) - txn.Txn.ApplicationCallTxnFields = *ApplicationCallTxnFields - txn.Txn.ApplicationCallTxnFields.OnCompletion = 1 - case protocol.CompactCertTx: - v0, err := protocol.RandomizeObject(&txn.Txn.CompactCertTxnFields) - require.NoError(t, err) - CompactCertTxnFields, ok := v0.(*transactions.CompactCertTxnFields) - require.True(t, ok) - txn.Txn.CompactCertTxnFields = *CompactCertTxnFields - default: - require.Fail(t, "unsupported txntype for txnsync msg encoding") - } - txn.Txn.Group = crypto.Digest{} - txns = append(txns, txn) - } - txnGroups := []pooldata.SignedTxGroup{ - pooldata.SignedTxGroup{ - Transactions: txns, - }, - } - err = addGroupHashes(txnGroups, len(txns), []byte{1}) - require.NoError(t, err) - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 0) - require.NoError(t, err) - out, err := decodeTransactionGroups(ptg, stx.Txn.GenesisID, stx.Txn.GenesisHash) - require.NoError(t, err) - require.ElementsMatch(t, txnGroups, out) - } -} - -// pass in flag -db to specify db, start round, end round -func TestTxnGroupEncodingArchival(t *testing.T) { - partitiontest.PartitionTest(t) - - if *blockDBFilename == "" { - t.Skip("no archival node db was provided") - } - blockDBs, err := db.OpenPair(*blockDBFilename, false) - require.NoError(t, err) - for r := basics.Round(*startRound); r < basics.Round(*endRound); r++ { - var block bookkeeping.Block - err = blockDBs.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { - var buf []byte - err = tx.QueryRow("SELECT blkdata FROM blocks WHERE rnd=?", r).Scan(&buf) - if err != nil { - if err == sql.ErrNoRows { - err = ledgercore.ErrNoEntry{Round: r} - } - return err - } - return protocol.Decode(buf, &block) - }) - require.NoError(t, err) - - var txnGroups []pooldata.SignedTxGroup - genesisID := block.GenesisID() - genesisHash := block.GenesisHash() - var payset [][]transactions.SignedTxnWithAD - payset, err := block.DecodePaysetGroups() - require.NoError(t, err) - for _, txns := range payset { - var txnGroup pooldata.SignedTxGroup - for _, txn := range txns { - txnGroup.Transactions = append(txnGroup.Transactions, txn.SignedTxn) - } - txnGroups = append(txnGroups, txnGroup) - } - - var s syncState - ptg, err := s.encodeTransactionGroups(txnGroups, 0) - require.NoError(t, err) - out, err := decodeTransactionGroups(ptg, genesisID, genesisHash) - require.NoError(t, err) - require.ElementsMatch(t, txnGroups, out) - } -} diff --git a/util/bloom/bloom.go b/util/bloom/bloom.go index cee316e324..eeffc88eff 100644 --- a/util/bloom/bloom.go +++ b/util/bloom/bloom.go @@ -118,31 +118,22 @@ func BinaryMarshalLength(numElements int, falsePositiveRate float64) int64 { return filterBytes + 8 // adding 8 to match 4 prefix array, plus 4 bytes for the numHashes uint32 } -// UnmarshalBinary implements encoding.BinaryUnmarshaller interface -func (f *Filter) UnmarshalBinary(data []byte) error { +// UnmarshalBinary restores the state of the filter from raw data +func UnmarshalBinary(data []byte) (*Filter, error) { + f := &Filter{} if len(data) <= 8 { - return errors.New("short data") + return nil, errors.New("short data") } f.numHashes = binary.BigEndian.Uint32(data[0:4]) if f.numHashes > maxHashes { - return errors.New("too many hashes") + return nil, errors.New("too many hashes") } copy(f.prefix[:], data[4:8]) f.data = data[8:] f.preimageStagingBuffer = make([]byte, len(f.prefix), len(f.prefix)+32) f.hashStagingBuffer = make([]uint32, f.numHashes+3) copy(f.preimageStagingBuffer, f.prefix[:]) - return nil -} - -// UnmarshalBinary restores the state of the filter from raw data -func UnmarshalBinary(data []byte) (*Filter, error) { - f := &Filter{} - err := f.UnmarshalBinary(data) - if err != nil { - f = nil - } - return f, err + return f, nil } // MarshalJSON defines how this filter should be encoded to JSON diff --git a/util/bloom/bloom_test.go b/util/bloom/bloom_test.go index 12799e6a34..2380b8d877 100644 --- a/util/bloom/bloom_test.go +++ b/util/bloom/bloom_test.go @@ -56,7 +56,7 @@ func TestOptimal(t *testing.T) { numFP := []int{100, 25, 5} if testing.Short() { - numElementsCases = []int{2000, 20000} + numElementsCases = []int{2000, 200000} fpRateCases = []float64{0.001, 0.00001} numFP = []int{100, 25} } @@ -99,7 +99,6 @@ func closeEnough(a, b, maxerr float64) (bool, float64) { } // based on "github.com/willf/bloom" -// Changes here might need to be replicated to xor_test.go estimateFalsePositiveRateXor() func (f *Filter) estimateFalsePositiveRate(numAdded uint32, numFP int) float64 { x := make([]byte, 4) for i := uint32(0); i < numAdded; i++ { @@ -183,21 +182,18 @@ func TestMarshalJSON(t *testing.T) { } } -const largeFilterElements = 150000 - -// BenchmarkCreateLargeBloomFilter should have the same structure as xor_test.go BenchmarkCreateLargeXorFilter -func BenchmarkCreateLargeBloomFilter(b *testing.B) { +func BenchmarkCreateLargeFilter(b *testing.B) { // dialing mu=25000; 3 servers; so each mailbox is 75000 real and 75000 noise // for a total of 150000 elements in the dialing bloom filter + numElements := 150000 for i := 0; i < b.N; i++ { - numBits, numHashes := Optimal(largeFilterElements, 1e-10) + numBits, numHashes := Optimal(numElements, 1e-10) f := New(numBits, numHashes, 1234) x := make([]byte, 4) - for i := uint32(0); i < uint32(largeFilterElements); i++ { + for i := uint32(0); i < uint32(numElements); i++ { binary.BigEndian.PutUint32(x, i) f.Set(x) } - f.MarshalBinary() } } @@ -355,26 +351,24 @@ func BenchmarkBloomFilterSet(b *testing.B) { } } -const filterTestElements = 1000000 - -// See also BenchmarkXorFilterTest func BenchmarkBloomFilterTest(b *testing.B) { - sizeBits, numHashes := Optimal(filterTestElements, 0.01) + bfElements := 1000000 + sizeBits, numHashes := Optimal(bfElements, 0.01) prefix := uint32(0) bf := New(sizeBits, numHashes, prefix) - dataset := make([][]byte, filterTestElements) - for n := 0; n < filterTestElements; n++ { + dataset := make([][]byte, bfElements) + for n := 0; n < bfElements; n++ { hash := crypto.Hash([]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}) dataset[n] = hash[:] } // set half of them. - for n := 0; n < filterTestElements/2; n++ { + for n := 0; n < bfElements/2; n++ { bf.Set(dataset[n]) } b.ResetTimer() for x := 0; x < b.N; x++ { - bf.Test(dataset[x%filterTestElements]) + bf.Test(dataset[x%bfElements]) } } diff --git a/util/bloom/generic.go b/util/bloom/generic.go deleted file mode 100644 index 991edb5aa2..0000000000 --- a/util/bloom/generic.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package bloom - -// GenericFilter is the interface for either bloom.Filter or bloom.XorFilter -type GenericFilter interface { - // The input x is expected to be a slice with a length of 8 bytes or more. - Set(x []byte) - // The input x is expected to be a slice with a length of 8 bytes or more. - Test(x []byte) bool - MarshalBinary() ([]byte, error) - UnmarshalBinary(data []byte) error -} diff --git a/util/bloom/xor.go b/util/bloom/xor.go deleted file mode 100644 index b79dbfa5fb..0000000000 --- a/util/bloom/xor.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package bloom - -import ( - "encoding/binary" - "encoding/json" - "errors" - - "github.com/algorand/xorfilter" -) - -// XorBuilder is a local alias for xorfilter.Builder -type XorBuilder = xorfilter.Builder - -// XorFilter is a faster more efficient alternative to a Bloom filter -// An XorFilter object can be used as is or with optional adittional setup. -type XorFilter struct { - xor *xorfilter.Xor32 - holding []uint64 - - b *XorBuilder -} - -// NewXor returns an XorFilter with an internal map created with a size hint and an optional *XorBuilder (may be nil) -// The Builder is not thread safe and should only be used by one thread at a time. -func NewXor(hint int, builder *XorBuilder) *XorFilter { - return &XorFilter{ - b: builder, - holding: make([]uint64, 0, hint), - } -} - -// Set adds the value to the filter. -func (xf *XorFilter) Set(x []byte) { - k := binary.BigEndian.Uint64(x) - xf.holding = append(xf.holding, k) -} - -// Test checks whether x is present in the filter. -// May return (rare) erroneous true values, but false is precise. -func (xf *XorFilter) Test(x []byte) bool { - k := binary.BigEndian.Uint64(x) - if xf.xor != nil { - return xf.xor.Contains(k) - } - return false -} - -const sizeofInt32 = 4 - -// MarshalBinary implements encoding.BinaryMarshaller interface -func (xf *XorFilter) MarshalBinary() ([]byte, error) { - if len(xf.holding) != 0 { - var err error - if xf.b != nil { - xf.xor, err = xf.b.Populate32(xf.holding) - } else { - xf.xor, err = xorfilter.Populate32(xf.holding) - } - if err != nil { - return nil, err - } - } - if xf.xor == nil || (len(xf.xor.Fingerprints) == 0) { - // TODO: some other encoding for empty set? - return nil, nil - } - out := make([]byte, binary.MaxVarintLen64+binary.MaxVarintLen32+binary.MaxVarintLen32+(len(xf.xor.Fingerprints)*sizeofInt32)) - pos := 0 - pos += binary.PutUvarint(out[pos:], xf.xor.Seed) - pos += binary.PutUvarint(out[pos:], uint64(xf.xor.BlockLength)) - pos += binary.PutUvarint(out[pos:], uint64(len(xf.xor.Fingerprints))) - for _, v := range xf.xor.Fingerprints { - binary.LittleEndian.PutUint32(out[pos:], v) - pos += sizeofInt32 - } - out = out[:pos] - return out, nil -} - -// ErrBadBinary is returned when UnmarshalBinary fails -var ErrBadBinary = errors.New("bad XorFilter binary") - -// TODO: make this an option to UnmarshalBinary, or a settable global, ... -const maxFingerprints = 1000000 - -// UnmarshalBinary implements encoding.BinaryUnmarshaller interface -func (xf *XorFilter) UnmarshalBinary(data []byte) error { - pos := 0 - var dp int - xor := new(xorfilter.Xor32) - xor.Seed, dp = binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - pos += dp - blockLength, dp := binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - xor.BlockLength = uint32(blockLength) - pos += dp - lenFingerprints, dp := binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - pos += dp - if lenFingerprints > 0 { - if lenFingerprints > maxFingerprints { - return ErrBadBinary - } - if (lenFingerprints * sizeofInt32) > uint64(len(data)-pos) { - return ErrBadBinary - } - xor.Fingerprints = make([]uint32, lenFingerprints) - for i := 0; i < int(lenFingerprints); i++ { - xor.Fingerprints[i] = binary.LittleEndian.Uint32(data[pos:]) - pos += sizeofInt32 - } - xf.xor = xor - } else { - xf.xor = nil - } - return nil -} - -// MarshalJSON implements encoding/json.Marshaller interface -func (xf *XorFilter) MarshalJSON() ([]byte, error) { - data, err := xf.MarshalBinary() - if err != nil { - return nil, err - } - return json.Marshal(data) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler interface -func (xf *XorFilter) UnmarshalJSON(data []byte) error { - var blob []byte - err := json.Unmarshal(data, &blob) - if err != nil { - return err - } - return xf.UnmarshalBinary(blob) -} - -// XorFilter8 is a faster more efficient alternative to a Bloom filter -// An XorFilter8 object can be used as is or with optional adittional setup. -// XorFilter8 uses 1/4 the space of XorFilter (32 bit) -type XorFilter8 struct { - xor *xorfilter.Xor8 - holding []uint64 - - b *XorBuilder -} - -// NewXor8 returns an XorFilter8 with an internal map created with a size hint and an optional *XorBuilder (may be nil) -// The Builder is not thread safe and should only be used by one thread at a time. -func NewXor8(hint int, builder *XorBuilder) *XorFilter8 { - return &XorFilter8{ - b: builder, - } -} - -// Set adds the value to the filter. -func (xf *XorFilter8) Set(x []byte) { - k := binary.BigEndian.Uint64(x) - xf.holding = append(xf.holding, k) -} - -// Test checks whether x is present in the filter. -// May return (rare) erroneous true values, but false is precise. -func (xf *XorFilter8) Test(x []byte) bool { - k := binary.BigEndian.Uint64(x) - if xf.xor != nil { - return xf.xor.Contains(k) - } - return false -} - -// MarshalBinary implements encoding.BinaryMarshaller interface -func (xf *XorFilter8) MarshalBinary() ([]byte, error) { - if len(xf.holding) != 0 { - var err error - if xf.b != nil { - xf.xor, err = xf.b.Populate(xf.holding) - } else { - xf.xor, err = xorfilter.Populate(xf.holding) - } - if err != nil { - return nil, err - } - } - if xf.xor == nil || (len(xf.xor.Fingerprints) == 0) { - // TODO: some other encoding for empty set? - return nil, nil - } - out := make([]byte, binary.MaxVarintLen64+binary.MaxVarintLen32+binary.MaxVarintLen32+(len(xf.xor.Fingerprints))) - pos := 0 - pos += binary.PutUvarint(out[pos:], xf.xor.Seed) - pos += binary.PutUvarint(out[pos:], uint64(xf.xor.BlockLength)) - pos += binary.PutUvarint(out[pos:], uint64(len(xf.xor.Fingerprints))) - copy(out[pos:], xf.xor.Fingerprints) - pos += len(xf.xor.Fingerprints) - out = out[:pos] - return out, nil -} - -// UnmarshalBinary implements encoding.BinaryUnmarshaller interface -func (xf *XorFilter8) UnmarshalBinary(data []byte) error { - pos := 0 - var dp int - xor := new(xorfilter.Xor8) - xor.Seed, dp = binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - pos += dp - blockLength, dp := binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - xor.BlockLength = uint32(blockLength) - pos += dp - lenFingerprints, dp := binary.Uvarint(data[pos:]) - if dp <= 0 { - return ErrBadBinary - } - pos += dp - if lenFingerprints > 0 { - if lenFingerprints > maxFingerprints { - return ErrBadBinary - } - if lenFingerprints > uint64(len(data)-pos) { - return ErrBadBinary - } - xor.Fingerprints = make([]byte, lenFingerprints) - copy(xor.Fingerprints, data[pos:]) - xf.xor = xor - } else { - xf.xor = nil - } - return nil -} - -// MarshalJSON implements encoding/json.Marshaller interface -func (xf *XorFilter8) MarshalJSON() ([]byte, error) { - data, err := xf.MarshalBinary() - if err != nil { - return nil, err - } - return json.Marshal(data) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler interface -func (xf *XorFilter8) UnmarshalJSON(data []byte) error { - var blob []byte - err := json.Unmarshal(data, &blob) - if err != nil { - return err - } - return xf.UnmarshalBinary(blob) -} diff --git a/util/bloom/xor_test.go b/util/bloom/xor_test.go deleted file mode 100644 index 0ad839bc78..0000000000 --- a/util/bloom/xor_test.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package bloom - -import ( - "bytes" - "encoding/binary" - "fmt" - "math/rand" - "runtime" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/xorfilter" - - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestXorBloom(t *testing.T) { - partitiontest.PartitionTest(t) - - numElementsCases := []int{2000, 20000, 200000} - fpRateCases := []float64{0.0042} //, 0.00001, 0.0000001} - numFP := []int{100, 25, 5} - if testing.Short() { - numElementsCases = []int{2000, 20000} - numFP = []int{100, 25} - } - for _, numElements := range numElementsCases { - for i, fpRate := range fpRateCases { - actualRate := estimateFalsePositiveRateXor(t, numElements, numFP[i]) - if actualRate < fpRate { - t.Logf("\tOK: numElements=%v want %v, got %v", numElements, fpRate, actualRate) - continue - } - - t.Errorf("numElements=%v want %v, got %v", numElements, fpRate, actualRate) - } - } -} - -// like bloom_test.go estimateFalsePositiveRate() -// based on "github.com/willf/bloom" -func estimateFalsePositiveRateXor(t *testing.T, numAdded int, numFP int) float64 { - var xf XorFilter - maxDuration := 5 * time.Second - if testing.Short() { - maxDuration = 100 * time.Millisecond - } - x := make([]byte, 8) - for i := 0; i < numAdded; i++ { - binary.BigEndian.PutUint32(x, uint32(i)) - xf.Set(x) - } - - xord, err := xf.MarshalBinary() - require.NoError(t, err) - var nxf XorFilter8 - err = nxf.UnmarshalBinary(xord) - require.NoError(t, err) - - start := time.Now() - falsePositives := 0 - numRounds := 0 - for i := 0; falsePositives < numFP; i++ { - binary.BigEndian.PutUint32(x, uint32(numAdded+i+1)) - if nxf.Test(x) { - falsePositives++ - } - numRounds++ - if numRounds%10000 == 0 { - dt := time.Now().Sub(start) - if dt > maxDuration { - t.Logf("t %s > max duration %s without finding false positive rate", dt, maxDuration) - break - } - } - } - - return float64(falsePositives) / float64(numRounds) -} - -func TestByte32FalsePositive(t *testing.T) { - partitiontest.PartitionTest(t) - - t.Parallel() - var filterSizes = []int{1000, 5000, 10000, 50000, 100000} - for _, filterSetSize := range filterSizes { - //const filterSetSize = 100000 - txids := make([][]byte, filterSetSize) - store := make([]byte, 32*filterSetSize) - rand.Read(store) - for i := 0; i < filterSetSize; i++ { - txids[i] = store[i*32 : (i+1)*32] - } - - notIn := func(t []byte) bool { - for _, v := range txids { - if bytes.Equal(t, v) { - return false - } - } - return true - } - - var xf XorFilter - - fpRate := 0.01 - //fpRate := 0.004 - numBits, numHashes := Optimal(filterSetSize, fpRate) - bf := New(numBits, numHashes, 0x12345678) - - for _, v := range txids { - xf.Set(v) - bf.Set(v) - } - - xord, err := xf.MarshalBinary() - require.NoError(t, err) - var nxf XorFilter - err = nxf.UnmarshalBinary(xord) - require.NoError(t, err) - - bloomData, err := bf.MarshalBinary() - require.NoError(t, err) - - t.Logf("filter for %d * [32]byte, bloom %d bytes, xor8 %d bytes", - filterSetSize, len(bloomData), len(xord)) - - xfalsePositives := 0 - bfalsePositives := 0 - const testN = 100000 - var tt [32]byte - for i := 0; i < testN; i++ { - rand.Read(tt[:]) - xhit := nxf.Test(tt[:]) - bhit := bf.Test(tt[:]) - if xhit || bhit { - falsePositive := notIn(tt[:]) - if xhit && falsePositive { - xfalsePositives++ - } - if bhit && falsePositive { - bfalsePositives++ - } - } - } - - t.Logf("false positives bloom %d/%d, xor %d/%d", bfalsePositives, testN, xfalsePositives, testN) - bfp := float64(bfalsePositives) / float64(testN) - xfp := float64(xfalsePositives) / float64(testN) - if bfp > (fpRate * 1.2) { - t.Errorf("bloom false positive too high: %f", bfp) - } - if xfp > (fpRate * 1.2) { - t.Errorf("xor false positive too high: %f", xfp) - } - } -} - -type GenericFilterFactory func() GenericFilter - -func memTestFilter(t *testing.T, filterFactory GenericFilterFactory, filterSetSize int) { - // setup - txids := make([][]byte, filterSetSize) - store := make([]byte, 32*filterSetSize) - rand.Read(store) - for i := 0; i < filterSetSize; i++ { - txids[i] = store[i*32 : (i+1)*32] - } - runtime.GC() - - var memAfterSetup runtime.MemStats - runtime.ReadMemStats(&memAfterSetup) - - f := filterFactory() - for _, v := range txids { - f.Set(v) - } - data, err := f.MarshalBinary() - require.NoError(t, err) - - var memAfterSerialize runtime.MemStats - runtime.ReadMemStats(&memAfterSerialize) - - nf := filterFactory() - err = nf.UnmarshalBinary(data) - require.NoError(t, err) - - var memAfterDeserialize runtime.MemStats - runtime.ReadMemStats(&memAfterDeserialize) - - t.Logf("build mem[%d]: %s", filterSetSize, memDelta(&memAfterSetup, &memAfterSerialize)) - t.Logf("load mem[%d]: %s", filterSetSize, memDelta(&memAfterSerialize, &memAfterDeserialize)) -} - -func memDelta(a, b *runtime.MemStats) string { - dMallocs := b.Mallocs - a.Mallocs - dFrees := b.Frees - a.Frees - dAllocated := b.HeapAlloc - a.HeapAlloc - return fmt.Sprintf("%d mallocs, %d frees, %d bytes allocated", dMallocs, dFrees, dAllocated) -} - -func TestMemXor(t *testing.T) { - partitiontest.PartitionTest(t) - - t.Parallel() - var xb xorfilter.Builder - xff := func() GenericFilter { - xf := NewXor(5000, &xb) - return xf - } - memTestFilter(t, xff, 5000) - memTestFilter(t, xff, 5000) -} - -func TestMemBloom(t *testing.T) { - partitiontest.PartitionTest(t) - - t.Parallel() - fpRate := 0.004 - filterSetSize := 5000 - numBits, numHashes := Optimal(filterSetSize, fpRate) - bff := func() GenericFilter { - return New(numBits, numHashes, 0x12345678) - } - memTestFilter(t, bff, filterSetSize) -} - -// TestFilterSize tests different sizes of inputs against xor8 and xor32 and check -// that the generated marshaled byte representation aligns with the expected size. -func TestFilterSize(t *testing.T) { - partitiontest.PartitionTest(t) - var builder XorBuilder - for size := 1000; size < 50000; size = ((size + size/2) / 100) * 100 { - xor := NewXor(size, &builder) - for i := 0; i < size; i++ { - digest := crypto.Hash([]byte{byte(i), byte(i >> 8), byte(i >> 16)}) - xor.Set(digest[:]) - } - out, err := xor.MarshalBinary() - require.NoError(t, err) - bytesElement := float32(len(out)) / float32(size) - fmt.Printf("Xor32 filter for %d elements takes %d bytes, %f bytes/element\n", size, len(out), bytesElement) - require.GreaterOrEqual(t, bytesElement, float32(4.9)) - require.LessOrEqual(t, bytesElement, float32(5.1)) - } - for size := 1000; size < 50000; size = ((size + size/2) / 100) * 100 { - xor := NewXor8(size, &builder) - for i := 0; i < size; i++ { - digest := crypto.Hash([]byte{byte(i), byte(i >> 8), byte(i >> 16)}) - xor.Set(digest[:]) - } - out, err := xor.MarshalBinary() - require.NoError(t, err) - bytesElement := float32(len(out)) / float32(size) - fmt.Printf("Xor8 filter for %d elements takes %d bytes, %f bytes/element\n", size, len(out), bytesElement) - require.GreaterOrEqual(t, bytesElement, float32(1.23)) - require.LessOrEqual(t, bytesElement, float32(1.28)) - } -} - -// BenchmarkCreateLargeXorFilter should have the same structure as bloom_test.go BenchmarkCreateLargeBloomFilter -func BenchmarkCreateLargeXorFilter(b *testing.B) { - // dialing mu=25000; 3 servers; so each mailbox is 75000 real and 75000 noise - // for a total of 150000 elements in the dialing bloom filter - var xb xorfilter.Builder - for i := 0; i < b.N; i++ { - xf := NewXor(largeFilterElements, &xb) - x := make([]byte, 8) - for i := uint32(0); i < uint32(largeFilterElements); i++ { - binary.BigEndian.PutUint32(x, i) - xf.Set(x) - } - xf.MarshalBinary() - } -} - -// See Also BenchmarkBloomFilterTest -func BenchmarkXorFilterTest(b *testing.B) { - // sizeBits, numHashes := Optimal(filterTestElements, 0.01) - // prefix := uint32(0) - // bf := New(sizeBits, numHashes, prefix) - var xf XorFilter - dataset := make([][]byte, filterTestElements) - for n := 0; n < filterTestElements; n++ { - hash := crypto.Hash([]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)}) - dataset[n] = hash[:] - } - // set half of them. - for n := 0; n < filterTestElements/2; n++ { - xf.Set(dataset[n]) - } - - xord, err := xf.MarshalBinary() - require.NoError(b, err) - var nxf XorFilter - err = nxf.UnmarshalBinary(xord) - require.NoError(b, err) - - b.ResetTimer() - for x := 0; x < b.N; x++ { - nxf.Test(dataset[x%filterTestElements]) - } -} diff --git a/util/compress/deflate.go b/util/compress/deflate.go deleted file mode 100644 index 188885b5a2..0000000000 --- a/util/compress/deflate.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package compress - -// #cgo CFLAGS: -Wall -std=c99 -I${SRCDIR}/libdeflate -// #cgo amd64 CFLAGS: -DX86 -D__x86_64__ -D__i386__ -// #cgo arm64 CFLAGS: -DARM -// #cgo arm CFLAGS: -DARM -// #cgo linux,amd64 CFLAGS: -march=sandybridge -// #cgo darwin,amd64 CFLAGS: -march=tremont -// #include -// int isNull(void * c) { -// if(!c) { -// return 1; -// } -// return 0; -// }; -// -// #ifdef X86 -// #include "lib/x86/cpu_features.c" -// #endif -// #ifdef ARM -// #include "lib/arm/cpu_features.c" -// #endif -// #define dispatch crc32_dispatch -// #include "lib/crc32.c" -// #undef dispatch -// #define dispatch compress_dispatch -// #define bitbuf_t compress_bitbuf_t -// #include "lib/deflate_compress.c" -// #undef bitbuf_t -// #undef dispatch -// #undef BITBUF_NBITS -// #include "lib/deflate_decompress.c" -// #include "lib/gzip_compress.c" -// #include "lib/gzip_decompress.c" -// #include "lib/utils.c" -import "C" - -import ( - "errors" - "runtime" - "unsafe" -) - -var ( - // ErrOutOfMemory is returned when we fail to allocate the compressor/decompressor - ErrOutOfMemory = errors.New("out of memory") - // ErrShortBuffer is returned when the output buffer is too small to fit the compressed/decompressed data - ErrShortBuffer = errors.New("short buffer") - // ErrNoInput is returned when no input buffer data is provided - ErrNoInput = errors.New("empty input") - // ErrBadData is returned when the compressed data is corrupted - ErrBadData = errors.New("data was corrupted, invalid or unsupported") - // ErrInsufficientSpace is returned when the provided output buffer is found to be too small during the decompression - ErrInsufficientSpace = errors.New("decompression failed: buffer too short. Retry with larger buffer") - // ErrShortOutput should not be generated using the current libdeflate usage, but remain here for compatibility - ErrShortOutput = errors.New("buffer too long: decompressed to fewer bytes than expected, indicating possible error in decompression. Make sure your out buffer has the exact length of the decompressed data or pass nil for out") - // ErrPartiallyConsumedData is returned if only a subset of the input data was consumed during the decompression - ErrPartiallyConsumedData = errors.New("partially consumed data") - - // ErrUnknown returned when the libdeflate returns unexpected enum error - ErrUnknown = errors.New("unknown error code from decompressor library") -) - -// Compress the input buffer into the output buffer. -func Compress(in, out []byte, compressLevel int) (int, []byte, error) { - if len(in) == 0 { - return 0, out, ErrNoInput - } - if cap(out) == 0 { - return 0, out, ErrShortBuffer - } - - if compressLevel < 1 { - compressLevel = 1 - } else if compressLevel > 12 { - compressLevel = 12 - } - - c := C.libdeflate_alloc_compressor(C.int(compressLevel)) - if C.isNull(unsafe.Pointer(c)) == 1 { - return 0, out, ErrOutOfMemory - } - defer func() { - C.libdeflate_free_compressor(c) - }() - inAddr := startMemAddr(in) - outAddr := startMemAddr(out) - - written := int(C.libdeflate_gzip_compress(c, unsafe.Pointer(inAddr), C.size_t(len(in)), unsafe.Pointer(outAddr), C.size_t(cap(out)))) - - if written == 0 { - return written, out, ErrShortBuffer - } - return written, out[:written], nil -} - -// Decompress decompresses the input buffer data into the output buffer. -func Decompress(in, out []byte) ([]byte, error) { - if len(in) == 0 { - return out, ErrNoInput - } - if cap(out) == 0 { - return out, ErrShortBuffer - } - dc := C.libdeflate_alloc_decompressor() - if C.isNull(unsafe.Pointer(dc)) == 1 { - return out, ErrOutOfMemory - } - defer func() { - C.libdeflate_free_decompressor(dc) - }() - - inAddr := startMemAddr(in) - outAddr := startMemAddr(out) - - var actualInBytes C.size_t - var actualOutBytes C.size_t - r := C.libdeflate_gzip_decompress_ex(dc, unsafe.Pointer(inAddr), C.size_t(len(in)), unsafe.Pointer(outAddr), C.size_t(cap(out)), &actualInBytes, &actualOutBytes) - - runtime.KeepAlive(&actualInBytes) - runtime.KeepAlive(&actualOutBytes) - switch r { - case C.LIBDEFLATE_SUCCESS: - if actualInBytes != C.size_t(len(in)) { - // return an error if not all the data was consumed. - return out, ErrPartiallyConsumedData - } - return out[:actualOutBytes], nil - case C.LIBDEFLATE_BAD_DATA: - return out, ErrBadData - case C.LIBDEFLATE_SHORT_OUTPUT: - return out, ErrShortOutput - case C.LIBDEFLATE_INSUFFICIENT_SPACE: - return out, ErrInsufficientSpace - default: - return out, ErrUnknown - } -} - -func startMemAddr(b []byte) *byte { - if len(b) > 0 { - return &b[0] - } - - b = append(b, 0) - ptr := &b[0] - - return ptr -} - -func init() { - // initialize dispatch tables. This is important since we want to avoid race conditions when running the dispatch over multiple cores. - decompressedBuffer := []byte{1, 2, 3, 4} - compressedBuffer := make([]byte, 128) - _, compressedOutput, _ := Compress(decompressedBuffer, compressedBuffer, 9) - decompressedBuffer = make([]byte, 128) - Decompress(compressedOutput, decompressedBuffer) //nolint:errcheck // static call that won't fail -} diff --git a/util/compress/deflate_test.go b/util/compress/deflate_test.go deleted file mode 100644 index cf16e72a15..0000000000 --- a/util/compress/deflate_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package compress - -import ( - "bytes" - "compress/gzip" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/test/partitiontest" -) - -func TestTrivialCompression(t *testing.T) { - partitiontest.PartitionTest(t) - - bufLen := 10240 - buffer := make([]byte, bufLen) - for i := range buffer { - buffer[i] = byte(i % 256) - } - - compressedBuffer := make([]byte, 0, bufLen) - len, compressedOutput, err := Compress(buffer, compressedBuffer, 9) - require.NoError(t, err) - require.NotZero(t, len) - require.Equal(t, compressedBuffer[:len], compressedOutput) - - decompressedBuffer := make([]byte, 0, bufLen) - decompressedOutput, err := Decompress(compressedOutput, decompressedBuffer) - require.NoError(t, err) - require.Equal(t, decompressedOutput, buffer) -} - -func BenchmarkCompression(b *testing.B) { - bufLen := 1024000 - buffer := make([]byte, bufLen) - outBuffer := make([]byte, 0, bufLen) - for i := range buffer { - buffer[i] = byte(i % 256) - } - var targetLength int - b.Run("compress/gzip", func(b *testing.B) { - for k := 0; k < b.N; k++ { - outBuffer := bytes.NewBuffer(outBuffer) - writer := gzip.NewWriter(outBuffer) - writer.Write(buffer) - writer.Close() - targetLength = outBuffer.Len() - } - }) - // figure out desired compression level. - compressionLevel := 1 - for { - len, _, _ := Compress(buffer, outBuffer, compressionLevel) - if len <= targetLength+128 || compressionLevel > 11 { - break - } - compressionLevel++ - } - b.Run("deflateCompression", func(b *testing.B) { - for k := 0; k < b.N; k++ { - Compress(buffer, outBuffer[:cap(outBuffer)], compressionLevel) - } - }) -} - -func BenchmarkDecompression(b *testing.B) { - bufLen := 1024000 - decompressedBuffer := make([]byte, bufLen) - for i := range decompressedBuffer { - decompressedBuffer[i] = byte(i % 256) - } - - // create the compress/gzip compressed buffer. - gzipCompressedBuffer := bytes.NewBuffer([]byte{}) - writer := gzip.NewWriter(gzipCompressedBuffer) - writer.Write(decompressedBuffer) - writer.Close() - gzipCompressedBytes := gzipCompressedBuffer.Bytes() - - // create the deflate compressed buffer. - deflateCompressedBuffer := make([]byte, 0, bufLen) - _, deflateCompressedBuffer, _ = Compress(decompressedBuffer, deflateCompressedBuffer, 1) - - b.Run("compress/gzip", func(b *testing.B) { - for k := 0; k < b.N; k++ { - stage := make([]byte, 1024) - reader, err := gzip.NewReader(bytes.NewBuffer(gzipCompressedBytes)) - require.NoError(b, err) - for { - n, err := reader.Read(stage[:]) - if n == 0 || err != nil { - break - } - } - reader.Close() - gzipCompressedBuffer.Reset() - } - }) - - b.Run("deflateCompression", func(b *testing.B) { - outBuffer := make([]byte, 0, bufLen) - for k := 0; k < b.N; k++ { - Decompress(deflateCompressedBuffer, outBuffer[:cap(outBuffer)]) - } - }) -} diff --git a/util/compress/libdeflate/.cirrus.yml b/util/compress/libdeflate/.cirrus.yml deleted file mode 100644 index 602f0a68aa..0000000000 --- a/util/compress/libdeflate/.cirrus.yml +++ /dev/null @@ -1,8 +0,0 @@ -task: - freebsd_instance: - matrix: - - image_family: freebsd-11-3-snap - - image_family: freebsd-12-1-snap - install_script: pkg install -y gmake - script: - - gmake check diff --git a/util/compress/libdeflate/.github/workflows/ci.yml b/util/compress/libdeflate/.github/workflows/ci.yml deleted file mode 100644 index ff7cfdbb40..0000000000 --- a/util/compress/libdeflate/.github/workflows/ci.yml +++ /dev/null @@ -1,123 +0,0 @@ -name: CI -on: [pull_request] -env: - CFLAGS: -Werror - -jobs: - x86_64-build-and-test: - name: Build and test (x86_64, ${{ matrix.os }}, ${{ matrix.compiler }}) - strategy: - matrix: - os: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04] - compiler: [gcc, clang] - exclude: - # clang 3.8.0-2ubuntu4 crashes with: - # "fatal error: error in backend: Cannot select: 0x21025a0: v64i8 = X86ISD::VBROADCAST 0x2101fb0" - - os: ubuntu-16.04 - compiler: clang - runs-on: ${{ matrix.os }} - env: - CC: ${{ matrix.compiler }} - steps: - - uses: actions/checkout@v2 - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y clang llvm libz-dev valgrind - - run: scripts/run_tests.sh - - other-arch-build-and-test: - name: Build and test (${{ matrix.arch }}, Debian Buster, ${{ matrix.compiler }}) - strategy: - matrix: - arch: [armv6, armv7, aarch64, s390x, ppc64le] - compiler: [gcc, clang] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: uraimo/run-on-arch-action@v2.0.5 - with: - arch: ${{ matrix.arch }} - distro: buster - githubToken: ${{ github.token }} - install: | - apt-get update - apt-get install -y build-essential clang llvm libz-dev valgrind - run: | - # Valgrind and ASAN crash on at least s390x, ppc64le, and aarch64 - # here. (It's probably something related to the QEMU user-mode - # emulation that run-on-arch-action uses.) - export SKIP_VALGRIND=1 - export SKIP_ASAN=1 - - case ${{ matrix.arch }} in - s390x) - # On s390x, in freestanding builds the shared library links to an - # external symbol __clzdi2, even when -static-libgcc is used. - export SKIP_FREESTANDING=1 - ;; - aarch64) - # "ldd: exited with unknown exit code (139)" - if [ ${{ matrix.compiler }} = clang ]; then - export SKIP_SHARED_LIB=1 - fi - ;; - esac - - export CC=${{ matrix.compiler }} - scripts/run_tests.sh - - macos-build-and-test: - name: Build and test (macOS) - runs-on: macos-latest - steps: - - uses: actions/checkout@v2 - - run: make all check - - windows-build-and-test: - name: Build and test (Windows) - runs-on: windows-latest - steps: - - uses: actions/checkout@v2 - - shell: bash - run: | - PATH="C:\\msys64\\mingw64\\bin:C:\\msys64\\usr\\bin:$PATH" \ - make CC=gcc all check - - run-clang-static-analyzer: - name: Run clang static analyzer - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y clang-tools - - name: Run clang static analyzer - run: make scan-build - - run-shellcheck: - name: Run shellcheck - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y shellcheck - - name: Run shellcheck - run: make shellcheck - - cross-compile-for-windows: - name: Cross compile for Windows - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 libz-mingw-w64-dev - - name: 32-bit build - run: make CC=i686-w64-mingw32-gcc all test_programs - - name: 64-bit build - run: make CC=x86_64-w64-mingw32-gcc all test_programs diff --git a/util/compress/libdeflate/.gitignore b/util/compress/libdeflate/.gitignore deleted file mode 100644 index f0b0861186..0000000000 --- a/util/compress/libdeflate/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -*.a -*.def -*.dll -*.dllobj -*.dylib -*.exe -*.exp -*.lib -*.o -*.obj -*.so -*.so.* -/.build-config -/programs/config.h -/benchmark -/checksum -/gzip -/gunzip -/test_* -tags -cscope* diff --git a/util/compress/libdeflate/COPYING b/util/compress/libdeflate/COPYING deleted file mode 100644 index 1f1b81cd5a..0000000000 --- a/util/compress/libdeflate/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2016 Eric Biggers - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation files -(the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/util/compress/libdeflate/Makefile b/util/compress/libdeflate/Makefile deleted file mode 100644 index 276d75d09d..0000000000 --- a/util/compress/libdeflate/Makefile +++ /dev/null @@ -1,372 +0,0 @@ -# -# Use 'make help' to list available targets. -# -# Define V=1 to enable "verbose" mode, showing all executed commands. -# -# Define USE_SHARED_LIB to link the binaries to the shared library version of -# libdeflate rather than to the static library version. -# -# Define DECOMPRESSION_ONLY to omit all compression code, building a -# decompression-only library. If doing this, you must also build a specific -# library target such as 'libdeflate.a', as the programs will no longer compile. -# -# Define DISABLE_GZIP to disable support for the gzip wrapper format. -# -# Define DISABLE_ZLIB to disable support for the zlib wrapper format. -# -# Define PREFIX to override the installation prefix, like './configure --prefix' -# in autotools-based projects (default: /usr/local) -# -# Define BINDIR to override where to install binaries, like './configure -# --bindir' in autotools-based projects (default: PREFIX/bin) -# -# Define INCDIR to override where to install headers, like './configure -# --includedir' in autotools-based projects (default: PREFIX/include) -# -# Define LIBDIR to override where to install libraries, like './configure -# --libdir' in autotools-based projects (default: PREFIX/lib) -# -# Define DESTDIR to override the installation destination directory -# (default: empty string) -# -# Define FREESTANDING to build a freestanding library, i.e. a library that -# doesn't link to any libc functions like malloc(), free(), and memcpy(). -# All users will need to call libdeflate_set_memory_allocator(). -# -# You can also specify a custom CC, CFLAGS, CPPFLAGS, and/or LDFLAGS. -# -############################################################################## - -#### Common compiler flags. You can add additional flags by defining CFLAGS -#### in the environment or on the 'make' command line. -#### -#### The default optimization flags can be overridden, e.g. via CFLAGS="-O3" or -#### CFLAGS="-O0 -fno-omit-frame-pointer". But this usually isn't recommended; -#### you're unlikely to get significantly better performance even with -O3. - -cc-option = $(shell if $(CC) $(1) -c -x c /dev/null -o /dev/null \ - 1>&2 2>/dev/null; then echo $(1); fi) - -override CFLAGS := \ - -O2 -fomit-frame-pointer -std=c99 -I. -Wall -Wundef \ - $(call cc-option,-Wpedantic) \ - $(call cc-option,-Wdeclaration-after-statement) \ - $(call cc-option,-Wmissing-prototypes) \ - $(call cc-option,-Wstrict-prototypes) \ - $(call cc-option,-Wvla) \ - $(call cc-option,-Wimplicit-fallthrough) \ - $(CFLAGS) - -FREESTANDING := -ifdef FREESTANDING -override CPPFLAGS += -DFREESTANDING -LIB_CFLAGS += -ffreestanding -nostdlib -endif - -# Don't use this option except for testing; it isn't a stable interface. -TEST_SUPPORT__DO_NOT_USE := -ifdef TEST_SUPPORT__DO_NOT_USE -override CPPFLAGS += -DTEST_SUPPORT__DO_NOT_USE -endif - -############################################################################## - -PREFIX ?= /usr/local -BINDIR ?= $(PREFIX)/bin -INCDIR ?= $(PREFIX)/include -LIBDIR ?= $(PREFIX)/lib - -SOVERSION := 0 - -STATIC_LIB_SUFFIX := .a -PROG_SUFFIX := -PROG_CFLAGS := -HARD_LINKS := 1 - -# Compiling for Windows with MinGW? -ifneq ($(findstring -mingw,$(shell $(CC) -dumpmachine 2>/dev/null)),) - STATIC_LIB_SUFFIX := static.lib - SHARED_LIB := libdeflate.dll - SHARED_LIB_SYMLINK := - SHARED_LIB_CFLAGS := - SHARED_LIB_LDFLAGS := -Wl,--out-implib,libdeflate.lib \ - -Wl,--output-def,libdeflate.def \ - -Wl,--add-stdcall-alias - PROG_SUFFIX := .exe - PROG_CFLAGS := -static -municode - HARD_LINKS := - override CFLAGS := $(CFLAGS) $(call cc-option,-Wno-pedantic-ms-format) - - # If AR was not already overridden, then derive it from $(CC). - # Note that CC may take different forms, e.g. "cc", "gcc", - # "x86_64-w64-mingw32-gcc", or "x86_64-w64-mingw32-gcc-6.3.1". - # On Windows it may also have a .exe extension. - ifeq ($(AR),ar) - AR := $(shell echo $(CC) | \ - sed -E 's/g?cc(-?[0-9]+(\.[0-9]+)*)?(\.exe)?$$/ar\3/') - endif - -# macOS? -else ifeq ($(shell uname),Darwin) - SHARED_LIB := libdeflate.$(SOVERSION).dylib - SHARED_LIB_SYMLINK := libdeflate.dylib - SHARED_LIB_CFLAGS := -fPIC - SHARED_LIB_LDFLAGS := -install_name $(SHARED_LIB) - -# Linux, FreeBSD, etc. -else - SHARED_LIB := libdeflate.so.$(SOVERSION) - SHARED_LIB_SYMLINK := libdeflate.so - SHARED_LIB_CFLAGS := -fPIC - SHARED_LIB_LDFLAGS := -Wl,-soname=$(SHARED_LIB) -endif - -############################################################################## - -#### Quiet make is enabled by default. Define V=1 to disable. - -ifneq ($(findstring s,$(MAKEFLAGS)),s) -ifneq ($(V),1) - QUIET_CC = @echo ' CC ' $@; - QUIET_CCLD = @echo ' CCLD ' $@; - QUIET_AR = @echo ' AR ' $@; - QUIET_LN = @echo ' LN ' $@; - QUIET_CP = @echo ' CP ' $@; - QUIET_GEN = @echo ' GEN ' $@; -endif -endif - -############################################################################## - -# Rebuild if a user-specified setting that affects the build changed. -.build-config: FORCE - @flags=$$( \ - echo 'USE_SHARED_LIB=$(USE_SHARED_LIB)'; \ - echo 'DECOMPRESSION_ONLY=$(DECOMPRESSION_ONLY)'; \ - echo 'DISABLE_GZIP=$(DISABLE_GZIP)'; \ - echo 'DISABLE_ZLIB=$(DISABLE_ZLIB)'; \ - echo 'FREESTANDING=$(FREESTANDING)'; \ - echo 'CC=$(CC)'; \ - echo 'CFLAGS=$(CFLAGS)'; \ - echo 'CPPFLAGS=$(CPPFLAGS)'; \ - echo 'LDFLAGS=$(LDFLAGS)'; \ - ); \ - if [ "$$flags" != "`cat $@ 2>/dev/null`" ]; then \ - [ -e $@ ] && echo "Rebuilding due to new settings"; \ - echo "$$flags" > $@; \ - fi - -############################################################################## - -COMMON_HEADERS := $(wildcard common/*.h) libdeflate.h -DEFAULT_TARGETS := - -#### Library - -STATIC_LIB := libdeflate$(STATIC_LIB_SUFFIX) - -LIB_CFLAGS += $(CFLAGS) -fvisibility=hidden -D_ANSI_SOURCE - -LIB_HEADERS := $(wildcard lib/*.h) $(wildcard lib/*/*.h) - -LIB_SRC := lib/deflate_decompress.c lib/utils.c \ - $(wildcard lib/*/cpu_features.c) - -DECOMPRESSION_ONLY := -ifndef DECOMPRESSION_ONLY - LIB_SRC += lib/deflate_compress.c -endif - -DISABLE_ZLIB := -ifndef DISABLE_ZLIB - LIB_SRC += lib/adler32.c lib/zlib_decompress.c - ifndef DECOMPRESSION_ONLY - LIB_SRC += lib/zlib_compress.c - endif -endif - -DISABLE_GZIP := -ifndef DISABLE_GZIP - LIB_SRC += lib/crc32.c lib/gzip_decompress.c - ifndef DECOMPRESSION_ONLY - LIB_SRC += lib/gzip_compress.c - endif -endif - -STATIC_LIB_OBJ := $(LIB_SRC:.c=.o) -SHARED_LIB_OBJ := $(LIB_SRC:.c=.shlib.o) - -# Compile static library object files -$(STATIC_LIB_OBJ): %.o: %.c $(LIB_HEADERS) $(COMMON_HEADERS) .build-config - $(QUIET_CC) $(CC) -o $@ -c $(CPPFLAGS) $(LIB_CFLAGS) $< - -# Compile shared library object files -$(SHARED_LIB_OBJ): %.shlib.o: %.c $(LIB_HEADERS) $(COMMON_HEADERS) .build-config - $(QUIET_CC) $(CC) -o $@ -c $(CPPFLAGS) $(LIB_CFLAGS) \ - $(SHARED_LIB_CFLAGS) -DLIBDEFLATE_DLL $< - -# Create static library -$(STATIC_LIB):$(STATIC_LIB_OBJ) - $(QUIET_AR) $(AR) cr $@ $+ - -DEFAULT_TARGETS += $(STATIC_LIB) - -# Create shared library -$(SHARED_LIB):$(SHARED_LIB_OBJ) - $(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(LIB_CFLAGS) \ - $(SHARED_LIB_LDFLAGS) -shared $+ - -DEFAULT_TARGETS += $(SHARED_LIB) - -ifdef SHARED_LIB_SYMLINK -# Create the symlink libdeflate.so => libdeflate.so.$SOVERSION -$(SHARED_LIB_SYMLINK):$(SHARED_LIB) - $(QUIET_LN) ln -sf $+ $@ -DEFAULT_TARGETS += $(SHARED_LIB_SYMLINK) -endif - -############################################################################## - -#### Programs - -PROG_CFLAGS += $(CFLAGS) \ - -D_POSIX_C_SOURCE=200809L \ - -D_FILE_OFFSET_BITS=64 \ - -DHAVE_CONFIG_H - -ALL_PROG_COMMON_HEADERS := programs/config.h \ - programs/prog_util.h \ - programs/test_util.h -PROG_COMMON_SRC := programs/prog_util.c \ - programs/tgetopt.c -NONTEST_PROG_SRC := programs/gzip.c -TEST_PROG_COMMON_SRC := programs/test_util.c -TEST_PROG_SRC := programs/benchmark.c \ - programs/checksum.c \ - $(filter-out $(TEST_PROG_COMMON_SRC),$(wildcard programs/test_*.c)) - -NONTEST_PROGRAMS := $(NONTEST_PROG_SRC:programs/%.c=%$(PROG_SUFFIX)) -DEFAULT_TARGETS += $(NONTEST_PROGRAMS) -TEST_PROGRAMS := $(TEST_PROG_SRC:programs/%.c=%$(PROG_SUFFIX)) - -PROG_COMMON_OBJ := $(PROG_COMMON_SRC:%.c=%.o) -NONTEST_PROG_OBJ := $(NONTEST_PROG_SRC:%.c=%.o) -TEST_PROG_COMMON_OBJ := $(TEST_PROG_COMMON_SRC:%.c=%.o) -TEST_PROG_OBJ := $(TEST_PROG_SRC:%.c=%.o) - -ALL_PROG_OBJ := $(PROG_COMMON_OBJ) $(NONTEST_PROG_OBJ) \ - $(TEST_PROG_COMMON_OBJ) $(TEST_PROG_OBJ) - -# Generate autodetected configuration header -programs/config.h:scripts/detect.sh .build-config - $(QUIET_GEN) CC="$(CC)" CFLAGS="$(PROG_CFLAGS)" $< > $@ - -# Compile program object files -$(ALL_PROG_OBJ): %.o: %.c $(ALL_PROG_COMMON_HEADERS) $(COMMON_HEADERS) \ - .build-config - $(QUIET_CC) $(CC) -o $@ -c $(CPPFLAGS) $(PROG_CFLAGS) $< - -# Link the programs. -# -# Note: the test programs are not compiled by default. One reason is that the -# test programs must be linked with zlib for doing comparisons. - -ifdef USE_SHARED_LIB -LIB := $(SHARED_LIB) -else -LIB := $(STATIC_LIB) -endif - -$(NONTEST_PROGRAMS): %$(PROG_SUFFIX): programs/%.o $(PROG_COMMON_OBJ) $(LIB) - $(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+ - -$(TEST_PROGRAMS): %$(PROG_SUFFIX): programs/%.o $(PROG_COMMON_OBJ) \ - $(TEST_PROG_COMMON_OBJ) $(LIB) - $(QUIET_CCLD) $(CC) -o $@ $(LDFLAGS) $(PROG_CFLAGS) $+ -lz - -ifdef HARD_LINKS -# Hard link gunzip to gzip -gunzip$(PROG_SUFFIX):gzip$(PROG_SUFFIX) - $(QUIET_LN) ln -f $< $@ -else -# No hard links; copy gzip to gunzip -gunzip$(PROG_SUFFIX):gzip$(PROG_SUFFIX) - $(QUIET_CP) cp -f $< $@ -endif - -DEFAULT_TARGETS += gunzip$(PROG_SUFFIX) - -############################################################################## - -all:$(DEFAULT_TARGETS) - -# Install the files. Note: not all versions of the 'install' program have the -# '-D' and '-t' options, so don't use them; use portable commands only. -install:all - install -d $(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCDIR) $(DESTDIR)$(BINDIR) - install -m644 $(STATIC_LIB) $(DESTDIR)$(LIBDIR) - install -m755 $(SHARED_LIB) $(DESTDIR)$(LIBDIR) - install -m644 libdeflate.h $(DESTDIR)$(INCDIR) - install -m755 gzip$(PROG_SUFFIX) \ - $(DESTDIR)$(BINDIR)/libdeflate-gzip$(PROG_SUFFIX) - ln -f $(DESTDIR)$(BINDIR)/libdeflate-gzip$(PROG_SUFFIX) \ - $(DESTDIR)$(BINDIR)/libdeflate-gunzip$(PROG_SUFFIX) - if [ -n "$(SHARED_LIB_SYMLINK)" ]; then \ - ln -sf $(SHARED_LIB) \ - $(DESTDIR)$(LIBDIR)/$(SHARED_LIB_SYMLINK); \ - fi - -uninstall: - rm -f $(DESTDIR)$(LIBDIR)/$(STATIC_LIB) \ - $(DESTDIR)$(LIBDIR)/$(SHARED_LIB) \ - $(DESTDIR)$(INCDIR)/libdeflate.h \ - $(DESTDIR)$(BINDIR)/libdeflate-gzip$(PROG_SUFFIX) \ - $(DESTDIR)$(BINDIR)/libdeflate-gunzip$(PROG_SUFFIX) - if [ -n "$(SHARED_LIB_SYMLINK)" ]; then \ - rm -f $(DESTDIR)$(LIBDIR)/$(SHARED_LIB_SYMLINK); \ - fi - -test_programs:$(TEST_PROGRAMS) - -# A minimal 'make check' target. This only runs some quick tests; -# use scripts/run_tests.sh if you want to run the full tests. -check:test_programs - LD_LIBRARY_PATH=. ./benchmark$(PROG_SUFFIX) < ./benchmark$(PROG_SUFFIX) - for prog in test_*; do \ - LD_LIBRARY_PATH=. ./$$prog || exit 1; \ - done - -# Run the clang static analyzer. -scan-build: - scan-build --status-bugs make all test_programs - -# Run shellcheck on all shell scripts. -shellcheck: - shellcheck scripts/*.sh - -help: - @echo "Available targets:" - @echo "------------------" - @for target in $(DEFAULT_TARGETS) $(TEST_PROGRAMS); do \ - echo -e "$$target"; \ - done - -clean: - rm -f *.a *.dll *.exe *.exp *.dylib *.so \ - lib/*.o lib/*/*.o \ - lib/*.obj lib/*/*.obj \ - lib/*.dllobj lib/*/*.dllobj \ - programs/*.o programs/*.obj \ - $(DEFAULT_TARGETS) $(TEST_PROGRAMS) programs/config.h \ - libdeflate.lib libdeflate.def libdeflatestatic.lib \ - .build-config - -realclean: clean - rm -f tags cscope* - -FORCE: - -.PHONY: all install uninstall test_programs check scan-build shellcheck help \ - clean realclean - -.DEFAULT_GOAL = all diff --git a/util/compress/libdeflate/Makefile.msc b/util/compress/libdeflate/Makefile.msc deleted file mode 100644 index 14496187f5..0000000000 --- a/util/compress/libdeflate/Makefile.msc +++ /dev/null @@ -1,65 +0,0 @@ -# -# Makefile for the Microsoft toolchain -# -# Usage: -# nmake /f Makefile.msc -# - -.SUFFIXES: .c .obj .dllobj - -CC = cl -LD = link -AR = lib -CFLAGS = /MD /O2 -I. -LDFLAGS = - -STATIC_LIB = libdeflatestatic.lib -SHARED_LIB = libdeflate.dll -IMPORT_LIB = libdeflate.lib - -STATIC_LIB_OBJ = \ - lib/adler32.obj \ - lib/crc32.obj \ - lib/deflate_compress.obj \ - lib/deflate_decompress.obj \ - lib/gzip_compress.obj \ - lib/gzip_decompress.obj \ - lib/utils.obj \ - lib/x86/cpu_features.obj \ - lib/zlib_compress.obj \ - lib/zlib_decompress.obj - -SHARED_LIB_OBJ = $(STATIC_LIB_OBJ:.obj=.dllobj) - -PROG_COMMON_OBJ = programs/prog_util.obj \ - programs/tgetopt.obj \ - $(STATIC_LIB) - -PROG_CFLAGS = $(CFLAGS) -Iprograms - -all: $(STATIC_LIB) $(SHARED_LIB) $(IMPORT_LIB) gzip.exe gunzip.exe - -.c.obj: - $(CC) -c /Fo$@ $(CFLAGS) $** - -.c.dllobj: - $(CC) -c /Fo$@ $(CFLAGS) /DLIBDEFLATE_DLL $** - -$(STATIC_LIB): $(STATIC_LIB_OBJ) - $(AR) $(ARFLAGS) -out:$@ $(STATIC_LIB_OBJ) - -$(SHARED_LIB): $(SHARED_LIB_OBJ) - $(LD) $(LDFLAGS) -out:$@ -dll -implib:$(IMPORT_LIB) $(SHARED_LIB_OBJ) - -$(IMPORT_LIB): $(SHARED_LIB) - -gzip.exe:programs/gzip.obj $(PROG_COMMON_OBJ) - $(LD) $(LDFLAGS) -out:$@ $** - -gunzip.exe:gzip.exe - copy $** $@ - -clean: - -del *.dll *.exe *.exp libdeflate.lib libdeflatestatic.lib gzip.lib \ - lib\*.obj lib\x86\*.obj lib\*.dllobj lib\x86\*.dllobj \ - programs\*.obj 2>nul diff --git a/util/compress/libdeflate/NEWS b/util/compress/libdeflate/NEWS deleted file mode 100644 index b1704dd180..0000000000 --- a/util/compress/libdeflate/NEWS +++ /dev/null @@ -1,200 +0,0 @@ -Version 1.7: - Added support for compression level 0, "no compression". - - Added an ARM CRC32 instruction accelerated implementation of CRC32. - - Added support for linking the programs to the shared library version of - libdeflate rather than to the static library version. - - Made the compression level affect the minimum input size at which - compression is attempted. - - Fixed undefined behavior in x86 Adler32 implementation. - (No miscompilations were observed in practice.) - - Fixed undefined behavior in x86 CPU feature code. - (No miscompilations were observed in practice.) - - Fixed installing shared lib symlink on macOS. - - Documented third-party bindings. - - Made a lot of improvements to the testing scripts and the CI - configuration file. - - Lots of other small improvements and cleanups. - -Version 1.6: - Prevented gcc 10 from miscompiling libdeflate (workaround for - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94994). - - Removed workaround for gcc 5 and earlier producing slow code on - ARM32. If this affects you, please upgrade your compiler. - - New API function: libdeflate_zlib_decompress_ex(). It provides - the actual size of the stream that was decompressed, like the - gzip and DEFLATE equivalents. - - libdeflate_zlib_decompress() now accepts trailing bytes after - the end of the stream, like the gzip and DEFLATE equivalents. - - Added support for custom memory allocators. - (New API function: libdeflate_set_memory_allocator()) - - Added support for building the library in freestanding mode. - - Building libdeflate no longer requires CPPFLAGS=-Icommon. - -Version 1.5: - Fixed up stdcall support on 32-bit Windows: the functions are - now exported using both suffixed and non-suffixed names, and - fixed libdeflate.h to be MSVC-compatible again. - -Version 1.4: - The 32-bit Windows build of libdeflate now uses the "stdcall" - calling convention instead of "cdecl". If you're calling - libdeflate.dll directly from C or C++, you'll need to recompile - your code. If you're calling it from another language, or - calling it indirectly using LoadLibrary(), you'll need to update - your code to use the stdcall calling convention. - - The Makefile now supports building libdeflate as a shared - library (.dylib) on macOS. - - Fixed a bug where support for certain optimizations and optional - features (file access hints and more precise timestamps) was - incorrectly omitted when libdeflate was compiled with -Werror. - - Added 'make check' target to the Makefile. - - Added CI configuration files. - -Version 1.3: - `make install` now supports customizing the directories into - which binaries, headers, and libraries are installed. - - `make install` now installs into /usr/local by default. - To change it, use e.g. `make install PREFIX=/usr`. - - `make install` now works on more platforms. - - The Makefile now supports overriding the optimization flags. - - The compression functions now correctly handle an output data - buffer >= 4 GiB in size, and `gzip` and `gunzip` now correctly - handle multi-gigabyte files (if enough memory is available). - -Version 1.2: - Slight improvements to decompression speed. - - Added an AVX-512BW implementation of Adler-32. - - The Makefile now supports a user-specified installation PREFIX. - - Fixed build error with some Visual Studio versions. - -Version 1.1: - Fixed crash in CRC-32 code when the prebuilt libdeflate for - 32-bit Windows was called by a program built with Visual Studio. - - Improved the worst-case decompression speed of malicious data. - - Fixed build error when compiling for an ARM processor without - hardware floating point support. - - Improved performance on the PowerPC64 architecture. - - Added soname to libdeflate.so, to make packaging easier. - - Added 'make install' target to the Makefile. - - The Makefile now supports user-specified CPPFLAGS. - - The Windows binary releases now include the import library for - libdeflate.dll. libdeflate.lib is now the import library, and - libdeflatestatic.lib is the static library. - -Version 1.0: - Added support for multi-member gzip files. - - Moved architecture-specific code into subdirectories. If you - aren't using the provided Makefile to build libdeflate, you now - need to compile lib/*.c and lib/*/*.c instead of just lib/*.c. - - Added an ARM PMULL implementation of CRC-32, which speeds up - gzip compression and decompression on 32-bit and 64-bit ARM - processors that have the Cryptography Extensions. - - Improved detection of CPU features, resulting in accelerated - functions being used in more cases. This includes: - - - Detect CPU features on 32-bit x86, not just 64-bit as was - done previously. - - - Detect CPU features on ARM, both 32 and 64-bit. - (Limited to Linux only currently.) - -Version 0.8: - Build fixes for certain platforms and compilers. - - libdeflate now produces the same output on all CPU architectures. - - Improved documentation for building libdeflate on Windows. - -Version 0.7: - Fixed a very rare bug that caused data to be compressed incorrectly. - The bug affected compression levels 7 and below since libdeflate v0.2. - Although there have been no user reports of the bug, and I believe it - would have been highly unlikely to encounter on realistic data, it could - occur on data specially crafted to reproduce it. - - Fixed a compilation error when building with clang 3.7. - -Version 0.6: - Various improvements to the gzip program's behavior. - - Faster CRC-32 on AVX-capable processors. - - Other minor changes. - -Version 0.5: - The CRC-32 checksum algorithm has been optimized with carryless - multiplication instructions for x86_64 (PCLMUL). This speeds up gzip - compression and decompression. - - Build fixes for certain platforms and compilers. - - Added more test programs and scripts. - - libdeflate is now entirely MIT-licensed. - -Version 0.4: - The Adler-32 checksum algorithm has been optimized with vector - instructions for x86_64 (SSE2 and AVX2) and ARM (NEON). This speeds up - zlib compression and decompression. - - To avoid naming collisions, functions and definitions in libdeflate's - API have been renamed to be prefixed with "libdeflate_" or - "LIBDEFLATE_". Programs using the old API will need to be updated. - - Various bug fixes and other improvements. - -Version 0.3: - Some bug fixes and other minor changes. - -Version 0.2: - Implemented a new block splitting algorithm which typically improves the - compression ratio slightly at all compression levels. - - The compressor now outputs each block using the cheapest type (dynamic - Huffman, static Huffman, or uncompressed). - - The gzip program has received an overhaul and now behaves more like the - standard version. - - Build system updates, including: some build options were changed and - some build options were removed, and the default 'make' target now - includes the gzip program as well as the library. - -Version 0.1: - Initial official release. diff --git a/util/compress/libdeflate/README.md b/util/compress/libdeflate/README.md deleted file mode 100644 index 9342e9e9b7..0000000000 --- a/util/compress/libdeflate/README.md +++ /dev/null @@ -1,283 +0,0 @@ -# Overview - -libdeflate is a library for fast, whole-buffer DEFLATE-based compression and -decompression. - -The supported formats are: - -- DEFLATE (raw) -- zlib (a.k.a. DEFLATE with a zlib wrapper) -- gzip (a.k.a. DEFLATE with a gzip wrapper) - -libdeflate is heavily optimized. It is significantly faster than the zlib -library, both for compression and decompression, and especially on x86 -processors. In addition, libdeflate provides optional high compression modes -that provide a better compression ratio than the zlib's "level 9". - -libdeflate itself is a library, but the following command-line programs which -use this library are also provided: - -* gzip (or gunzip), a program which mostly behaves like the standard equivalent, - except that it does not yet have good streaming support and therefore does not - yet support very large files -* benchmark, a program for benchmarking in-memory compression and decompression - -## Table of Contents - -- [Building](#building) - - [For UNIX](#for-unix) - - [For macOS](#for-macos) - - [For Windows](#for-windows) - - [Using Cygwin](#using-cygwin) - - [Using MSYS2](#using-msys2) -- [API](#api) -- [Bindings for other programming languages](#bindings-for-other-programming-languages) -- [DEFLATE vs. zlib vs. gzip](#deflate-vs-zlib-vs-gzip) -- [Compression levels](#compression-levels) -- [Motivation](#motivation) -- [License](#license) - - -# Building - -## For UNIX - -Just run `make`, then (if desired) `make install`. You need GNU Make and either -GCC or Clang. GCC is recommended because it builds slightly faster binaries. - -By default, the following targets are built: the static library `libdeflate.a`, -the shared library `libdeflate.so`, the `gzip` program, and the `gunzip` program -(which is actually just a hard link to `gzip`). Benchmarking and test programs -such as `benchmark` are not built by default. You can run `make help` to -display the available build targets. - -There are also many options which can be set on the `make` command line, e.g. to -omit library features or to customize the directories into which `make install` -installs files. See the Makefile for details. - -## For macOS - -Prebuilt macOS binaries can be installed with [Homebrew](https://brew.sh): - - brew install libdeflate - -But if you need to build the binaries yourself, see the section for UNIX above. - -## For Windows - -Prebuilt Windows binaries can be downloaded from -https://github.com/ebiggers/libdeflate/releases. But if you need to build the -binaries yourself, MinGW (gcc) is the recommended compiler to use. If you're -performing the build *on* Windows (as opposed to cross-compiling for Windows on -Linux, for example), you'll need to follow the directions in **one** of the two -sections below to set up a minimal UNIX-compatible environment using either -Cygwin or MSYS2, then do the build. (Other MinGW distributions may not work, as -they often omit basic UNIX tools such as `sh`.) - -Alternatively, libdeflate may be built using the Visual Studio toolchain by -running `nmake /f Makefile.msc`. However, while this is supported in the sense -that it will produce working binaries, it is not recommended because the -binaries built with MinGW will be significantly faster. - -Also note that 64-bit binaries are faster than 32-bit binaries and should be -preferred whenever possible. - -### Using Cygwin - -Run the Cygwin installer, available from https://cygwin.com/setup-x86_64.exe. -When you get to the package selection screen, choose the following additional -packages from category "Devel": - -- git -- make -- mingw64-i686-binutils -- mingw64-i686-gcc-g++ -- mingw64-x86_64-binutils -- mingw64-x86_64-gcc-g++ - -(You may skip the mingw64-i686 packages if you don't need to build 32-bit -binaries.) - -After the installation finishes, open a Cygwin terminal. Then download -libdeflate's source code (if you haven't already) and `cd` into its directory: - - git clone https://github.com/ebiggers/libdeflate - cd libdeflate - -(Note that it's not required to use `git`; an alternative is to extract a .zip -or .tar.gz archive of the source code downloaded from the releases page. -Also, in case you need to find it in the file browser, note that your home -directory in Cygwin is usually located at `C:\cygwin64\home\`.) - -Then, to build 64-bit binaries: - - make CC=x86_64-w64-mingw32-gcc - -or to build 32-bit binaries: - - make CC=i686-w64-mingw32-gcc - -### Using MSYS2 - -Run the MSYS2 installer, available from http://www.msys2.org/. After -installing, open an MSYS2 shell and run: - - pacman -Syu - -Say `y`, then when it's finished, close the shell window and open a new one. -Then run the same command again: - - pacman -Syu - -Then, install the packages needed to build libdeflate: - - pacman -S git \ - make \ - mingw-w64-i686-binutils \ - mingw-w64-i686-gcc \ - mingw-w64-x86_64-binutils \ - mingw-w64-x86_64-gcc - -(You may skip the mingw-w64-i686 packages if you don't need to build 32-bit -binaries.) - -Then download libdeflate's source code (if you haven't already): - - git clone https://github.com/ebiggers/libdeflate - -(Note that it's not required to use `git`; an alternative is to extract a .zip -or .tar.gz archive of the source code downloaded from the releases page. -Also, in case you need to find it in the file browser, note that your home -directory in MSYS2 is usually located at `C:\msys64\home\`.) - -Then, to build 64-bit binaries, open "MSYS2 MinGW 64-bit" from the Start menu -and run the following commands: - - cd libdeflate - make clean - make - -Or to build 32-bit binaries, do the same but use "MSYS2 MinGW 32-bit" instead. - -# API - -libdeflate has a simple API that is not zlib-compatible. You can create -compressors and decompressors and use them to compress or decompress buffers. -See libdeflate.h for details. - -There is currently no support for streaming. This has been considered, but it -always significantly increases complexity and slows down fast paths. -Unfortunately, at this point it remains a future TODO. So: if your application -compresses data in "chunks", say, less than 1 MB in size, then libdeflate is a -great choice for you; that's what it's designed to do. This is perfect for -certain use cases such as transparent filesystem compression. But if your -application compresses large files as a single compressed stream, similarly to -the `gzip` program, then libdeflate isn't for you. - -Note that with chunk-based compression, you generally should have the -uncompressed size of each chunk stored outside of the compressed data itself. -This enables you to allocate an output buffer of the correct size without -guessing. However, libdeflate's decompression routines do optionally provide -the actual number of output bytes in case you need it. - -Windows developers: note that the calling convention of libdeflate.dll is -"stdcall" -- the same as the Win32 API. If you call into libdeflate.dll using a -non-C/C++ language, or dynamically using LoadLibrary(), make sure to use the -stdcall convention. Using the wrong convention may crash your application. -(Note: older versions of libdeflate used the "cdecl" convention instead.) - -# Bindings for other programming languages - -The libdeflate project itself only provides a C library. If you need to use -libdeflate from a programming language other than C or C++, consider using the -following bindings: - -* C#: [LibDeflate.NET](https://github.com/jzebedee/LibDeflate.NET) -* Go: [go-libdeflate](https://github.com/4kills/go-libdeflate) -* Java: [libdeflate-java](https://github.com/astei/libdeflate-java) -* Julia: [LibDeflate.jl](https://github.com/jakobnissen/LibDeflate.jl) -* Python: [deflate](https://github.com/dcwatson/deflate) -* Ruby: [libdeflate-ruby](https://github.com/kaorimatz/libdeflate-ruby) -* Rust: [libdeflater](https://github.com/adamkewley/libdeflater) - -Note: these are third-party projects which haven't necessarily been vetted by -the authors of libdeflate. Please direct all questions, bugs, and improvements -for these bindings to their authors. - -# DEFLATE vs. zlib vs. gzip - -The DEFLATE format ([rfc1951](https://www.ietf.org/rfc/rfc1951.txt)), the zlib -format ([rfc1950](https://www.ietf.org/rfc/rfc1950.txt)), and the gzip format -([rfc1952](https://www.ietf.org/rfc/rfc1952.txt)) are commonly confused with -each other as well as with the [zlib software library](http://zlib.net), which -actually supports all three formats. libdeflate (this library) also supports -all three formats. - -Briefly, DEFLATE is a raw compressed stream, whereas zlib and gzip are different -wrappers for this stream. Both zlib and gzip include checksums, but gzip can -include extra information such as the original filename. Generally, you should -choose a format as follows: - -- If you are compressing whole files with no subdivisions, similar to the `gzip` - program, you probably should use the gzip format. -- Otherwise, if you don't need the features of the gzip header and footer but do - still want a checksum for corruption detection, you probably should use the - zlib format. -- Otherwise, you probably should use raw DEFLATE. This is ideal if you don't - need checksums, e.g. because they're simply not needed for your use case or - because you already compute your own checksums that are stored separately from - the compressed stream. - -Note that gzip and zlib streams can be distinguished from each other based on -their starting bytes, but this is not necessarily true of raw DEFLATE streams. - -# Compression levels - -An often-underappreciated fact of compression formats such as DEFLATE is that -there are an enormous number of different ways that a given input could be -compressed. Different algorithms and different amounts of computation time will -result in different compression ratios, while remaining equally compatible with -the decompressor. - -For this reason, the commonly used zlib library provides nine compression -levels. Level 1 is the fastest but provides the worst compression; level 9 -provides the best compression but is the slowest. It defaults to level 6. -libdeflate uses this same design but is designed to improve on both zlib's -performance *and* compression ratio at every compression level. In addition, -libdeflate's levels go [up to 12](https://xkcd.com/670/) to make room for a -minimum-cost-path based algorithm (sometimes called "optimal parsing") that can -significantly improve on zlib's compression ratio. - -If you are using DEFLATE (or zlib, or gzip) in your application, you should test -different levels to see which works best for your application. - -# Motivation - -Despite DEFLATE's widespread use mainly through the zlib library, in the -compression community this format from the early 1990s is often considered -obsolete. And in a few significant ways, it is. - -So why implement DEFLATE at all, instead of focusing entirely on -bzip2/LZMA/xz/LZ4/LZX/ZSTD/Brotli/LZHAM/LZFSE/[insert cool new format here]? - -To do something better, you need to understand what came before. And it turns -out that most ideas from DEFLATE are still relevant. Many of the newer formats -share a similar structure as DEFLATE, with different tweaks. The effects of -trivial but very useful tweaks, such as increasing the sliding window size, are -often confused with the effects of nontrivial but less useful tweaks. And -actually, many of these formats are similar enough that common algorithms and -optimizations (e.g. those dealing with LZ77 matchfinding) can be reused. - -In addition, comparing compressors fairly is difficult because the performance -of a compressor depends heavily on optimizations which are not intrinsic to the -compression format itself. In this respect, the zlib library sometimes compares -poorly to certain newer code because zlib is not well optimized for modern -processors. libdeflate addresses this by providing an optimized DEFLATE -implementation which can be used for benchmarking purposes. And, of course, -real applications can use it as well. - -# License - -libdeflate is [MIT-licensed](COPYING). - -I am not aware of any patents or patent applications relevant to libdeflate. diff --git a/util/compress/libdeflate/common/common_defs.h b/util/compress/libdeflate/common/common_defs.h deleted file mode 100644 index d56c5cf9b4..0000000000 --- a/util/compress/libdeflate/common/common_defs.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - * common_defs.h - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef COMMON_COMMON_DEFS_H -#define COMMON_COMMON_DEFS_H - -#ifdef __GNUC__ -# include "compiler_gcc.h" -#elif defined(_MSC_VER) -# include "compiler_msc.h" -#else -# pragma message("Unrecognized compiler. Please add a header file for your compiler. Compilation will proceed, but performance may suffer!") -#endif - -/* ========================================================================== */ -/* Type definitions */ -/* ========================================================================== */ - -#include /* size_t */ - -#ifndef __bool_true_false_are_defined -# include /* bool */ -#endif - -/* Fixed-width integer types */ -#include -typedef uint8_t u8; -typedef uint16_t u16; -typedef uint32_t u32; -typedef uint64_t u64; -typedef int8_t s8; -typedef int16_t s16; -typedef int32_t s32; -typedef int64_t s64; - -/* - * Word type of the target architecture. Use 'size_t' instead of 'unsigned - * long' to account for platforms such as Windows that use 32-bit 'unsigned - * long' on 64-bit architectures. - */ -typedef size_t machine_word_t; - -/* Number of bytes in a word */ -#define WORDBYTES ((int)sizeof(machine_word_t)) - -/* Number of bits in a word */ -#define WORDBITS (8 * WORDBYTES) - -/* ========================================================================== */ -/* Optional compiler features */ -/* ========================================================================== */ - -/* LIBEXPORT - export a function from a shared library */ -#ifndef LIBEXPORT -# define LIBEXPORT -#endif - -/* inline - suggest that a function be inlined */ -#ifndef inline -# define inline -#endif - -/* forceinline - force a function to be inlined, if possible */ -#ifndef forceinline -# define forceinline inline -#endif - -/* restrict - annotate a non-aliased pointer */ -#ifndef restrict -# define restrict -#endif - -/* likely(expr) - hint that an expression is usually true */ -#ifndef likely -# define likely(expr) (expr) -#endif - -/* unlikely(expr) - hint that an expression is usually false */ -#ifndef unlikely -# define unlikely(expr) (expr) -#endif - -/* prefetchr(addr) - prefetch into L1 cache for read */ -#ifndef prefetchr -# define prefetchr(addr) -#endif - -/* prefetchw(addr) - prefetch into L1 cache for write */ -#ifndef prefetchw -# define prefetchw(addr) -#endif - -/* Does the compiler support the 'target' function attribute? */ -#ifndef COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE -# define COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE 0 -#endif - -/* Which targets are supported with the 'target' function attribute? */ -#ifndef COMPILER_SUPPORTS_BMI2_TARGET -# define COMPILER_SUPPORTS_BMI2_TARGET 0 -#endif -#ifndef COMPILER_SUPPORTS_AVX_TARGET -# define COMPILER_SUPPORTS_AVX_TARGET 0 -#endif -#ifndef COMPILER_SUPPORTS_AVX512BW_TARGET -# define COMPILER_SUPPORTS_AVX512BW_TARGET 0 -#endif - -/* - * Which targets are supported with the 'target' function attribute and have - * intrinsics that work within 'target'-ed functions? - */ -#ifndef COMPILER_SUPPORTS_SSE2_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_SSE2_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_PCLMUL_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_PCLMUL_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_AVX2_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_AVX2_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_AVX512BW_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_AVX512BW_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_NEON_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_NEON_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_PMULL_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_PMULL_TARGET_INTRINSICS 0 -#endif -#ifndef COMPILER_SUPPORTS_CRC32_TARGET_INTRINSICS -# define COMPILER_SUPPORTS_CRC32_TARGET_INTRINSICS 0 -#endif - -/* _aligned_attribute(n) - declare that the annotated variable, or variables of - * the annotated type, are to be aligned on n-byte boundaries */ -#ifndef _aligned_attribute -#endif - -/* ========================================================================== */ -/* Miscellaneous macros */ -/* ========================================================================== */ - -#define ARRAY_LEN(A) (sizeof(A) / sizeof((A)[0])) -#define MIN(a, b) ((a) <= (b) ? (a) : (b)) -#define MAX(a, b) ((a) >= (b) ? (a) : (b)) -#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define STATIC_ASSERT(expr) ((void)sizeof(char[1 - 2 * !(expr)])) -#define ALIGN(n, a) (((n) + (a) - 1) & ~((a) - 1)) - -/* ========================================================================== */ -/* Endianness handling */ -/* ========================================================================== */ - -/* - * CPU_IS_LITTLE_ENDIAN() - a macro which evaluates to 1 if the CPU is little - * endian or 0 if it is big endian. The macro should be defined in a way such - * that the compiler can evaluate it at compilation time. If not defined, a - * fallback is used. - */ -#ifndef CPU_IS_LITTLE_ENDIAN -static forceinline int CPU_IS_LITTLE_ENDIAN(void) -{ - union { - unsigned int v; - unsigned char b; - } u; - u.v = 1; - return u.b; -} -#endif - -/* bswap16(n) - swap the bytes of a 16-bit integer */ -#ifndef bswap16 -static forceinline u16 bswap16(u16 n) -{ - return (n << 8) | (n >> 8); -} -#endif - -/* bswap32(n) - swap the bytes of a 32-bit integer */ -#ifndef bswap32 -static forceinline u32 bswap32(u32 n) -{ - return ((n & 0x000000FF) << 24) | - ((n & 0x0000FF00) << 8) | - ((n & 0x00FF0000) >> 8) | - ((n & 0xFF000000) >> 24); -} -#endif - -/* bswap64(n) - swap the bytes of a 64-bit integer */ -#ifndef bswap64 -static forceinline u64 bswap64(u64 n) -{ - return ((n & 0x00000000000000FF) << 56) | - ((n & 0x000000000000FF00) << 40) | - ((n & 0x0000000000FF0000) << 24) | - ((n & 0x00000000FF000000) << 8) | - ((n & 0x000000FF00000000) >> 8) | - ((n & 0x0000FF0000000000) >> 24) | - ((n & 0x00FF000000000000) >> 40) | - ((n & 0xFF00000000000000) >> 56); -} -#endif - -#define le16_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? (n) : bswap16(n)) -#define le32_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? (n) : bswap32(n)) -#define le64_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? (n) : bswap64(n)) -#define be16_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? bswap16(n) : (n)) -#define be32_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? bswap32(n) : (n)) -#define be64_bswap(n) (CPU_IS_LITTLE_ENDIAN() ? bswap64(n) : (n)) - -/* ========================================================================== */ -/* Unaligned memory accesses */ -/* ========================================================================== */ - -/* - * UNALIGNED_ACCESS_IS_FAST should be defined to 1 if unaligned memory accesses - * can be performed efficiently on the target platform. - */ -#ifndef UNALIGNED_ACCESS_IS_FAST -# define UNALIGNED_ACCESS_IS_FAST 0 -#endif - -/* ========================================================================== */ -/* Bit scan functions */ -/* ========================================================================== */ - -/* - * Bit Scan Reverse (BSR) - find the 0-based index (relative to the least - * significant end) of the *most* significant 1 bit in the input value. The - * input value must be nonzero! - */ - -#ifndef bsr32 -static forceinline unsigned -bsr32(u32 n) -{ - unsigned i = 0; - while ((n >>= 1) != 0) - i++; - return i; -} -#endif - -#ifndef bsr64 -static forceinline unsigned -bsr64(u64 n) -{ - unsigned i = 0; - while ((n >>= 1) != 0) - i++; - return i; -} -#endif - -static forceinline unsigned -bsrw(machine_word_t n) -{ - STATIC_ASSERT(WORDBITS == 32 || WORDBITS == 64); - if (WORDBITS == 32) - return bsr32(n); - else - return bsr64(n); -} - -/* - * Bit Scan Forward (BSF) - find the 0-based index (relative to the least - * significant end) of the *least* significant 1 bit in the input value. The - * input value must be nonzero! - */ - -#ifndef bsf32 -static forceinline unsigned -bsf32(u32 n) -{ - unsigned i = 0; - while ((n & 1) == 0) { - i++; - n >>= 1; - } - return i; -} -#endif - -#ifndef bsf64 -static forceinline unsigned -bsf64(u64 n) -{ - unsigned i = 0; - while ((n & 1) == 0) { - i++; - n >>= 1; - } - return i; -} -#endif - -static forceinline unsigned -bsfw(machine_word_t n) -{ - STATIC_ASSERT(WORDBITS == 32 || WORDBITS == 64); - if (WORDBITS == 32) - return bsf32(n); - else - return bsf64(n); -} - -#endif /* COMMON_COMMON_DEFS_H */ diff --git a/util/compress/libdeflate/common/compiler_gcc.h b/util/compress/libdeflate/common/compiler_gcc.h deleted file mode 100644 index 2a45b05f34..0000000000 --- a/util/compress/libdeflate/common/compiler_gcc.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * compiler_gcc.h - definitions for the GNU C Compiler. This also handles clang - * and the Intel C Compiler (icc). - * - * TODO: icc is not well tested, so some things are currently disabled even - * though they maybe can be enabled on some icc versions. - */ - -#if !defined(__clang__) && !defined(__INTEL_COMPILER) -# define GCC_PREREQ(major, minor) \ - (__GNUC__ > (major) || \ - (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) -#else -# define GCC_PREREQ(major, minor) 0 -#endif - -/* Note: only check the clang version when absolutely necessary! - * "Vendors" such as Apple can use different version numbers. */ -#ifdef __clang__ -# ifdef __apple_build_version__ -# define CLANG_PREREQ(major, minor, apple_version) \ - (__apple_build_version__ >= (apple_version)) -# else -# define CLANG_PREREQ(major, minor, apple_version) \ - (__clang_major__ > (major) || \ - (__clang_major__ == (major) && __clang_minor__ >= (minor))) -# endif -#else -# define CLANG_PREREQ(major, minor, apple_version) 0 -#endif - -#ifndef __has_attribute -# define __has_attribute(attribute) 0 -#endif -#ifndef __has_feature -# define __has_feature(feature) 0 -#endif -#ifndef __has_builtin -# define __has_builtin(builtin) 0 -#endif - -#ifdef _WIN32 -# define LIBEXPORT __declspec(dllexport) -#else -# define LIBEXPORT __attribute__((visibility("default"))) -#endif - -#define inline inline -#define forceinline inline __attribute__((always_inline)) -#define restrict __restrict__ -#define likely(expr) __builtin_expect(!!(expr), 1) -#define unlikely(expr) __builtin_expect(!!(expr), 0) -#define prefetchr(addr) __builtin_prefetch((addr), 0) -#define prefetchw(addr) __builtin_prefetch((addr), 1) -#define _aligned_attribute(n) __attribute__((aligned(n))) - -#define COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE \ - (GCC_PREREQ(4, 4) || __has_attribute(target)) - -#if COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE - -# if defined(__i386__) || defined(__x86_64__) - -# define COMPILER_SUPPORTS_PCLMUL_TARGET \ - (GCC_PREREQ(4, 4) || __has_builtin(__builtin_ia32_pclmulqdq128)) - -# define COMPILER_SUPPORTS_AVX_TARGET \ - (GCC_PREREQ(4, 6) || __has_builtin(__builtin_ia32_maxps256)) - -# define COMPILER_SUPPORTS_BMI2_TARGET \ - (GCC_PREREQ(4, 7) || __has_builtin(__builtin_ia32_pdep_di)) - -# define COMPILER_SUPPORTS_AVX2_TARGET \ - (GCC_PREREQ(4, 7) || __has_builtin(__builtin_ia32_psadbw256)) - -# define COMPILER_SUPPORTS_AVX512BW_TARGET \ - (GCC_PREREQ(5, 1) || __has_builtin(__builtin_ia32_psadbw512)) - - /* - * Prior to gcc 4.9 (r200349) and clang 3.8 (r239883), x86 intrinsics - * not available in the main target could not be used in 'target' - * attribute functions. Unfortunately clang has no feature test macro - * for this so we have to check its version. - */ -# if GCC_PREREQ(4, 9) || CLANG_PREREQ(3, 8, 7030000) -# define COMPILER_SUPPORTS_SSE2_TARGET_INTRINSICS 1 -# define COMPILER_SUPPORTS_PCLMUL_TARGET_INTRINSICS \ - COMPILER_SUPPORTS_PCLMUL_TARGET -# define COMPILER_SUPPORTS_AVX2_TARGET_INTRINSICS \ - COMPILER_SUPPORTS_AVX2_TARGET -# define COMPILER_SUPPORTS_AVX512BW_TARGET_INTRINSICS \ - COMPILER_SUPPORTS_AVX512BW_TARGET -# endif - -# elif defined(__arm__) || defined(__aarch64__) - - /* - * Determine whether NEON and crypto intrinsics are supported. - * - * With gcc prior to 6.1, (r230411 for arm32, r226563 for arm64), neither - * was available unless enabled in the main target. - * - * But even after that, to include (which contains both the - * basic NEON intrinsics and the crypto intrinsics) the main target still - * needs to have: - * - gcc: hardware floating point support - * - clang: NEON support (but not necessarily crypto support) - */ -# if (GCC_PREREQ(6, 1) && defined(__ARM_FP)) || \ - (defined(__clang__) && defined(__ARM_NEON)) -# define COMPILER_SUPPORTS_NEON_TARGET_INTRINSICS 1 - /* - * The crypto intrinsics are broken on arm32 with clang, even when using - * -mfpu=crypto-neon-fp-armv8, because clang's puts them - * behind __aarch64__. Undefine __ARM_FEATURE_CRYPTO in that case... - */ -# if defined(__clang__) && defined(__arm__) -# undef __ARM_FEATURE_CRYPTO -# elif __has_builtin(__builtin_neon_vmull_p64) || !defined(__clang__) -# define COMPILER_SUPPORTS_PMULL_TARGET_INTRINSICS 1 -# endif -# endif - - /* - * Determine whether CRC32 intrinsics are supported. - * - * With gcc r274827 or later (gcc 10.1+, 9.3+, or 8.4+), or with clang, - * they work as expected. (Well, not quite. There's still a bug, but we - * have to work around it later when including arm_acle.h.) - */ -# if GCC_PREREQ(10, 1) || \ - (GCC_PREREQ(9, 3) && !GCC_PREREQ(10, 0)) || \ - (GCC_PREREQ(8, 4) && !GCC_PREREQ(9, 0)) || \ - (defined(__clang__) && __has_builtin(__builtin_arm_crc32b)) -# define COMPILER_SUPPORTS_CRC32_TARGET_INTRINSICS 1 -# endif - -# endif /* __arm__ || __aarch64__ */ - -#endif /* COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE */ - -/* - * Prior to gcc 5.1 and clang 3.9, emmintrin.h only defined vectors of signed - * integers (e.g. __v4si), not vectors of unsigned integers (e.g. __v4su). But - * we need the unsigned ones in order to avoid signed integer overflow, which is - * undefined behavior. Add the missing definitions for the unsigned ones if - * needed. - */ -#if (GCC_PREREQ(4, 0) && !GCC_PREREQ(5, 1)) || \ - (defined(__clang__) && !CLANG_PREREQ(3, 9, 8020000)) || \ - defined(__INTEL_COMPILER) -typedef unsigned long long __v2du __attribute__((__vector_size__(16))); -typedef unsigned int __v4su __attribute__((__vector_size__(16))); -typedef unsigned short __v8hu __attribute__((__vector_size__(16))); -typedef unsigned char __v16qu __attribute__((__vector_size__(16))); -typedef unsigned long long __v4du __attribute__((__vector_size__(32))); -typedef unsigned int __v8su __attribute__((__vector_size__(32))); -typedef unsigned short __v16hu __attribute__((__vector_size__(32))); -typedef unsigned char __v32qu __attribute__((__vector_size__(32))); -#endif - -#ifdef __INTEL_COMPILER -typedef int __v16si __attribute__((__vector_size__(64))); -typedef short __v32hi __attribute__((__vector_size__(64))); -typedef char __v64qi __attribute__((__vector_size__(64))); -#endif - -/* Newer gcc supports __BYTE_ORDER__. Older gcc doesn't. */ -#ifdef __BYTE_ORDER__ -# define CPU_IS_LITTLE_ENDIAN() (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -#endif - -#if GCC_PREREQ(4, 8) || __has_builtin(__builtin_bswap16) -# define bswap16 __builtin_bswap16 -#endif - -#if GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap32) -# define bswap32 __builtin_bswap32 -#endif - -#if GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap64) -# define bswap64 __builtin_bswap64 -#endif - -#if defined(__x86_64__) || defined(__i386__) || \ - defined(__ARM_FEATURE_UNALIGNED) || defined(__powerpc64__) || \ - /* - * For all compilation purposes, WebAssembly behaves like any other CPU - * instruction set. Even though WebAssembly engine might be running on top - * of different actual CPU architectures, the WebAssembly spec itself - * permits unaligned access and it will be fast on most of those platforms, - * and simulated at the engine level on others, so it's worth treating it - * as a CPU architecture with fast unaligned access. - */ defined(__wasm__) -# define UNALIGNED_ACCESS_IS_FAST 1 -#endif - -#define bsr32(n) (31 - __builtin_clz(n)) -#define bsr64(n) (63 - __builtin_clzll(n)) -#define bsf32(n) __builtin_ctz(n) -#define bsf64(n) __builtin_ctzll(n) diff --git a/util/compress/libdeflate/common/compiler_msc.h b/util/compress/libdeflate/common/compiler_msc.h deleted file mode 100644 index 18cfa128f1..0000000000 --- a/util/compress/libdeflate/common/compiler_msc.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * compiler_msc.h - definitions for the Microsoft C Compiler - */ - -#include -#include /* for _byteswap_*() */ - -#define LIBEXPORT __declspec(dllexport) - -/* - * Old versions (e.g. VS2010) of MSC don't have the C99 header stdbool.h. - * Beware: the below replacement isn't fully standard, since normally any value - * != 0 should be implicitly cast to a bool with value 1... but that doesn't - * happen if bool is really just an 'int'. - */ -typedef int bool; -#define true 1 -#define false 0 -#define __bool_true_false_are_defined 1 - -/* Define ssize_t */ -#ifdef _WIN64 -typedef long long ssize_t; -#else -typedef int ssize_t; -#endif - -/* Assume a little endian architecture with fast unaligned access */ -#define CPU_IS_LITTLE_ENDIAN() 1 -#define UNALIGNED_ACCESS_IS_FAST 1 - -/* __restrict has nonstandard behavior; don't use it */ -#define restrict - -/* ... but we can use __inline and __forceinline */ -#define inline __inline -#define forceinline __forceinline - -/* Byte swap functions */ -#define bswap16 _byteswap_ushort -#define bswap32 _byteswap_ulong -#define bswap64 _byteswap_uint64 - -/* Bit scan functions (32-bit) */ - -static forceinline unsigned -bsr32(uint32_t n) -{ - _BitScanReverse(&n, n); - return n; -} -#define bsr32 bsr32 - -static forceinline unsigned -bsf32(uint32_t n) -{ - _BitScanForward(&n, n); - return n; -} -#define bsf32 bsf32 - -#ifdef _M_X64 /* Bit scan functions (64-bit) */ - -static forceinline unsigned -bsr64(uint64_t n) -{ - _BitScanReverse64(&n, n); - return n; -} -#define bsr64 bsr64 - -static forceinline unsigned -bsf64(uint64_t n) -{ - _BitScanForward64(&n, n); - return n; -} -#define bsf64 bsf64 - -#endif /* _M_X64 */ diff --git a/util/compress/libdeflate/lib/adler32.c b/util/compress/libdeflate/lib/adler32.c deleted file mode 100644 index 32ab0ceb5c..0000000000 --- a/util/compress/libdeflate/lib/adler32.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * adler32.c - Adler-32 checksum algorithm - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "lib_common.h" -#include "libdeflate.h" - -/* The Adler-32 divisor, or "base", value. */ -#define DIVISOR 65521 - -/* - * MAX_CHUNK_SIZE is the most bytes that can be processed without the - * possibility of s2 overflowing when it is represented as an unsigned 32-bit - * integer. This value was computed using the following Python script: - * - * divisor = 65521 - * count = 0 - * s1 = divisor - 1 - * s2 = divisor - 1 - * while True: - * s1 += 0xFF - * s2 += s1 - * if s2 > 0xFFFFFFFF: - * break - * count += 1 - * print(count) - * - * Note that to get the correct worst-case value, we must assume that every byte - * has value 0xFF and that s1 and s2 started with the highest possible values - * modulo the divisor. - */ -#define MAX_CHUNK_SIZE 5552 - -typedef u32 (*adler32_func_t)(u32, const u8 *, size_t); - -/* Include architecture-specific implementations if available */ -#undef DEFAULT_IMPL -#undef DISPATCH -#if defined(__arm__) || defined(__aarch64__) -# include "arm/adler32_impl.h" -#elif defined(__i386__) || defined(__x86_64__) -# include "x86/adler32_impl.h" -#endif - -/* Define a generic implementation if needed */ -#ifndef DEFAULT_IMPL -#define DEFAULT_IMPL adler32_generic -static u32 adler32_generic(u32 adler, const u8 *p, size_t size) -{ - u32 s1 = adler & 0xFFFF; - u32 s2 = adler >> 16; - const u8 * const end = p + size; - - while (p != end) { - size_t chunk_size = MIN(end - p, MAX_CHUNK_SIZE); - const u8 *chunk_end = p + chunk_size; - size_t num_unrolled_iterations = chunk_size / 4; - - while (num_unrolled_iterations--) { - s1 += *p++; - s2 += s1; - s1 += *p++; - s2 += s1; - s1 += *p++; - s2 += s1; - s1 += *p++; - s2 += s1; - } - while (p != chunk_end) { - s1 += *p++; - s2 += s1; - } - s1 %= DIVISOR; - s2 %= DIVISOR; - } - - return (s2 << 16) | s1; -} -#endif /* !DEFAULT_IMPL */ - -#ifdef DISPATCH -static u32 dispatch(u32, const u8 *, size_t); - -static volatile adler32_func_t adler32_impl = dispatch; - -/* Choose the fastest implementation at runtime */ -static u32 dispatch(u32 adler, const u8 *buffer, size_t size) -{ - adler32_func_t f = arch_select_adler32_func(); - - if (f == NULL) - f = DEFAULT_IMPL; - - adler32_impl = f; - return adler32_impl(adler, buffer, size); -} -#else -# define adler32_impl DEFAULT_IMPL /* only one implementation, use it */ -#endif - -LIBDEFLATEEXPORT u32 LIBDEFLATEAPI -libdeflate_adler32(u32 adler, const void *buffer, size_t size) -{ - if (buffer == NULL) /* return initial value */ - return 1; - return adler32_impl(adler, buffer, size); -} diff --git a/util/compress/libdeflate/lib/adler32_vec_template.h b/util/compress/libdeflate/lib/adler32_vec_template.h deleted file mode 100644 index 4eb8c2a829..0000000000 --- a/util/compress/libdeflate/lib/adler32_vec_template.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * adler32_vec_template.h - template for vectorized Adler-32 implementations - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * This file contains a template for vectorized Adler-32 implementations. - * - * The inner loop between reductions modulo 65521 of an unvectorized Adler-32 - * implementation looks something like this: - * - * do { - * s1 += *p; - * s2 += s1; - * } while (++p != chunk_end); - * - * For vectorized calculation of s1, we only need to sum the input bytes. They - * can be accumulated into multiple counters which are eventually summed - * together. - * - * For vectorized calculation of s2, the basic idea is that for each iteration - * that processes N bytes, we can perform the following vectorizable - * calculation: - * - * s2 += N*byte_1 + (N-1)*byte_2 + (N-2)*byte_3 + ... + 1*byte_N - * - * Or, equivalently, we can sum the byte_1...byte_N for each iteration into N - * separate counters, then do the multiplications by N...1 just once at the end - * rather than once per iteration. - * - * Also, we must account for how previous bytes will affect s2 by doing the - * following at beginning of each iteration: - * - * s2 += s1 * N - * - * Furthermore, like s1, "s2" can actually be multiple counters which are - * eventually summed together. - */ - -static u32 ATTRIBUTES -FUNCNAME(u32 adler, const u8 *p, size_t size) -{ - u32 s1 = adler & 0xFFFF; - u32 s2 = adler >> 16; - const u8 * const end = p + size; - const u8 *vend; - const size_t max_chunk_size = - MIN(MAX_CHUNK_SIZE, IMPL_MAX_CHUNK_SIZE) - - (MIN(MAX_CHUNK_SIZE, IMPL_MAX_CHUNK_SIZE) % - IMPL_SEGMENT_SIZE); - - /* Process a byte at a time until the needed alignment is reached */ - if (p != end && (uintptr_t)p % IMPL_ALIGNMENT) { - do { - s1 += *p++; - s2 += s1; - } while (p != end && (uintptr_t)p % IMPL_ALIGNMENT); - s1 %= DIVISOR; - s2 %= DIVISOR; - } - - /* - * Process "chunks" of bytes using vector instructions. Chunk sizes are - * limited to MAX_CHUNK_SIZE, which guarantees that s1 and s2 never - * overflow before being reduced modulo DIVISOR. For vector processing, - * chunk sizes are also made evenly divisible by IMPL_SEGMENT_SIZE and - * may be further limited to IMPL_MAX_CHUNK_SIZE. - */ - STATIC_ASSERT(IMPL_SEGMENT_SIZE % IMPL_ALIGNMENT == 0); - vend = end - ((size_t)(end - p) % IMPL_SEGMENT_SIZE); - while (p != vend) { - size_t chunk_size = MIN((size_t)(vend - p), max_chunk_size); - - s2 += s1 * chunk_size; - - FUNCNAME_CHUNK((const void *)p, (const void *)(p + chunk_size), - &s1, &s2); - - p += chunk_size; - s1 %= DIVISOR; - s2 %= DIVISOR; - } - - /* Process any remaining bytes */ - if (p != end) { - do { - s1 += *p++; - s2 += s1; - } while (p != end); - s1 %= DIVISOR; - s2 %= DIVISOR; - } - - return (s2 << 16) | s1; -} - -#undef FUNCNAME -#undef FUNCNAME_CHUNK -#undef ATTRIBUTES -#undef IMPL_ALIGNMENT -#undef IMPL_SEGMENT_SIZE -#undef IMPL_MAX_CHUNK_SIZE diff --git a/util/compress/libdeflate/lib/arm/adler32_impl.h b/util/compress/libdeflate/lib/arm/adler32_impl.h deleted file mode 100644 index 17e56c0048..0000000000 --- a/util/compress/libdeflate/lib/arm/adler32_impl.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * arm/adler32_impl.h - ARM implementations of Adler-32 checksum algorithm - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_ARM_ADLER32_IMPL_H -#define LIB_ARM_ADLER32_IMPL_H - -#include "cpu_features.h" - -/* NEON implementation */ -#undef DISPATCH_NEON -#if !defined(DEFAULT_IMPL) && \ - (defined(__ARM_NEON) || (ARM_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_NEON_TARGET_INTRINSICS)) -# define FUNCNAME adler32_neon -# define FUNCNAME_CHUNK adler32_neon_chunk -# define IMPL_ALIGNMENT 16 -# define IMPL_SEGMENT_SIZE 32 -/* Prevent unsigned overflow of the 16-bit precision byte counters */ -# define IMPL_MAX_CHUNK_SIZE (32 * (0xFFFF / 0xFF)) -# ifdef __ARM_NEON -# define ATTRIBUTES -# define DEFAULT_IMPL adler32_neon -# else -# ifdef __arm__ -# define ATTRIBUTES __attribute__((target("fpu=neon"))) -# else -# define ATTRIBUTES __attribute__((target("+simd"))) -# endif -# define DISPATCH 1 -# define DISPATCH_NEON 1 -# endif -# include -static forceinline ATTRIBUTES void -adler32_neon_chunk(const uint8x16_t *p, const uint8x16_t * const end, - u32 *s1, u32 *s2) -{ - uint32x4_t v_s1 = (uint32x4_t) { 0, 0, 0, 0 }; - uint32x4_t v_s2 = (uint32x4_t) { 0, 0, 0, 0 }; - uint16x8_t v_byte_sums_a = (uint16x8_t) { 0, 0, 0, 0, 0, 0, 0, 0 }; - uint16x8_t v_byte_sums_b = (uint16x8_t) { 0, 0, 0, 0, 0, 0, 0, 0 }; - uint16x8_t v_byte_sums_c = (uint16x8_t) { 0, 0, 0, 0, 0, 0, 0, 0 }; - uint16x8_t v_byte_sums_d = (uint16x8_t) { 0, 0, 0, 0, 0, 0, 0, 0 }; - - do { - const uint8x16_t bytes1 = *p++; - const uint8x16_t bytes2 = *p++; - uint16x8_t tmp; - - v_s2 += v_s1; - - /* Vector Pairwise Add Long (u8 => u16) */ - tmp = vpaddlq_u8(bytes1); - - /* Vector Pairwise Add and Accumulate Long (u8 => u16) */ - tmp = vpadalq_u8(tmp, bytes2); - - /* Vector Pairwise Add and Accumulate Long (u16 => u32) */ - v_s1 = vpadalq_u16(v_s1, tmp); - - /* Vector Add Wide (u8 => u16) */ - v_byte_sums_a = vaddw_u8(v_byte_sums_a, vget_low_u8(bytes1)); - v_byte_sums_b = vaddw_u8(v_byte_sums_b, vget_high_u8(bytes1)); - v_byte_sums_c = vaddw_u8(v_byte_sums_c, vget_low_u8(bytes2)); - v_byte_sums_d = vaddw_u8(v_byte_sums_d, vget_high_u8(bytes2)); - - } while (p != end); - - /* Vector Shift Left (u32) */ - v_s2 = vqshlq_n_u32(v_s2, 5); - - /* Vector Multiply Accumulate Long (u16 => u32) */ - v_s2 = vmlal_u16(v_s2, vget_low_u16(v_byte_sums_a), (uint16x4_t) { 32, 31, 30, 29 }); - v_s2 = vmlal_u16(v_s2, vget_high_u16(v_byte_sums_a), (uint16x4_t) { 28, 27, 26, 25 }); - v_s2 = vmlal_u16(v_s2, vget_low_u16(v_byte_sums_b), (uint16x4_t) { 24, 23, 22, 21 }); - v_s2 = vmlal_u16(v_s2, vget_high_u16(v_byte_sums_b), (uint16x4_t) { 20, 19, 18, 17 }); - v_s2 = vmlal_u16(v_s2, vget_low_u16(v_byte_sums_c), (uint16x4_t) { 16, 15, 14, 13 }); - v_s2 = vmlal_u16(v_s2, vget_high_u16(v_byte_sums_c), (uint16x4_t) { 12, 11, 10, 9 }); - v_s2 = vmlal_u16(v_s2, vget_low_u16 (v_byte_sums_d), (uint16x4_t) { 8, 7, 6, 5 }); - v_s2 = vmlal_u16(v_s2, vget_high_u16(v_byte_sums_d), (uint16x4_t) { 4, 3, 2, 1 }); - - *s1 += v_s1[0] + v_s1[1] + v_s1[2] + v_s1[3]; - *s2 += v_s2[0] + v_s2[1] + v_s2[2] + v_s2[3]; -} -# include "../adler32_vec_template.h" -#endif /* NEON implementation */ - -#ifdef DISPATCH -static inline adler32_func_t -arch_select_adler32_func(void) -{ - u32 features = get_cpu_features(); - -#ifdef DISPATCH_NEON - if (features & ARM_CPU_FEATURE_NEON) - return adler32_neon; -#endif - return NULL; -} -#endif /* DISPATCH */ - -#endif /* LIB_ARM_ADLER32_IMPL_H */ diff --git a/util/compress/libdeflate/lib/arm/cpu_features.c b/util/compress/libdeflate/lib/arm/cpu_features.c deleted file mode 100644 index 60b1be3eec..0000000000 --- a/util/compress/libdeflate/lib/arm/cpu_features.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * arm/cpu_features.c - feature detection for ARM processors - * - * Copyright 2018 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * ARM processors don't have a standard way for unprivileged programs to detect - * processor features. But, on Linux we can read the AT_HWCAP and AT_HWCAP2 - * values from /proc/self/auxv. - * - * Ideally we'd use the C library function getauxval(), but it's not guaranteed - * to be available: it was only added to glibc in 2.16, and in Android it was - * added to API level 18 for ARM and level 21 for AArch64. - */ - -#include "../cpu_features_common.h" /* must be included first */ -#include "cpu_features.h" - -#if ARM_CPU_FEATURES_ENABLED - -#include -#include -#include -#include - -#define AT_HWCAP 16 -#define AT_HWCAP2 26 - -volatile u32 _cpu_features = 0; - -static void scan_auxv(unsigned long *hwcap, unsigned long *hwcap2) -{ - int fd; - unsigned long auxbuf[32]; - int filled = 0; - int i; - - fd = open("/proc/self/auxv", O_RDONLY); - if (fd < 0) - return; - - for (;;) { - do { - int ret = read(fd, &((char *)auxbuf)[filled], - sizeof(auxbuf) - filled); - if (ret <= 0) { - if (ret < 0 && errno == EINTR) - continue; - goto out; - } - filled += ret; - } while (filled < 2 * sizeof(long)); - - i = 0; - do { - unsigned long type = auxbuf[i]; - unsigned long value = auxbuf[i + 1]; - - if (type == AT_HWCAP) - *hwcap = value; - else if (type == AT_HWCAP2) - *hwcap2 = value; - i += 2; - filled -= 2 * sizeof(long); - } while (filled >= 2 * sizeof(long)); - - memmove(auxbuf, &auxbuf[i], filled); - } -out: - close(fd); -} - -static const struct cpu_feature arm_cpu_feature_table[] = { - {ARM_CPU_FEATURE_NEON, "neon"}, - {ARM_CPU_FEATURE_PMULL, "pmull"}, - {ARM_CPU_FEATURE_CRC32, "crc32"}, -}; - -void setup_cpu_features(void) -{ - u32 features = 0; - unsigned long hwcap = 0; - unsigned long hwcap2 = 0; - - scan_auxv(&hwcap, &hwcap2); - -#ifdef __arm__ - STATIC_ASSERT(sizeof(long) == 4); - if (hwcap & (1 << 12)) /* HWCAP_NEON */ - features |= ARM_CPU_FEATURE_NEON; - if (hwcap2 & (1 << 1)) /* HWCAP2_PMULL */ - features |= ARM_CPU_FEATURE_PMULL; - if (hwcap2 & (1 << 4)) /* HWCAP2_CRC32 */ - features |= ARM_CPU_FEATURE_CRC32; -#else - STATIC_ASSERT(sizeof(long) == 8); - if (hwcap & (1 << 1)) /* HWCAP_ASIMD */ - features |= ARM_CPU_FEATURE_NEON; - if (hwcap & (1 << 4)) /* HWCAP_PMULL */ - features |= ARM_CPU_FEATURE_PMULL; - if (hwcap & (1 << 7)) /* HWCAP_CRC32 */ - features |= ARM_CPU_FEATURE_CRC32; -#endif - - disable_cpu_features_for_testing(&features, arm_cpu_feature_table, - ARRAY_LEN(arm_cpu_feature_table)); - - _cpu_features = features | ARM_CPU_FEATURES_KNOWN; -} - -#endif /* ARM_CPU_FEATURES_ENABLED */ diff --git a/util/compress/libdeflate/lib/arm/cpu_features.h b/util/compress/libdeflate/lib/arm/cpu_features.h deleted file mode 100644 index 69d723598f..0000000000 --- a/util/compress/libdeflate/lib/arm/cpu_features.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * arm/cpu_features.h - feature detection for ARM processors - */ - -#ifndef LIB_ARM_CPU_FEATURES_H -#define LIB_ARM_CPU_FEATURES_H - -#include "../lib_common.h" - -#if (defined(__arm__) || defined(__aarch64__)) && \ - defined(__linux__) && \ - COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE && \ - !defined(FREESTANDING) -# define ARM_CPU_FEATURES_ENABLED 1 -#else -# define ARM_CPU_FEATURES_ENABLED 0 -#endif - -#if ARM_CPU_FEATURES_ENABLED - -#define ARM_CPU_FEATURE_NEON 0x00000001 -#define ARM_CPU_FEATURE_PMULL 0x00000002 -#define ARM_CPU_FEATURE_CRC32 0x00000004 - -#define ARM_CPU_FEATURES_KNOWN 0x80000000 - -extern volatile u32 _cpu_features; - -void setup_cpu_features(void); - -static inline u32 get_cpu_features(void) -{ - if (_cpu_features == 0) - setup_cpu_features(); - return _cpu_features; -} - -#endif /* ARM_CPU_FEATURES_ENABLED */ - -#endif /* LIB_ARM_CPU_FEATURES_H */ diff --git a/util/compress/libdeflate/lib/arm/crc32_impl.h b/util/compress/libdeflate/lib/arm/crc32_impl.h deleted file mode 100644 index 238a85a803..0000000000 --- a/util/compress/libdeflate/lib/arm/crc32_impl.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - * arm/crc32_impl.h - * - * Copyright 2017 Jun He - * Copyright 2018 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_ARM_CRC32_IMPL_H -#define LIB_ARM_CRC32_IMPL_H - -#include "cpu_features.h" - -/* Implementation using ARM CRC32 instructions */ -#undef DISPATCH_ARM -#if !defined(DEFAULT_IMPL) && \ - (defined(__ARM_FEATURE_CRC32) || \ - (ARM_CPU_FEATURES_ENABLED && COMPILER_SUPPORTS_CRC32_TARGET_INTRINSICS)) -# ifdef __ARM_FEATURE_CRC32 -# define ATTRIBUTES -# define DEFAULT_IMPL crc32_arm -# else -# ifdef __arm__ -# ifdef __clang__ -# define ATTRIBUTES __attribute__((target("armv8-a,crc"))) -# else -# define ATTRIBUTES __attribute__((target("arch=armv8-a+crc"))) -# endif -# else -# ifdef __clang__ -# define ATTRIBUTES __attribute__((target("crc"))) -# else -# define ATTRIBUTES __attribute__((target("+crc"))) -# endif -# endif -# define DISPATCH 1 -# define DISPATCH_ARM 1 -# endif - -/* - * gcc's (as of 10.1) version of arm_acle.h for arm32, and clang's (as of - * 10.0.1) version of arm_acle.h for both arm32 and arm64, have a bug where they - * only define the CRC32 functions like __crc32b() when __ARM_FEATURE_CRC32 is - * defined. That prevents them from being used via __attribute__((target)) when - * the main target doesn't have CRC32 support enabled. The actual built-ins - * like __builtin_arm_crc32b() are available and work, however; it's just the - * wrappers in arm_acle.h like __crc32b() that erroneously don't get defined. - * Work around this by manually defining __ARM_FEATURE_CRC32. - */ -#ifndef __ARM_FEATURE_CRC32 -# define __ARM_FEATURE_CRC32 1 -#endif -#include - -static u32 ATTRIBUTES -crc32_arm(u32 remainder, const u8 *p, size_t size) -{ - while (size != 0 && (uintptr_t)p & 7) { - remainder = __crc32b(remainder, *p++); - size--; - } - - while (size >= 32) { - remainder = __crc32d(remainder, le64_bswap(*((u64 *)p + 0))); - remainder = __crc32d(remainder, le64_bswap(*((u64 *)p + 1))); - remainder = __crc32d(remainder, le64_bswap(*((u64 *)p + 2))); - remainder = __crc32d(remainder, le64_bswap(*((u64 *)p + 3))); - p += 32; - size -= 32; - } - - while (size >= 8) { - remainder = __crc32d(remainder, le64_bswap(*(u64 *)p)); - p += 8; - size -= 8; - } - - while (size != 0) { - remainder = __crc32b(remainder, *p++); - size--; - } - - return remainder; -} -#undef ATTRIBUTES -#endif /* Implementation using ARM CRC32 instructions */ - -/* - * CRC-32 folding with ARM Crypto extension-PMULL - * - * This works the same way as the x86 PCLMUL version. - * See x86/crc32_pclmul_template.h for an explanation. - */ -#undef DISPATCH_PMULL -#if !defined(DEFAULT_IMPL) && \ - (defined(__ARM_FEATURE_CRYPTO) || \ - (ARM_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_PMULL_TARGET_INTRINSICS)) && \ - /* not yet tested on big endian, probably needs changes to work there */ \ - (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) -# define FUNCNAME crc32_pmull -# define FUNCNAME_ALIGNED crc32_pmull_aligned -# ifdef __ARM_FEATURE_CRYPTO -# define ATTRIBUTES -# define DEFAULT_IMPL crc32_pmull -# else -# ifdef __arm__ -# define ATTRIBUTES __attribute__((target("fpu=crypto-neon-fp-armv8"))) -# else -# ifdef __clang__ -# define ATTRIBUTES __attribute__((target("crypto"))) -# else -# define ATTRIBUTES __attribute__((target("+crypto"))) -# endif -# endif -# define DISPATCH 1 -# define DISPATCH_PMULL 1 -# endif - -#include - -static forceinline ATTRIBUTES uint8x16_t -clmul_00(uint8x16_t a, uint8x16_t b) -{ - return (uint8x16_t)vmull_p64((poly64_t)vget_low_u8(a), - (poly64_t)vget_low_u8(b)); -} - -static forceinline ATTRIBUTES uint8x16_t -clmul_10(uint8x16_t a, uint8x16_t b) -{ - return (uint8x16_t)vmull_p64((poly64_t)vget_low_u8(a), - (poly64_t)vget_high_u8(b)); -} - -static forceinline ATTRIBUTES uint8x16_t -clmul_11(uint8x16_t a, uint8x16_t b) -{ - return (uint8x16_t)vmull_high_p64((poly64x2_t)a, (poly64x2_t)b); -} - -static forceinline ATTRIBUTES uint8x16_t -fold_128b(uint8x16_t dst, uint8x16_t src, uint8x16_t multipliers) -{ - return dst ^ clmul_00(src, multipliers) ^ clmul_11(src, multipliers); -} - -static forceinline ATTRIBUTES u32 -crc32_pmull_aligned(u32 remainder, const uint8x16_t *p, size_t nr_segs) -{ - /* Constants precomputed by gen_crc32_multipliers.c. Do not edit! */ - const uint8x16_t multipliers_4 = - (uint8x16_t)(uint64x2_t){ 0x8F352D95, 0x1D9513D7 }; - const uint8x16_t multipliers_1 = - (uint8x16_t)(uint64x2_t){ 0xAE689191, 0xCCAA009E }; - const uint8x16_t final_multiplier = - (uint8x16_t)(uint64x2_t){ 0xB8BC6765 }; - const uint8x16_t mask32 = (uint8x16_t)(uint32x4_t){ 0xFFFFFFFF }; - const uint8x16_t barrett_reduction_constants = - (uint8x16_t)(uint64x2_t){ 0x00000001F7011641, - 0x00000001DB710641 }; - const uint8x16_t zeroes = (uint8x16_t){ 0 }; - - const uint8x16_t * const end = p + nr_segs; - const uint8x16_t * const end512 = p + (nr_segs & ~3); - uint8x16_t x0, x1, x2, x3; - - x0 = *p++ ^ (uint8x16_t)(uint32x4_t){ remainder }; - if (nr_segs >= 4) { - x1 = *p++; - x2 = *p++; - x3 = *p++; - - /* Fold 512 bits at a time */ - while (p != end512) { - x0 = fold_128b(*p++, x0, multipliers_4); - x1 = fold_128b(*p++, x1, multipliers_4); - x2 = fold_128b(*p++, x2, multipliers_4); - x3 = fold_128b(*p++, x3, multipliers_4); - } - - /* Fold 512 bits => 128 bits */ - x1 = fold_128b(x1, x0, multipliers_1); - x2 = fold_128b(x2, x1, multipliers_1); - x0 = fold_128b(x3, x2, multipliers_1); - } - - /* Fold 128 bits at a time */ - while (p != end) - x0 = fold_128b(*p++, x0, multipliers_1); - - /* Fold 128 => 96 bits, implicitly appending 32 zeroes */ - x0 = vextq_u8(x0, zeroes, 8) ^ clmul_10(x0, multipliers_1); - - /* Fold 96 => 64 bits */ - x0 = vextq_u8(x0, zeroes, 4) ^ clmul_00(x0 & mask32, final_multiplier); - - /* Reduce 64 => 32 bits using Barrett reduction */ - x1 = x0; - x0 = clmul_00(x0 & mask32, barrett_reduction_constants); - x0 = clmul_10(x0 & mask32, barrett_reduction_constants); - return vgetq_lane_u32((uint32x4_t)(x0 ^ x1), 1); -} -#define IMPL_ALIGNMENT 16 -#define IMPL_SEGMENT_SIZE 16 -#include "../crc32_vec_template.h" -#endif /* PMULL implementation */ - -#ifdef DISPATCH -static inline crc32_func_t -arch_select_crc32_func(void) -{ - u32 features = get_cpu_features(); - -#ifdef DISPATCH_ARM - if (features & ARM_CPU_FEATURE_CRC32) - return crc32_arm; -#endif -#ifdef DISPATCH_PMULL - if (features & ARM_CPU_FEATURE_PMULL) - return crc32_pmull; -#endif - return NULL; -} -#endif /* DISPATCH */ - -#endif /* LIB_ARM_CRC32_IMPL_H */ diff --git a/util/compress/libdeflate/lib/arm/matchfinder_impl.h b/util/compress/libdeflate/lib/arm/matchfinder_impl.h deleted file mode 100644 index da0d2fd79d..0000000000 --- a/util/compress/libdeflate/lib/arm/matchfinder_impl.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * arm/matchfinder_impl.h - ARM implementations of matchfinder functions - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_ARM_MATCHFINDER_IMPL_H -#define LIB_ARM_MATCHFINDER_IMPL_H - -#ifdef __ARM_NEON -# include -static forceinline void -matchfinder_init_neon(mf_pos_t *data, size_t size) -{ - int16x8_t *p = (int16x8_t *)data; - int16x8_t v = (int16x8_t) { - MATCHFINDER_INITVAL, MATCHFINDER_INITVAL, MATCHFINDER_INITVAL, - MATCHFINDER_INITVAL, MATCHFINDER_INITVAL, MATCHFINDER_INITVAL, - MATCHFINDER_INITVAL, MATCHFINDER_INITVAL, - }; - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - p[0] = v; - p[1] = v; - p[2] = v; - p[3] = v; - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_init matchfinder_init_neon - -static forceinline void -matchfinder_rebase_neon(mf_pos_t *data, size_t size) -{ - int16x8_t *p = (int16x8_t *)data; - int16x8_t v = (int16x8_t) { - (u16)-MATCHFINDER_WINDOW_SIZE, (u16)-MATCHFINDER_WINDOW_SIZE, - (u16)-MATCHFINDER_WINDOW_SIZE, (u16)-MATCHFINDER_WINDOW_SIZE, - (u16)-MATCHFINDER_WINDOW_SIZE, (u16)-MATCHFINDER_WINDOW_SIZE, - (u16)-MATCHFINDER_WINDOW_SIZE, (u16)-MATCHFINDER_WINDOW_SIZE, - }; - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - p[0] = vqaddq_s16(p[0], v); - p[1] = vqaddq_s16(p[1], v); - p[2] = vqaddq_s16(p[2], v); - p[3] = vqaddq_s16(p[3], v); - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_rebase matchfinder_rebase_neon - -#endif /* __ARM_NEON */ - -#endif /* LIB_ARM_MATCHFINDER_IMPL_H */ diff --git a/util/compress/libdeflate/lib/bt_matchfinder.h b/util/compress/libdeflate/lib/bt_matchfinder.h deleted file mode 100644 index a994a571cc..0000000000 --- a/util/compress/libdeflate/lib/bt_matchfinder.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * bt_matchfinder.h - Lempel-Ziv matchfinding with a hash table of binary trees - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ---------------------------------------------------------------------------- - * - * This is a Binary Trees (bt) based matchfinder. - * - * The main data structure is a hash table where each hash bucket contains a - * binary tree of sequences whose first 4 bytes share the same hash code. Each - * sequence is identified by its starting position in the input buffer. Each - * binary tree is always sorted such that each left child represents a sequence - * lexicographically lesser than its parent and each right child represents a - * sequence lexicographically greater than its parent. - * - * The algorithm processes the input buffer sequentially. At each byte - * position, the hash code of the first 4 bytes of the sequence beginning at - * that position (the sequence being matched against) is computed. This - * identifies the hash bucket to use for that position. Then, a new binary tree - * node is created to represent the current sequence. Then, in a single tree - * traversal, the hash bucket's binary tree is searched for matches and is - * re-rooted at the new node. - * - * Compared to the simpler algorithm that uses linked lists instead of binary - * trees (see hc_matchfinder.h), the binary tree version gains more information - * at each node visitation. Ideally, the binary tree version will examine only - * 'log(n)' nodes to find the same matches that the linked list version will - * find by examining 'n' nodes. In addition, the binary tree version can - * examine fewer bytes at each node by taking advantage of the common prefixes - * that result from the sort order, whereas the linked list version may have to - * examine up to the full length of the match at each node. - * - * However, it is not always best to use the binary tree version. It requires - * nearly twice as much memory as the linked list version, and it takes time to - * keep the binary trees sorted, even at positions where the compressor does not - * need matches. Generally, when doing fast compression on small buffers, - * binary trees are the wrong approach. They are best suited for thorough - * compression and/or large buffers. - * - * ---------------------------------------------------------------------------- - */ - -#ifndef LIB_BT_MATCHFINDER_H -#define LIB_BT_MATCHFINDER_H - -#include "matchfinder_common.h" - -#define BT_MATCHFINDER_HASH3_ORDER 16 -#define BT_MATCHFINDER_HASH3_WAYS 2 -#define BT_MATCHFINDER_HASH4_ORDER 16 - -#define BT_MATCHFINDER_TOTAL_HASH_SIZE \ - (((1UL << BT_MATCHFINDER_HASH3_ORDER) * BT_MATCHFINDER_HASH3_WAYS + \ - (1UL << BT_MATCHFINDER_HASH4_ORDER)) * sizeof(mf_pos_t)) - -/* Representation of a match found by the bt_matchfinder */ -struct lz_match { - - /* The number of bytes matched. */ - u16 length; - - /* The offset back from the current position that was matched. */ - u16 offset; -}; - -struct bt_matchfinder { - - /* The hash table for finding length 3 matches */ - mf_pos_t hash3_tab[1UL << BT_MATCHFINDER_HASH3_ORDER][BT_MATCHFINDER_HASH3_WAYS]; - - /* The hash table which contains the roots of the binary trees for - * finding length 4+ matches */ - mf_pos_t hash4_tab[1UL << BT_MATCHFINDER_HASH4_ORDER]; - - /* The child node references for the binary trees. The left and right - * children of the node for the sequence with position 'pos' are - * 'child_tab[pos * 2]' and 'child_tab[pos * 2 + 1]', respectively. */ - mf_pos_t child_tab[2UL * MATCHFINDER_WINDOW_SIZE]; - -} -#ifdef _aligned_attribute -_aligned_attribute(MATCHFINDER_MEM_ALIGNMENT) -#endif -; - -/* Prepare the matchfinder for a new input buffer. */ -static forceinline void -bt_matchfinder_init(struct bt_matchfinder *mf) -{ - STATIC_ASSERT(BT_MATCHFINDER_TOTAL_HASH_SIZE % - MATCHFINDER_SIZE_ALIGNMENT == 0); - - matchfinder_init((mf_pos_t *)mf, BT_MATCHFINDER_TOTAL_HASH_SIZE); -} - -static forceinline void -bt_matchfinder_slide_window(struct bt_matchfinder *mf) -{ - STATIC_ASSERT(sizeof(*mf) % MATCHFINDER_SIZE_ALIGNMENT == 0); - - matchfinder_rebase((mf_pos_t *)mf, sizeof(*mf)); -} - -static forceinline mf_pos_t * -bt_left_child(struct bt_matchfinder *mf, s32 node) -{ - return &mf->child_tab[2 * (node & (MATCHFINDER_WINDOW_SIZE - 1)) + 0]; -} - -static forceinline mf_pos_t * -bt_right_child(struct bt_matchfinder *mf, s32 node) -{ - return &mf->child_tab[2 * (node & (MATCHFINDER_WINDOW_SIZE - 1)) + 1]; -} - -/* The minimum permissible value of 'max_len' for bt_matchfinder_get_matches() - * and bt_matchfinder_skip_position(). There must be sufficiently many bytes - * remaining to load a 32-bit integer from the *next* position. */ -#define BT_MATCHFINDER_REQUIRED_NBYTES 5 - -/* Advance the binary tree matchfinder by one byte, optionally recording - * matches. @record_matches should be a compile-time constant. */ -static forceinline struct lz_match * -bt_matchfinder_advance_one_byte(struct bt_matchfinder * const restrict mf, - const u8 * const restrict in_base, - const ptrdiff_t cur_pos, - const u32 max_len, - const u32 nice_len, - const u32 max_search_depth, - u32 * const restrict next_hashes, - u32 * const restrict best_len_ret, - struct lz_match * restrict lz_matchptr, - const bool record_matches) -{ - const u8 *in_next = in_base + cur_pos; - u32 depth_remaining = max_search_depth; - const s32 cutoff = cur_pos - MATCHFINDER_WINDOW_SIZE; - u32 next_hashseq; - u32 hash3; - u32 hash4; - s32 cur_node; -#if BT_MATCHFINDER_HASH3_WAYS >= 2 - s32 cur_node_2; -#endif - const u8 *matchptr; - mf_pos_t *pending_lt_ptr, *pending_gt_ptr; - u32 best_lt_len, best_gt_len; - u32 len; - u32 best_len = 3; - - STATIC_ASSERT(BT_MATCHFINDER_HASH3_WAYS >= 1 && - BT_MATCHFINDER_HASH3_WAYS <= 2); - - next_hashseq = get_unaligned_le32(in_next + 1); - - hash3 = next_hashes[0]; - hash4 = next_hashes[1]; - - next_hashes[0] = lz_hash(next_hashseq & 0xFFFFFF, BT_MATCHFINDER_HASH3_ORDER); - next_hashes[1] = lz_hash(next_hashseq, BT_MATCHFINDER_HASH4_ORDER); - prefetchw(&mf->hash3_tab[next_hashes[0]]); - prefetchw(&mf->hash4_tab[next_hashes[1]]); - - cur_node = mf->hash3_tab[hash3][0]; - mf->hash3_tab[hash3][0] = cur_pos; -#if BT_MATCHFINDER_HASH3_WAYS >= 2 - cur_node_2 = mf->hash3_tab[hash3][1]; - mf->hash3_tab[hash3][1] = cur_node; -#endif - if (record_matches && cur_node > cutoff) { - u32 seq3 = load_u24_unaligned(in_next); - if (seq3 == load_u24_unaligned(&in_base[cur_node])) { - lz_matchptr->length = 3; - lz_matchptr->offset = in_next - &in_base[cur_node]; - lz_matchptr++; - } - #if BT_MATCHFINDER_HASH3_WAYS >= 2 - else if (cur_node_2 > cutoff && - seq3 == load_u24_unaligned(&in_base[cur_node_2])) - { - lz_matchptr->length = 3; - lz_matchptr->offset = in_next - &in_base[cur_node_2]; - lz_matchptr++; - } - #endif - } - - cur_node = mf->hash4_tab[hash4]; - mf->hash4_tab[hash4] = cur_pos; - - pending_lt_ptr = bt_left_child(mf, cur_pos); - pending_gt_ptr = bt_right_child(mf, cur_pos); - - if (cur_node <= cutoff) { - *pending_lt_ptr = MATCHFINDER_INITVAL; - *pending_gt_ptr = MATCHFINDER_INITVAL; - *best_len_ret = best_len; - return lz_matchptr; - } - - best_lt_len = 0; - best_gt_len = 0; - len = 0; - - for (;;) { - matchptr = &in_base[cur_node]; - - if (matchptr[len] == in_next[len]) { - len = lz_extend(in_next, matchptr, len + 1, max_len); - if (!record_matches || len > best_len) { - if (record_matches) { - best_len = len; - lz_matchptr->length = len; - lz_matchptr->offset = in_next - matchptr; - lz_matchptr++; - } - if (len >= nice_len) { - *pending_lt_ptr = *bt_left_child(mf, cur_node); - *pending_gt_ptr = *bt_right_child(mf, cur_node); - *best_len_ret = best_len; - return lz_matchptr; - } - } - } - - if (matchptr[len] < in_next[len]) { - *pending_lt_ptr = cur_node; - pending_lt_ptr = bt_right_child(mf, cur_node); - cur_node = *pending_lt_ptr; - best_lt_len = len; - if (best_gt_len < len) - len = best_gt_len; - } else { - *pending_gt_ptr = cur_node; - pending_gt_ptr = bt_left_child(mf, cur_node); - cur_node = *pending_gt_ptr; - best_gt_len = len; - if (best_lt_len < len) - len = best_lt_len; - } - - if (cur_node <= cutoff || !--depth_remaining) { - *pending_lt_ptr = MATCHFINDER_INITVAL; - *pending_gt_ptr = MATCHFINDER_INITVAL; - *best_len_ret = best_len; - return lz_matchptr; - } - } -} - -/* - * Retrieve a list of matches with the current position. - * - * @mf - * The matchfinder structure. - * @in_base - * Pointer to the next byte in the input buffer to process _at the last - * time bt_matchfinder_init() or bt_matchfinder_slide_window() was called_. - * @cur_pos - * The current position in the input buffer relative to @in_base (the - * position of the sequence being matched against). - * @max_len - * The maximum permissible match length at this position. Must be >= - * BT_MATCHFINDER_REQUIRED_NBYTES. - * @nice_len - * Stop searching if a match of at least this length is found. - * Must be <= @max_len. - * @max_search_depth - * Limit on the number of potential matches to consider. Must be >= 1. - * @next_hashes - * The precomputed hash codes for the sequence beginning at @in_next. - * These will be used and then updated with the precomputed hashcodes for - * the sequence beginning at @in_next + 1. - * @best_len_ret - * If a match of length >= 4 was found, then the length of the longest such - * match is written here; otherwise 3 is written here. (Note: this is - * redundant with the 'struct lz_match' array, but this is easier for the - * compiler to optimize when inlined and the caller immediately does a - * check against 'best_len'.) - * @lz_matchptr - * An array in which this function will record the matches. The recorded - * matches will be sorted by strictly increasing length and (non-strictly) - * increasing offset. The maximum number of matches that may be found is - * 'nice_len - 2'. - * - * The return value is a pointer to the next available slot in the @lz_matchptr - * array. (If no matches were found, this will be the same as @lz_matchptr.) - */ -static forceinline struct lz_match * -bt_matchfinder_get_matches(struct bt_matchfinder *mf, - const u8 *in_base, - ptrdiff_t cur_pos, - u32 max_len, - u32 nice_len, - u32 max_search_depth, - u32 next_hashes[2], - u32 *best_len_ret, - struct lz_match *lz_matchptr) -{ - return bt_matchfinder_advance_one_byte(mf, - in_base, - cur_pos, - max_len, - nice_len, - max_search_depth, - next_hashes, - best_len_ret, - lz_matchptr, - true); -} - -/* - * Advance the matchfinder, but don't record any matches. - * - * This is very similar to bt_matchfinder_get_matches() because both functions - * must do hashing and tree re-rooting. - */ -static forceinline void -bt_matchfinder_skip_position(struct bt_matchfinder *mf, - const u8 *in_base, - ptrdiff_t cur_pos, - u32 nice_len, - u32 max_search_depth, - u32 next_hashes[2]) -{ - u32 best_len; - bt_matchfinder_advance_one_byte(mf, - in_base, - cur_pos, - nice_len, - nice_len, - max_search_depth, - next_hashes, - &best_len, - NULL, - false); -} - -#endif /* LIB_BT_MATCHFINDER_H */ diff --git a/util/compress/libdeflate/lib/cpu_features_common.h b/util/compress/libdeflate/lib/cpu_features_common.h deleted file mode 100644 index 570b62dbba..0000000000 --- a/util/compress/libdeflate/lib/cpu_features_common.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * cpu_features_common.h - code shared by all lib/$arch/cpu_features.c - * - * Copyright 2020 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_CPU_FEATURES_COMMON_H -#define LIB_CPU_FEATURES_COMMON_H - -#if defined(TEST_SUPPORT__DO_NOT_USE) && !defined(FREESTANDING) -# define _GNU_SOURCE 1 /* for strdup() and strtok_r() */ -# include -# include -# include -#endif - -#include "lib_common.h" - -struct cpu_feature { - u32 bit; - const char *name; -}; - -#if defined(TEST_SUPPORT__DO_NOT_USE) && !defined(FREESTANDING) -/* Disable any features that are listed in $LIBDEFLATE_DISABLE_CPU_FEATURES. */ -static inline void -disable_cpu_features_for_testing(u32 *features, - const struct cpu_feature *feature_table, - size_t feature_table_length) -{ - char *env_value, *strbuf, *p, *saveptr = NULL; - size_t i; - - env_value = getenv("LIBDEFLATE_DISABLE_CPU_FEATURES"); - if (!env_value) - return; - strbuf = strdup(env_value); - if (!strbuf) - abort(); - p = strtok_r(strbuf, ",", &saveptr); - while (p) { - for (i = 0; i < feature_table_length; i++) { - if (strcmp(p, feature_table[i].name) == 0) { - *features &= ~feature_table[i].bit; - break; - } - } - if (i == feature_table_length) { - fprintf(stderr, - "unrecognized feature in LIBDEFLATE_DISABLE_CPU_FEATURES: \"%s\"\n", - p); - abort(); - } - p = strtok_r(NULL, ",", &saveptr); - } - free(strbuf); -} -#else /* TEST_SUPPORT__DO_NOT_USE */ -static inline void -disable_cpu_features_for_testing(u32 *features, - const struct cpu_feature *feature_table, - size_t feature_table_length) -{ -} -#endif /* !TEST_SUPPORT__DO_NOT_USE */ - -#endif /* LIB_CPU_FEATURES_COMMON_H */ diff --git a/util/compress/libdeflate/lib/crc32.c b/util/compress/libdeflate/lib/crc32.c deleted file mode 100644 index 6adacc5dc2..0000000000 --- a/util/compress/libdeflate/lib/crc32.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * crc32.c - CRC-32 checksum algorithm for the gzip format - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * High-level description of CRC - * ============================= - * - * Consider a bit sequence 'bits[1...len]'. Interpret 'bits' as the "message" - * polynomial M(x) with coefficients in GF(2) (the field of integers modulo 2), - * where the coefficient of 'x^i' is 'bits[len - i]'. Then, compute: - * - * R(x) = M(x)*x^n mod G(x) - * - * where G(x) is a selected "generator" polynomial of degree 'n'. The remainder - * R(x) is a polynomial of max degree 'n - 1'. The CRC of 'bits' is R(x) - * interpreted as a bitstring of length 'n'. - * - * CRC used in gzip - * ================ - * - * In the gzip format (RFC 1952): - * - * - The bitstring to checksum is formed from the bytes of the uncompressed - * data by concatenating the bits from the bytes in order, proceeding - * from the low-order bit to the high-order bit within each byte. - * - * - The generator polynomial G(x) is: x^32 + x^26 + x^23 + x^22 + x^16 + - * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1. - * Consequently, the CRC length is 32 bits ("CRC-32"). - * - * - The highest order 32 coefficients of M(x)*x^n are inverted. - * - * - All 32 coefficients of R(x) are inverted. - * - * The two inversions cause added leading and trailing zero bits to affect the - * resulting CRC, whereas with a regular CRC such bits would have no effect on - * the CRC. - * - * Computation and optimizations - * ============================= - * - * We can compute R(x) through "long division", maintaining only 32 bits of - * state at any given time. Multiplication by 'x' can be implemented as - * right-shifting by 1 (assuming the polynomial<=>bitstring mapping where the - * highest order bit represents the coefficient of x^0), and both addition and - * subtraction can be implemented as bitwise exclusive OR (since we are working - * in GF(2)). Here is an unoptimized implementation: - * - * static u32 crc32_gzip(const u8 *buffer, size_t size) - * { - * u32 remainder = 0; - * const u32 divisor = 0xEDB88320; - * - * for (size_t i = 0; i < size * 8 + 32; i++) { - * int bit; - * u32 multiple; - * - * if (i < size * 8) - * bit = (buffer[i / 8] >> (i % 8)) & 1; - * else - * bit = 0; // one of the 32 appended 0 bits - * - * if (i < 32) // the first 32 bits are inverted - * bit ^= 1; - * - * if (remainder & 1) - * multiple = divisor; - * else - * multiple = 0; - * - * remainder >>= 1; - * remainder |= (u32)bit << 31; - * remainder ^= multiple; - * } - * - * return ~remainder; - * } - * - * In this implementation, the 32-bit integer 'remainder' maintains the - * remainder of the currently processed portion of the message (with 32 zero - * bits appended) when divided by the generator polynomial. 'remainder' is the - * representation of R(x), and 'divisor' is the representation of G(x) excluding - * the x^32 coefficient. For each bit to process, we multiply R(x) by 'x^1', - * then add 'x^0' if the new bit is a 1. If this causes R(x) to gain a nonzero - * x^32 term, then we subtract G(x) from R(x). - * - * We can speed this up by taking advantage of the fact that XOR is commutative - * and associative, so the order in which we combine the inputs into 'remainder' - * is unimportant. And since each message bit we add doesn't affect the choice - * of 'multiple' until 32 bits later, we need not actually add each message bit - * until that point: - * - * static u32 crc32_gzip(const u8 *buffer, size_t size) - * { - * u32 remainder = ~0; - * const u32 divisor = 0xEDB88320; - * - * for (size_t i = 0; i < size * 8; i++) { - * int bit; - * u32 multiple; - * - * bit = (buffer[i / 8] >> (i % 8)) & 1; - * remainder ^= bit; - * if (remainder & 1) - * multiple = divisor; - * else - * multiple = 0; - * remainder >>= 1; - * remainder ^= multiple; - * } - * - * return ~remainder; - * } - * - * With the above implementation we get the effect of 32 appended 0 bits for - * free; they never affect the choice of a divisor, nor would they change the - * value of 'remainder' if they were to be actually XOR'ed in. And by starting - * with a remainder of all 1 bits, we get the effect of complementing the first - * 32 message bits. - * - * The next optimization is to process the input in multi-bit units. Suppose - * that we insert the next 'n' message bits into the remainder. Then we get an - * intermediate remainder of length '32 + n' bits, and the CRC of the extra 'n' - * bits is the amount by which the low 32 bits of the remainder will change as a - * result of cancelling out those 'n' bits. Taking n=8 (one byte) and - * precomputing a table containing the CRC of each possible byte, we get - * crc32_slice1() defined below. - * - * As a further optimization, we could increase the multi-bit unit size to 16. - * However, that is inefficient because the table size explodes from 256 entries - * (1024 bytes) to 65536 entries (262144 bytes), which wastes memory and won't - * fit in L1 cache on typical processors. - * - * However, we can actually process 4 bytes at a time using 4 different tables - * with 256 entries each. Logically, we form a 64-bit intermediate remainder - * and cancel out the high 32 bits in 8-bit chunks. Bits 32-39 are cancelled - * out by the CRC of those bits, whereas bits 40-47 are be cancelled out by the - * CRC of those bits with 8 zero bits appended, and so on. This method is - * implemented in crc32_slice4(), defined below. - * - * In crc32_slice8(), this method is extended to 8 bytes at a time. The - * intermediate remainder (which we never actually store explicitly) is 96 bits. - * - * On CPUs that support fast carryless multiplication, CRCs can be computed even - * more quickly via "folding". See e.g. the x86 PCLMUL implementation. - */ - -#include "lib_common.h" -#include "libdeflate.h" - -typedef u32 (*crc32_func_t)(u32, const u8 *, size_t); - -/* Include architecture-specific implementations if available */ -#undef CRC32_SLICE1 -#undef CRC32_SLICE4 -#undef CRC32_SLICE8 -#undef DEFAULT_IMPL -#undef DISPATCH -#if defined(__arm__) || defined(__aarch64__) -# include "arm/crc32_impl.h" -#elif defined(__i386__) || defined(__x86_64__) -# include "x86/crc32_impl.h" -#endif - -/* - * Define a generic implementation (crc32_slice8()) if needed. crc32_slice1() - * may also be needed as a fallback for architecture-specific implementations. - */ - -#ifndef DEFAULT_IMPL -# define CRC32_SLICE8 1 -# define DEFAULT_IMPL crc32_slice8 -#endif - -#if defined(CRC32_SLICE1) || defined(CRC32_SLICE4) || defined(CRC32_SLICE8) -#include "crc32_table.h" -static forceinline u32 -crc32_update_byte(u32 remainder, u8 next_byte) -{ - return (remainder >> 8) ^ crc32_table[(u8)remainder ^ next_byte]; -} -#endif - -#ifdef CRC32_SLICE1 -static u32 -crc32_slice1(u32 remainder, const u8 *buffer, size_t size) -{ - size_t i; - - STATIC_ASSERT(ARRAY_LEN(crc32_table) >= 0x100); - - for (i = 0; i < size; i++) - remainder = crc32_update_byte(remainder, buffer[i]); - return remainder; -} -#endif /* CRC32_SLICE1 */ - -#ifdef CRC32_SLICE4 -static u32 -crc32_slice4(u32 remainder, const u8 *buffer, size_t size) -{ - const u8 *p = buffer; - const u8 *end = buffer + size; - const u8 *end32; - - STATIC_ASSERT(ARRAY_LEN(crc32_table) >= 0x400); - - for (; ((uintptr_t)p & 3) && p != end; p++) - remainder = crc32_update_byte(remainder, *p); - - end32 = p + ((end - p) & ~3); - for (; p != end32; p += 4) { - u32 v = le32_bswap(*(const u32 *)p); - remainder = - crc32_table[0x300 + (u8)((remainder ^ v) >> 0)] ^ - crc32_table[0x200 + (u8)((remainder ^ v) >> 8)] ^ - crc32_table[0x100 + (u8)((remainder ^ v) >> 16)] ^ - crc32_table[0x000 + (u8)((remainder ^ v) >> 24)]; - } - - for (; p != end; p++) - remainder = crc32_update_byte(remainder, *p); - - return remainder; -} -#endif /* CRC32_SLICE4 */ - -#ifdef CRC32_SLICE8 -static u32 -crc32_slice8(u32 remainder, const u8 *buffer, size_t size) -{ - const u8 *p = buffer; - const u8 *end = buffer + size; - const u8 *end64; - - STATIC_ASSERT(ARRAY_LEN(crc32_table) >= 0x800); - - for (; ((uintptr_t)p & 7) && p != end; p++) - remainder = crc32_update_byte(remainder, *p); - - end64 = p + ((end - p) & ~7); - for (; p != end64; p += 8) { - u32 v1 = le32_bswap(*(const u32 *)(p + 0)); - u32 v2 = le32_bswap(*(const u32 *)(p + 4)); - remainder = - crc32_table[0x700 + (u8)((remainder ^ v1) >> 0)] ^ - crc32_table[0x600 + (u8)((remainder ^ v1) >> 8)] ^ - crc32_table[0x500 + (u8)((remainder ^ v1) >> 16)] ^ - crc32_table[0x400 + (u8)((remainder ^ v1) >> 24)] ^ - crc32_table[0x300 + (u8)(v2 >> 0)] ^ - crc32_table[0x200 + (u8)(v2 >> 8)] ^ - crc32_table[0x100 + (u8)(v2 >> 16)] ^ - crc32_table[0x000 + (u8)(v2 >> 24)]; - } - - for (; p != end; p++) - remainder = crc32_update_byte(remainder, *p); - - return remainder; -} -#endif /* CRC32_SLICE8 */ - -#ifdef DISPATCH -static u32 dispatch(u32, const u8 *, size_t); - -static volatile crc32_func_t crc32_impl = dispatch; - -/* Choose the fastest implementation at runtime */ -static u32 dispatch(u32 remainder, const u8 *buffer, size_t size) -{ - crc32_func_t f = arch_select_crc32_func(); - - if (f == NULL) - f = DEFAULT_IMPL; - - crc32_impl = f; - return crc32_impl(remainder, buffer, size); -} -#else -# define crc32_impl DEFAULT_IMPL /* only one implementation, use it */ -#endif - -LIBDEFLATEEXPORT u32 LIBDEFLATEAPI -libdeflate_crc32(u32 remainder, const void *buffer, size_t size) -{ - if (buffer == NULL) /* return initial value */ - return 0; - return ~crc32_impl(~remainder, buffer, size); -} diff --git a/util/compress/libdeflate/lib/crc32_table.h b/util/compress/libdeflate/lib/crc32_table.h deleted file mode 100644 index 05421b9825..0000000000 --- a/util/compress/libdeflate/lib/crc32_table.h +++ /dev/null @@ -1,526 +0,0 @@ -/* - * crc32_table.h - data table to accelerate CRC-32 computation - * - * THIS FILE WAS AUTOMATICALLY GENERATED BY gen_crc32_table.c. DO NOT EDIT. - */ - -#include - -static const uint32_t crc32_table[] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, -#if defined(CRC32_SLICE4) || defined(CRC32_SLICE8) - 0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, - 0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7, - 0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb, - 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf, - 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, - 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, - 0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a, - 0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e, - 0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761, - 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, - 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, - 0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d, - 0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530, - 0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034, - 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, - 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, - 0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6, - 0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2, - 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce, - 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, - 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, - 0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93, - 0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f, - 0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b, - 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, - 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, - 0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c, - 0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768, - 0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35, - 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, - 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, - 0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539, - 0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88, - 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c, - 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, - 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, - 0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9, - 0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd, - 0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1, - 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, - 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, - 0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, - 0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522, - 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026, - 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, - 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, - 0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773, - 0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277, - 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d, - 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, - 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, - 0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81, - 0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc, - 0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8, - 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, - 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, - 0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f, - 0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b, - 0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27, - 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, - 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, - 0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a, - 0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876, - 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72, - 0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, - 0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685, - 0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1, - 0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d, - 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, - 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, - 0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91, - 0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d, - 0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9, - 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, - 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, - 0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd, - 0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9, - 0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315, - 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, - 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, - 0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399, - 0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45, - 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221, - 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, - 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, - 0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835, - 0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151, - 0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d, - 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, - 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, - 0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1, - 0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d, - 0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609, - 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, - 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, - 0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, - 0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9, - 0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05, - 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, - 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, - 0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, - 0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75, - 0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711, - 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, - 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, - 0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5, - 0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281, - 0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d, - 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, - 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, - 0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, - 0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d, - 0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819, - 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, - 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, - 0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d, - 0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69, - 0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5, - 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, - 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, - 0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9, - 0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625, - 0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41, - 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, - 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, - 0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555, - 0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31, - 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed, - 0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, - 0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9, - 0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701, - 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056, - 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, - 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, - 0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e, - 0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9, - 0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0, - 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, - 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, - 0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68, - 0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f, - 0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018, - 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, - 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, - 0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3, - 0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084, - 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c, - 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, - 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, - 0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b, - 0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3, - 0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4, - 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, - 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, - 0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002, - 0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755, - 0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72, - 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, - 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, - 0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca, - 0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5, - 0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82, - 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, - 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, - 0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a, - 0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d, - 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5, - 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, - 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, - 0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc, - 0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04, - 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953, - 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, - 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, - 0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b, - 0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc, - 0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8, - 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, - 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, - 0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50, - 0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677, - 0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120, - 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, - 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, - 0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, - 0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981, - 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639, - 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, - 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, - 0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, - 0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6, - 0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1, -#endif /* CRC32_SLICE4 || CRC32_SLICE8 */ -#if defined(CRC32_SLICE8) - 0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, - 0xf580a6c0, 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, - 0x30704bc1, 0x0d106271, 0x4ab018a1, 0x77d03111, - 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, 0x825097d1, - 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, - 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, - 0x5090dc43, 0x6df0f5f3, 0x2a508f23, 0x1730a693, - 0xa5107a83, 0x98705333, 0xdfd029e3, 0xe2b00053, - 0xc1c12f04, 0xfca106b4, 0xbb017c64, 0x866155d4, - 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, - 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, - 0x0431c205, 0x3951ebb5, 0x7ef19165, 0x4391b8d5, - 0xa121b886, 0x9c419136, 0xdbe1ebe6, 0xe681c256, - 0x54a11e46, 0x69c137f6, 0x2e614d26, 0x13016496, - 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, - 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, - 0x58f35849, 0x659371f9, 0x22330b29, 0x1f532299, - 0xad73fe89, 0x9013d739, 0xd7b3ade9, 0xead38459, - 0x68831388, 0x55e33a38, 0x124340e8, 0x2f236958, - 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, - 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, - 0xcd93690b, 0xf0f340bb, 0xb7533a6b, 0x8a3313db, - 0x0863840a, 0x3503adba, 0x72a3d76a, 0x4fc3feda, - 0xfde322ca, 0xc0830b7a, 0x872371aa, 0xba43581a, - 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, - 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, - 0xa9423c8c, 0x9422153c, 0xd3826fec, 0xeee2465c, - 0x5cc29a4c, 0x61a2b3fc, 0x2602c92c, 0x1b62e09c, - 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, 0xbe729a1f, - 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, - 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, - 0x3c220dce, 0x0142247e, 0x46e25eae, 0x7b82771e, - 0xb1e6b092, 0x8c869922, 0xcb26e3f2, 0xf646ca42, - 0x44661652, 0x79063fe2, 0x3ea64532, 0x03c66c82, - 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, - 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, - 0xd1062710, 0xec660ea0, 0xabc67470, 0x96a65dc0, - 0x248681d0, 0x19e6a860, 0x5e46d2b0, 0x6326fb00, - 0xe1766cd1, 0xdc164561, 0x9bb63fb1, 0xa6d61601, - 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, - 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, - 0x85a73956, 0xb8c710e6, 0xff676a36, 0xc2074386, - 0x4057d457, 0x7d37fde7, 0x3a978737, 0x07f7ae87, - 0xb5d77297, 0x88b75b27, 0xcf1721f7, 0xf2770847, - 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, - 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, - 0x20b743d5, 0x1dd76a65, 0x5a7710b5, 0x67173905, - 0xd537e515, 0xe857cca5, 0xaff7b675, 0x92979fc5, - 0xe915e8db, 0xd475c16b, 0x93d5bbbb, 0xaeb5920b, - 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, - 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, - 0x2ce505da, 0x11852c6a, 0x562556ba, 0x6b457f0a, - 0x89f57f59, 0xb49556e9, 0xf3352c39, 0xce550589, - 0x7c75d999, 0x4115f029, 0x06b58af9, 0x3bd5a349, - 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, - 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, - 0x28d4c7df, 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, - 0xdd54611f, 0xe03448af, 0xa794327f, 0x9af41bcf, - 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, 0x5f04f6ce, - 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, - 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, - 0xbdb4f69d, 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, - 0x78441b9c, 0x4524322c, 0x028448fc, 0x3fe4614c, - 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, 0xca64c78c, - 0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, - 0x9b914216, 0x50cd91b3, 0xd659e31d, 0x1d0530b8, - 0xec53826d, 0x270f51c8, 0xa19b2366, 0x6ac7f0c3, - 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, 0xf156b2d5, - 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, - 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, - 0xef8580f6, 0x24d95353, 0xa24d21fd, 0x6911f258, - 0x7414c2e0, 0xbf481145, 0x39dc63eb, 0xf280b04e, - 0x07ac0536, 0xccf0d693, 0x4a64a43d, 0x81387798, - 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, - 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, - 0x706ec54d, 0xbb3216e8, 0x3da66446, 0xf6fab7e3, - 0x047a07ad, 0xcf26d408, 0x49b2a6a6, 0x82ee7503, - 0x9feb45bb, 0x54b7961e, 0xd223e4b0, 0x197f3715, - 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, - 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, - 0x0f580a6c, 0xc404d9c9, 0x4290ab67, 0x89cc78c2, - 0x94c9487a, 0x5f959bdf, 0xd901e971, 0x125d3ad4, - 0xe30b8801, 0x28575ba4, 0xaec3290a, 0x659ffaaf, - 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, - 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, - 0x971f4ae1, 0x5c439944, 0xdad7ebea, 0x118b384f, - 0xe0dd8a9a, 0x2b81593f, 0xad152b91, 0x6649f834, - 0x7b4cc88c, 0xb0101b29, 0x36846987, 0xfdd8ba22, - 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, - 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, - 0xe4a78d37, 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, - 0x7f36cf21, 0xb46a1c84, 0x32fe6e2a, 0xf9a2bd8f, - 0x0b220dc1, 0xc07ede64, 0x46eaacca, 0x8db67f6f, - 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, - 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, - 0x7ce0cdba, 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, - 0x1eb014d8, 0xd5ecc77d, 0x5378b5d3, 0x98246676, - 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, 0x03b52460, - 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, - 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, - 0x1d661643, 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, - 0x86f75455, 0x4dab87f0, 0xcb3ff55e, 0x006326fb, - 0xf135942e, 0x3a69478b, 0xbcfd3525, 0x77a1e680, - 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, - 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, - 0x828d53f8, 0x49d1805d, 0xcf45f2f3, 0x04192156, - 0xf54f9383, 0x3e134026, 0xb8873288, 0x73dbe12d, - 0x6eded195, 0xa5820230, 0x2316709e, 0xe84aa33b, - 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, - 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, - 0xf6999118, 0x3dc542bd, 0xbb513013, 0x700de3b6, - 0x6d08d30e, 0xa65400ab, 0x20c07205, 0xeb9ca1a0, - 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, 0x977c6c1a, - 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, - 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, - 0x662adecf, 0xad760d6a, 0x2be27fc4, 0xe0beac61, - 0x123e1c2f, 0xd962cf8a, 0x5ff6bd24, 0x94aa6e81, - 0x89af5e39, 0x42f38d9c, 0xc467ff32, 0x0f3b2c97, - 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, - 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, - 0x16441b82, 0xdd18c827, 0x5b8cba89, 0x90d0692c, - 0x8dd55994, 0x46898a31, 0xc01df89f, 0x0b412b3a, - 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, 0x7c83eb41, - 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, - 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, - 0x8e035b0f, 0x455f88aa, 0xc3cbfa04, 0x089729a1, - 0xf9c19b74, 0x329d48d1, 0xb4093a7f, 0x7f55e9da, - 0x6250d962, 0xa90c0ac7, 0x2f987869, 0xe4c4abcc, - 0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, - 0xf44f2413, 0x52382fa7, 0x63d0353a, 0xc5a73e8e, - 0x33ef4e67, 0x959845d3, 0xa4705f4e, 0x020754fa, - 0xc7a06a74, 0x61d761c0, 0x503f7b5d, 0xf64870e9, - 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, - 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, - 0x5431d2a9, 0xf246d91d, 0xc3aec380, 0x65d9c834, - 0xa07ef6ba, 0x0609fd0e, 0x37e1e793, 0x9196ec27, - 0xcfbd399c, 0x69ca3228, 0x582228b5, 0xfe552301, - 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, - 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, - 0x081d53e8, 0xae6a585c, 0x9f8242c1, 0x39f54975, - 0xa863a552, 0x0e14aee6, 0x3ffcb47b, 0x998bbfcf, - 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, 0x6dc49bdc, - 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, - 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, - 0x440b7579, 0xe27c7ecd, 0xd3946450, 0x75e36fe4, - 0xb044516a, 0x16335ade, 0x27db4043, 0x81ac4bf7, - 0x77e43b1e, 0xd19330aa, 0xe07b2a37, 0x460c2183, - 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, - 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, - 0xd79acda4, 0x71edc610, 0x4005dc8d, 0xe672d739, - 0x103aa7d0, 0xb64dac64, 0x87a5b6f9, 0x21d2bd4d, - 0xe47583c3, 0x42028877, 0x73ea92ea, 0xd59d995e, - 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, - 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, - 0xb8590282, 0x1e2e0936, 0x2fc613ab, 0x89b1181f, - 0x4c162691, 0xea612d25, 0xdb8937b8, 0x7dfe3c0c, - 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, 0xdd80cab6, - 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, - 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, - 0x2bc8ba5f, 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, - 0x8816eaf2, 0x2e61e146, 0x1f89fbdb, 0xb9fef06f, - 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, 0x4db1d47c, - 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, - 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, - 0xefc8763c, 0x49bf7d88, 0x78576715, 0xde206ca1, - 0x1b87522f, 0xbdf0599b, 0x8c184306, 0x2a6f48b2, - 0xdc27385b, 0x7a5033ef, 0x4bb82972, 0xedcf22c6, - 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, - 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, - 0xb3e4f77d, 0x1593fcc9, 0x247be654, 0x820cede0, - 0x74449d09, 0xd23396bd, 0xe3db8c20, 0x45ac8794, - 0x800bb91a, 0x267cb2ae, 0x1794a833, 0xb1e3a387, - 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, - 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, - 0x139a01c7, 0xb5ed0a73, 0x840510ee, 0x22721b5a, - 0xe7d525d4, 0x41a22e60, 0x704a34fd, 0xd63d3f49, - 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, 0xfdf58516, - 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, - 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, - 0x0bbdf5ff, 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, - 0xabc30345, 0x0db408f1, 0x3c5c126c, 0x9a2b19d8, - 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, 0x6e643dcb, - 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, - 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, - 0x03a0a617, 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, - 0xf7ef8204, 0x519889b0, 0x6070932d, 0xc6079899, - 0x304fe870, 0x9638e3c4, 0xa7d0f959, 0x01a7f2ed, - 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, - 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, - 0x90311eca, 0x3646157e, 0x07ae0fe3, 0xa1d90457, - 0x579174be, 0xf1e67f0a, 0xc00e6597, 0x66796e23, - 0xa3de50ad, 0x05a95b19, 0x34414184, 0x92364a30, - 0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, - 0x844a0efa, 0x48e00e64, 0xc66f0987, 0x0ac50919, - 0xd3e51bb5, 0x1f4f1b2b, 0x91c01cc8, 0x5d6a1c56, - 0x57af154f, 0x9b0515d1, 0x158a1232, 0xd92012ac, - 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, - 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, - 0xaf5e2a9e, 0x63f42a00, 0xed7b2de3, 0x21d12d7d, - 0x2b142464, 0xe7be24fa, 0x69312319, 0xa59b2387, - 0xf9766256, 0x35dc62c8, 0xbb53652b, 0x77f965b5, - 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, - 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, - 0xaed97719, 0x62737787, 0xecfc7064, 0x205670fa, - 0x85cd537d, 0x496753e3, 0xc7e85400, 0x0b42549e, - 0x01875d87, 0xcd2d5d19, 0x43a25afa, 0x8f085a64, - 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, - 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, - 0x299dc2ed, 0xe537c273, 0x6bb8c590, 0xa712c50e, - 0xadd7cc17, 0x617dcc89, 0xeff2cb6a, 0x2358cbf4, - 0xfa78d958, 0x36d2d9c6, 0xb85dde25, 0x74f7debb, - 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, - 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, - 0xd16cfd3c, 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, - 0x86c3e873, 0x4a69e8ed, 0xc4e6ef0e, 0x084cef90, - 0x0289e689, 0xce23e617, 0x40ace1f4, 0x8c06e16a, - 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, - 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, - 0x030ebb0e, 0xcfa4bb90, 0x412bbc73, 0x8d81bced, - 0x8744b5f4, 0x4beeb56a, 0xc561b289, 0x09cbb217, - 0xac509190, 0x60fa910e, 0xee7596ed, 0x22df9673, - 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, - 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, - 0xfbff84df, 0x37558441, 0xb9da83a2, 0x7570833c, - 0x533b85da, 0x9f918544, 0x111e82a7, 0xddb48239, - 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, 0x59fe8cc3, - 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, - 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, - 0x2f80b4f1, 0xe32ab46f, 0x6da5b38c, 0xa10fb312, - 0xabcaba0b, 0x6760ba95, 0xe9efbd76, 0x2545bde8, - 0xfc65af44, 0x30cfafda, 0xbe40a839, 0x72eaa8a7, - 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, - 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, - 0x2e07e976, 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, - 0x79a8fc39, 0xb502fca7, 0x3b8dfb44, 0xf727fbda, - 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, 0x736df520, - 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, - 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, - 0x0513cd12, 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, - 0x8159c3e8, 0x4df3c376, 0xc37cc495, 0x0fd6c40b, - 0x7aa64737, 0xb60c47a9, 0x3883404a, 0xf42940d4, - 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, - 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, - 0x2d095278, 0xe1a352e6, 0x6f2c5505, 0xa386559b, - 0x061d761c, 0xcab77682, 0x44387161, 0x889271ff, - 0x825778e6, 0x4efd7878, 0xc0727f9b, 0x0cd87f05, - 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, - 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, - 0x83d02561, 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, - 0x079a2b9b, 0xcb302b05, 0x45bf2ce6, 0x89152c78, - 0x50353ed4, 0x9c9f3e4a, 0x121039a9, 0xdeba3937, - 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, - 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, - 0x7b211ab0, 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, - 0x2c8e0fff, 0xe0240f61, 0x6eab0882, 0xa201081c, - 0xa8c40105, 0x646e019b, 0xeae10678, 0x264b06e6, -#endif /* CRC32_SLICE8 */ -}; diff --git a/util/compress/libdeflate/lib/crc32_vec_template.h b/util/compress/libdeflate/lib/crc32_vec_template.h deleted file mode 100644 index 9a2ad5bde5..0000000000 --- a/util/compress/libdeflate/lib/crc32_vec_template.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * crc32_vec_template.h - template for vectorized CRC-32 implementations - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#define CRC32_SLICE1 1 -static u32 crc32_slice1(u32, const u8 *, size_t); - -/* - * Template for vectorized CRC-32 implementations. - * - * Note: on unaligned ends of the buffer, we fall back to crc32_slice1() instead - * of crc32_slice8() because only a few bytes need to be processed, so a smaller - * table is preferable. - */ -static u32 ATTRIBUTES -FUNCNAME(u32 remainder, const u8 *p, size_t size) -{ - if ((uintptr_t)p % IMPL_ALIGNMENT) { - size_t n = MIN(size, -(uintptr_t)p % IMPL_ALIGNMENT); - - remainder = crc32_slice1(remainder, p, n); - p += n; - size -= n; - } - if (size >= IMPL_SEGMENT_SIZE) { - remainder = FUNCNAME_ALIGNED(remainder, (const void *)p, - size / IMPL_SEGMENT_SIZE); - p += size - (size % IMPL_SEGMENT_SIZE); - size %= IMPL_SEGMENT_SIZE; - } - return crc32_slice1(remainder, p, size); -} - -#undef FUNCNAME -#undef FUNCNAME_ALIGNED -#undef ATTRIBUTES -#undef IMPL_ALIGNMENT -#undef IMPL_SEGMENT_SIZE diff --git a/util/compress/libdeflate/lib/decompress_template.h b/util/compress/libdeflate/lib/decompress_template.h deleted file mode 100644 index c6bcf9f52a..0000000000 --- a/util/compress/libdeflate/lib/decompress_template.h +++ /dev/null @@ -1,421 +0,0 @@ -/* - * decompress_template.h - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -/* - * This is the actual DEFLATE decompression routine, lifted out of - * deflate_decompress.c so that it can be compiled multiple times with different - * target instruction sets. - */ - -static enum libdeflate_result ATTRIBUTES -FUNCNAME(struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, size_t *actual_out_nbytes_ret) -{ - u8 *out_next = out; - u8 * const out_end = out_next + out_nbytes_avail; - const u8 *in_next = in; - const u8 * const in_end = in_next + in_nbytes; - bitbuf_t bitbuf = 0; - unsigned bitsleft = 0; - size_t overrun_count = 0; - unsigned i; - unsigned is_final_block; - unsigned block_type; - u16 len; - u16 nlen; - unsigned num_litlen_syms; - unsigned num_offset_syms; - u16 tmp16; - u32 tmp32; - -next_block: - /* Starting to read the next block. */ - ; - - STATIC_ASSERT(CAN_ENSURE(1 + 2 + 5 + 5 + 4)); - ENSURE_BITS(1 + 2 + 5 + 5 + 4); - - /* BFINAL: 1 bit */ - is_final_block = POP_BITS(1); - - /* BTYPE: 2 bits */ - block_type = POP_BITS(2); - - if (block_type == DEFLATE_BLOCKTYPE_DYNAMIC_HUFFMAN) { - - /* Dynamic Huffman block. */ - - /* The order in which precode lengths are stored. */ - static const u8 deflate_precode_lens_permutation[DEFLATE_NUM_PRECODE_SYMS] = { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - }; - - unsigned num_explicit_precode_lens; - - /* Read the codeword length counts. */ - - STATIC_ASSERT(DEFLATE_NUM_LITLEN_SYMS == ((1 << 5) - 1) + 257); - num_litlen_syms = POP_BITS(5) + 257; - - STATIC_ASSERT(DEFLATE_NUM_OFFSET_SYMS == ((1 << 5) - 1) + 1); - num_offset_syms = POP_BITS(5) + 1; - - STATIC_ASSERT(DEFLATE_NUM_PRECODE_SYMS == ((1 << 4) - 1) + 4); - num_explicit_precode_lens = POP_BITS(4) + 4; - - d->static_codes_loaded = false; - - /* Read the precode codeword lengths. */ - STATIC_ASSERT(DEFLATE_MAX_PRE_CODEWORD_LEN == (1 << 3) - 1); - for (i = 0; i < num_explicit_precode_lens; i++) { - ENSURE_BITS(3); - d->u.precode_lens[deflate_precode_lens_permutation[i]] = POP_BITS(3); - } - - for (; i < DEFLATE_NUM_PRECODE_SYMS; i++) - d->u.precode_lens[deflate_precode_lens_permutation[i]] = 0; - - /* Build the decode table for the precode. */ - SAFETY_CHECK(build_precode_decode_table(d)); - - /* Expand the literal/length and offset codeword lengths. */ - for (i = 0; i < num_litlen_syms + num_offset_syms; ) { - u32 entry; - unsigned presym; - u8 rep_val; - unsigned rep_count; - - ENSURE_BITS(DEFLATE_MAX_PRE_CODEWORD_LEN + 7); - - /* (The code below assumes that the precode decode table - * does not have any subtables.) */ - STATIC_ASSERT(PRECODE_TABLEBITS == DEFLATE_MAX_PRE_CODEWORD_LEN); - - /* Read the next precode symbol. */ - entry = d->u.l.precode_decode_table[BITS(DEFLATE_MAX_PRE_CODEWORD_LEN)]; - REMOVE_BITS(entry & HUFFDEC_LENGTH_MASK); - presym = entry >> HUFFDEC_RESULT_SHIFT; - - if (presym < 16) { - /* Explicit codeword length */ - d->u.l.lens[i++] = presym; - continue; - } - - /* Run-length encoded codeword lengths */ - - /* Note: we don't need verify that the repeat count - * doesn't overflow the number of elements, since we - * have enough extra spaces to allow for the worst-case - * overflow (138 zeroes when only 1 length was - * remaining). - * - * In the case of the small repeat counts (presyms 16 - * and 17), it is fastest to always write the maximum - * number of entries. That gets rid of branches that - * would otherwise be required. - * - * It is not just because of the numerical order that - * our checks go in the order 'presym < 16', 'presym == - * 16', and 'presym == 17'. For typical data this is - * ordered from most frequent to least frequent case. - */ - STATIC_ASSERT(DEFLATE_MAX_LENS_OVERRUN == 138 - 1); - - if (presym == 16) { - /* Repeat the previous length 3 - 6 times */ - SAFETY_CHECK(i != 0); - rep_val = d->u.l.lens[i - 1]; - STATIC_ASSERT(3 + ((1 << 2) - 1) == 6); - rep_count = 3 + POP_BITS(2); - d->u.l.lens[i + 0] = rep_val; - d->u.l.lens[i + 1] = rep_val; - d->u.l.lens[i + 2] = rep_val; - d->u.l.lens[i + 3] = rep_val; - d->u.l.lens[i + 4] = rep_val; - d->u.l.lens[i + 5] = rep_val; - i += rep_count; - } else if (presym == 17) { - /* Repeat zero 3 - 10 times */ - STATIC_ASSERT(3 + ((1 << 3) - 1) == 10); - rep_count = 3 + POP_BITS(3); - d->u.l.lens[i + 0] = 0; - d->u.l.lens[i + 1] = 0; - d->u.l.lens[i + 2] = 0; - d->u.l.lens[i + 3] = 0; - d->u.l.lens[i + 4] = 0; - d->u.l.lens[i + 5] = 0; - d->u.l.lens[i + 6] = 0; - d->u.l.lens[i + 7] = 0; - d->u.l.lens[i + 8] = 0; - d->u.l.lens[i + 9] = 0; - i += rep_count; - } else { - /* Repeat zero 11 - 138 times */ - STATIC_ASSERT(11 + ((1 << 7) - 1) == 138); - rep_count = 11 + POP_BITS(7); - memset(&d->u.l.lens[i], 0, - rep_count * sizeof(d->u.l.lens[i])); - i += rep_count; - } - } - } else if (block_type == DEFLATE_BLOCKTYPE_UNCOMPRESSED) { - - /* Uncompressed block: copy 'len' bytes literally from the input - * buffer to the output buffer. */ - - ALIGN_INPUT(); - - SAFETY_CHECK(in_end - in_next >= 4); - - len = READ_U16(); - nlen = READ_U16(); - - SAFETY_CHECK(len == (u16)~nlen); - if (unlikely(len > out_end - out_next)) - return LIBDEFLATE_INSUFFICIENT_SPACE; - SAFETY_CHECK(len <= in_end - in_next); - - memcpy(out_next, in_next, len); - in_next += len; - out_next += len; - - goto block_done; - - } else { - SAFETY_CHECK(block_type == DEFLATE_BLOCKTYPE_STATIC_HUFFMAN); - - /* - * Static Huffman block: build the decode tables for the static - * codes. Skip doing so if the tables are already set up from - * an earlier static block; this speeds up decompression of - * degenerate input of many empty or very short static blocks. - * - * Afterwards, the remainder is the same as decompressing a - * dynamic Huffman block. - */ - - if (d->static_codes_loaded) - goto have_decode_tables; - - d->static_codes_loaded = true; - - STATIC_ASSERT(DEFLATE_NUM_LITLEN_SYMS == 288); - STATIC_ASSERT(DEFLATE_NUM_OFFSET_SYMS == 32); - - for (i = 0; i < 144; i++) - d->u.l.lens[i] = 8; - for (; i < 256; i++) - d->u.l.lens[i] = 9; - for (; i < 280; i++) - d->u.l.lens[i] = 7; - for (; i < 288; i++) - d->u.l.lens[i] = 8; - - for (; i < 288 + 32; i++) - d->u.l.lens[i] = 5; - - num_litlen_syms = 288; - num_offset_syms = 32; - } - - /* Decompressing a Huffman block (either dynamic or static) */ - - SAFETY_CHECK(build_offset_decode_table(d, num_litlen_syms, num_offset_syms)); - SAFETY_CHECK(build_litlen_decode_table(d, num_litlen_syms, num_offset_syms)); -have_decode_tables: - - /* The main DEFLATE decode loop */ - for (;;) { - u32 entry; - u32 length; - u32 offset; - const u8 *src; - u8 *dst; - - /* Decode a litlen symbol. */ - ENSURE_BITS(DEFLATE_MAX_LITLEN_CODEWORD_LEN); - entry = d->u.litlen_decode_table[BITS(LITLEN_TABLEBITS)]; - if (entry & HUFFDEC_SUBTABLE_POINTER) { - /* Litlen subtable required (uncommon case) */ - REMOVE_BITS(LITLEN_TABLEBITS); - entry = d->u.litlen_decode_table[ - ((entry >> HUFFDEC_RESULT_SHIFT) & 0xFFFF) + - BITS(entry & HUFFDEC_LENGTH_MASK)]; - } - REMOVE_BITS(entry & HUFFDEC_LENGTH_MASK); - if (entry & HUFFDEC_LITERAL) { - /* Literal */ - if (unlikely(out_next == out_end)) - return LIBDEFLATE_INSUFFICIENT_SPACE; - *out_next++ = (u8)(entry >> HUFFDEC_RESULT_SHIFT); - continue; - } - - /* Match or end-of-block */ - - entry >>= HUFFDEC_RESULT_SHIFT; - ENSURE_BITS(MAX_ENSURE); - - /* Pop the extra length bits and add them to the length base to - * produce the full length. */ - length = (entry >> HUFFDEC_LENGTH_BASE_SHIFT) + - POP_BITS(entry & HUFFDEC_EXTRA_LENGTH_BITS_MASK); - - /* The match destination must not end after the end of the - * output buffer. For efficiency, combine this check with the - * end-of-block check. We're using 0 for the special - * end-of-block length, so subtract 1 and it turn it into - * SIZE_MAX. */ - STATIC_ASSERT(HUFFDEC_END_OF_BLOCK_LENGTH == 0); - if (unlikely((size_t)length - 1 >= out_end - out_next)) { - if (unlikely(length != HUFFDEC_END_OF_BLOCK_LENGTH)) - return LIBDEFLATE_INSUFFICIENT_SPACE; - goto block_done; - } - - /* Decode the match offset. */ - - entry = d->offset_decode_table[BITS(OFFSET_TABLEBITS)]; - if (entry & HUFFDEC_SUBTABLE_POINTER) { - /* Offset subtable required (uncommon case) */ - REMOVE_BITS(OFFSET_TABLEBITS); - entry = d->offset_decode_table[ - ((entry >> HUFFDEC_RESULT_SHIFT) & 0xFFFF) + - BITS(entry & HUFFDEC_LENGTH_MASK)]; - } - REMOVE_BITS(entry & HUFFDEC_LENGTH_MASK); - entry >>= HUFFDEC_RESULT_SHIFT; - - STATIC_ASSERT(CAN_ENSURE(DEFLATE_MAX_EXTRA_LENGTH_BITS + - DEFLATE_MAX_OFFSET_CODEWORD_LEN) && - CAN_ENSURE(DEFLATE_MAX_EXTRA_OFFSET_BITS)); - if (!CAN_ENSURE(DEFLATE_MAX_EXTRA_LENGTH_BITS + - DEFLATE_MAX_OFFSET_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_OFFSET_BITS)) - ENSURE_BITS(DEFLATE_MAX_EXTRA_OFFSET_BITS); - - /* Pop the extra offset bits and add them to the offset base to - * produce the full offset. */ - offset = (entry & HUFFDEC_OFFSET_BASE_MASK) + - POP_BITS(entry >> HUFFDEC_EXTRA_OFFSET_BITS_SHIFT); - - /* The match source must not begin before the beginning of the - * output buffer. */ - SAFETY_CHECK(offset <= out_next - (const u8 *)out); - - /* - * Copy the match: 'length' bytes at 'out_next - offset' to - * 'out_next', possibly overlapping. If the match doesn't end - * too close to the end of the buffer and offset >= WORDBYTES || - * offset == 1, take a fast path which copies a word at a time - * -- potentially more than the length of the match, but that's - * fine as long as we check for enough extra space. - * - * The remaining cases are not performance-critical so are - * handled by a simple byte-by-byte copy. - */ - - src = out_next - offset; - dst = out_next; - out_next += length; - - if (UNALIGNED_ACCESS_IS_FAST && - /* max overrun is writing 3 words for a min length match */ - likely(out_end - out_next >= - 3 * WORDBYTES - DEFLATE_MIN_MATCH_LEN)) { - if (offset >= WORDBYTES) { /* words don't overlap? */ - copy_word_unaligned(src, dst); - src += WORDBYTES; - dst += WORDBYTES; - copy_word_unaligned(src, dst); - src += WORDBYTES; - dst += WORDBYTES; - do { - copy_word_unaligned(src, dst); - src += WORDBYTES; - dst += WORDBYTES; - } while (dst < out_next); - } else if (offset == 1) { - /* RLE encoding of previous byte, common if the - * data contains many repeated bytes */ - machine_word_t v = repeat_byte(*src); - - store_word_unaligned(v, dst); - dst += WORDBYTES; - store_word_unaligned(v, dst); - dst += WORDBYTES; - do { - store_word_unaligned(v, dst); - dst += WORDBYTES; - } while (dst < out_next); - } else { - *dst++ = *src++; - *dst++ = *src++; - do { - *dst++ = *src++; - } while (dst < out_next); - } - } else { - STATIC_ASSERT(DEFLATE_MIN_MATCH_LEN == 3); - *dst++ = *src++; - *dst++ = *src++; - do { - *dst++ = *src++; - } while (dst < out_next); - } - } - -block_done: - /* Finished decoding a block. */ - - if (!is_final_block) - goto next_block; - - /* That was the last block. */ - - /* Discard any readahead bits and check for excessive overread */ - ALIGN_INPUT(); - - /* Optionally return the actual number of bytes read */ - if (actual_in_nbytes_ret) - *actual_in_nbytes_ret = in_next - (u8 *)in; - - /* Optionally return the actual number of bytes written */ - if (actual_out_nbytes_ret) { - *actual_out_nbytes_ret = out_next - (u8 *)out; - } else { - if (out_next != out_end) - return LIBDEFLATE_SHORT_OUTPUT; - } - return LIBDEFLATE_SUCCESS; -} - -#undef FUNCNAME -#undef ATTRIBUTES diff --git a/util/compress/libdeflate/lib/deflate_compress.c b/util/compress/libdeflate/lib/deflate_compress.c deleted file mode 100644 index cf43798240..0000000000 --- a/util/compress/libdeflate/lib/deflate_compress.c +++ /dev/null @@ -1,2854 +0,0 @@ -/* - * deflate_compress.c - a compressor for DEFLATE - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "deflate_compress.h" -#include "deflate_constants.h" -#include "unaligned.h" - -#include "libdeflate.h" - -/* - * By default, the near-optimal parsing algorithm is enabled at compression - * level 8 and above. The near-optimal parsing algorithm produces a compression - * ratio significantly better than the greedy and lazy algorithms implemented - * here, and also the algorithm used by zlib at level 9. However, it is slow. - */ -#define SUPPORT_NEAR_OPTIMAL_PARSING 1 - -/* - * Define to 1 to maintain the full map from match offsets to offset slots. - * This slightly speeds up translations of match offsets to offset slots, but it - * uses 32769 bytes of memory rather than the 512 bytes used by the condensed - * map. The speedup provided by the larger map is most helpful when the - * near-optimal parsing algorithm is being used. - */ -#define USE_FULL_OFFSET_SLOT_FAST SUPPORT_NEAR_OPTIMAL_PARSING - -/* - * DEFLATE uses a 32768 byte sliding window; set the matchfinder parameters - * appropriately. - */ -#define MATCHFINDER_WINDOW_ORDER 15 - -#include "hc_matchfinder.h" -#if SUPPORT_NEAR_OPTIMAL_PARSING -# include "bt_matchfinder.h" -#endif - -/* - * The compressor always chooses a block of at least MIN_BLOCK_LENGTH bytes, - * except if the last block has to be shorter. - */ -#define MIN_BLOCK_LENGTH 10000 - -/* - * The compressor attempts to end blocks after SOFT_MAX_BLOCK_LENGTH bytes, but - * the final length might be slightly longer due to matches extending beyond - * this limit. - */ -#define SOFT_MAX_BLOCK_LENGTH 300000 - -/* - * The number of observed matches or literals that represents sufficient data to - * decide whether the current block should be terminated or not. - */ -#define NUM_OBSERVATIONS_PER_BLOCK_CHECK 512 - - -#if SUPPORT_NEAR_OPTIMAL_PARSING -/* Constants specific to the near-optimal parsing algorithm */ - -/* - * The maximum number of matches the matchfinder can find at a single position. - * Since the matchfinder never finds more than one match for the same length, - * presuming one of each possible length is sufficient for an upper bound. - * (This says nothing about whether it is worthwhile to consider so many - * matches; this is just defining the worst case.) - */ -# define MAX_MATCHES_PER_POS (DEFLATE_MAX_MATCH_LEN - DEFLATE_MIN_MATCH_LEN + 1) - -/* - * The number of lz_match structures in the match cache, excluding the extra - * "overflow" entries. This value should be high enough so that nearly the - * time, all matches found in a given block can fit in the match cache. - * However, fallback behavior (immediately terminating the block) on cache - * overflow is still required. - */ -# define CACHE_LENGTH (SOFT_MAX_BLOCK_LENGTH * 5) - -#endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - -/* - * These are the compressor-side limits on the codeword lengths for each Huffman - * code. To make outputting bits slightly faster, some of these limits are - * lower than the limits defined by the DEFLATE format. This does not - * significantly affect the compression ratio, at least for the block lengths we - * use. - */ -#define MAX_LITLEN_CODEWORD_LEN 14 -#define MAX_OFFSET_CODEWORD_LEN DEFLATE_MAX_OFFSET_CODEWORD_LEN -#define MAX_PRE_CODEWORD_LEN DEFLATE_MAX_PRE_CODEWORD_LEN - -/* Table: length slot => length slot base value */ -static const unsigned deflate_length_slot_base[] = { - 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , - 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 , - 35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , - 131 , 163 , 195 , 227 , 258 , -}; - -/* Table: length slot => number of extra length bits */ -static const u8 deflate_extra_length_bits[] = { - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , - 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , - 5 , 5 , 5 , 5 , 0 , -}; - -/* Table: offset slot => offset slot base value */ -static const unsigned deflate_offset_slot_base[] = { - 1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , - 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 , - 257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , - 4097 , 6145 , 8193 , 12289 , 16385 , 24577 , -}; - -/* Table: offset slot => number of extra offset bits */ -static const u8 deflate_extra_offset_bits[] = { - 0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 , - 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , - 7 , 7 , 8 , 8 , 9 , 9 , 10 , 10 , - 11 , 11 , 12 , 12 , 13 , 13 , -}; - -/* Table: length => length slot */ -static const u8 deflate_length_slot[DEFLATE_MAX_MATCH_LEN + 1] = { - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, - 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, - 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 28, -}; - -/* The order in which precode codeword lengths are stored */ -static const u8 deflate_precode_lens_permutation[DEFLATE_NUM_PRECODE_SYMS] = { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 -}; - -/* Codewords for the DEFLATE Huffman codes. */ -struct deflate_codewords { - u32 litlen[DEFLATE_NUM_LITLEN_SYMS]; - u32 offset[DEFLATE_NUM_OFFSET_SYMS]; -}; - -/* Codeword lengths (in bits) for the DEFLATE Huffman codes. - * A zero length means the corresponding symbol had zero frequency. */ -struct deflate_lens { - u8 litlen[DEFLATE_NUM_LITLEN_SYMS]; - u8 offset[DEFLATE_NUM_OFFSET_SYMS]; -}; - -/* Codewords and lengths for the DEFLATE Huffman codes. */ -struct deflate_codes { - struct deflate_codewords codewords; - struct deflate_lens lens; -}; - -/* Symbol frequency counters for the DEFLATE Huffman codes. */ -struct deflate_freqs { - u32 litlen[DEFLATE_NUM_LITLEN_SYMS]; - u32 offset[DEFLATE_NUM_OFFSET_SYMS]; -}; - -#if SUPPORT_NEAR_OPTIMAL_PARSING - -/* Costs for the near-optimal parsing algorithm. */ -struct deflate_costs { - - /* The cost to output each possible literal. */ - u32 literal[DEFLATE_NUM_LITERALS]; - - /* The cost to output each possible match length. */ - u32 length[DEFLATE_MAX_MATCH_LEN + 1]; - - /* The cost to output a match offset of each possible offset slot. */ - u32 offset_slot[DEFLATE_NUM_OFFSET_SYMS]; -}; - -/* - * COST_SHIFT is a scaling factor that makes it possible to consider fractional - * bit costs. A token requiring 'n' bits to represent has cost n << COST_SHIFT. - * - * Note: this is only useful as a statistical trick for when the true costs are - * unknown. In reality, each token in DEFLATE requires a whole number of bits - * to output. - */ -#define COST_SHIFT 3 - -/* - * The NOSTAT_BITS value for a given alphabet is the number of bits assumed to - * be needed to output a symbol that was unused in the previous optimization - * pass. Assigning a default cost allows the symbol to be used in the next - * optimization pass. However, the cost should be relatively high because the - * symbol probably won't be used very many times (if at all). - */ -#define LITERAL_NOSTAT_BITS 13 -#define LENGTH_NOSTAT_BITS 13 -#define OFFSET_NOSTAT_BITS 10 - -#endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - -/* - * Represents a run of literals followed by a match or end-of-block. This - * struct is needed to temporarily store items chosen by the parser, since items - * cannot be written until all items for the block have been chosen and the - * block's Huffman codes have been computed. - */ -struct deflate_sequence { - - /* Bits 0..22: the number of literals in this run. This may be 0 and - * can be at most about SOFT_MAX_BLOCK_LENGTH. The literals are not - * stored explicitly in this structure; instead, they are read directly - * from the uncompressed data. - * - * Bits 23..31: the length of the match which follows the literals, or 0 - * if this literal run was the last in the block, so there is no match - * which follows it. */ - u32 litrunlen_and_length; - - /* If 'length' doesn't indicate end-of-block, then this is the offset of - * the match which follows the literals. */ - u16 offset; - - /* If 'length' doesn't indicate end-of-block, then this is the offset - * symbol of the match which follows the literals. */ - u8 offset_symbol; - - /* If 'length' doesn't indicate end-of-block, then this is the length - * slot of the match which follows the literals. */ - u8 length_slot; -}; - -#if SUPPORT_NEAR_OPTIMAL_PARSING - -/* - * This structure represents a byte position in the input data and a node in the - * graph of possible match/literal choices for the current block. - * - * Logically, each incoming edge to this node is labeled with a literal or a - * match that can be taken to reach this position from an earlier position; and - * each outgoing edge from this node is labeled with a literal or a match that - * can be taken to advance from this position to a later position. - * - * But these "edges" are actually stored elsewhere (in 'match_cache'). Here we - * associate with each node just two pieces of information: - * - * 'cost_to_end' is the minimum cost to reach the end of the block from - * this position. - * - * 'item' represents the literal or match that must be chosen from here to - * reach the end of the block with the minimum cost. Equivalently, this - * can be interpreted as the label of the outgoing edge on the minimum-cost - * path to the "end of block" node from this node. - */ -struct deflate_optimum_node { - - u32 cost_to_end; - - /* - * Notes on the match/literal representation used here: - * - * The low bits of 'item' are the length: 1 if this is a literal, - * or the match length if this is a match. - * - * The high bits of 'item' are the actual literal byte if this is a - * literal, or the match offset if this is a match. - */ -#define OPTIMUM_OFFSET_SHIFT 9 -#define OPTIMUM_LEN_MASK (((u32)1 << OPTIMUM_OFFSET_SHIFT) - 1) - u32 item; - -}; - -#endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - -/* Block split statistics. See "Block splitting algorithm" below. */ -#define NUM_LITERAL_OBSERVATION_TYPES 8 -#define NUM_MATCH_OBSERVATION_TYPES 2 -#define NUM_OBSERVATION_TYPES (NUM_LITERAL_OBSERVATION_TYPES + NUM_MATCH_OBSERVATION_TYPES) -struct block_split_stats { - u32 new_observations[NUM_OBSERVATION_TYPES]; - u32 observations[NUM_OBSERVATION_TYPES]; - u32 num_new_observations; - u32 num_observations; -}; - -/* The main DEFLATE compressor structure */ -struct libdeflate_compressor { - - /* Pointer to the compress() implementation chosen at allocation time */ - size_t (*impl)(struct libdeflate_compressor *, - const u8 *, size_t, u8 *, size_t); - - /* Frequency counters for the current block */ - struct deflate_freqs freqs; - - /* Dynamic Huffman codes for the current block */ - struct deflate_codes codes; - - /* Static Huffman codes */ - struct deflate_codes static_codes; - - /* Block split statistics for the currently pending block */ - struct block_split_stats split_stats; - - /* A table for fast lookups of offset slot by match offset. - * - * If the full table is being used, it is a direct mapping from offset - * to offset slot. - * - * If the condensed table is being used, the first 256 entries map - * directly to the offset slots of offsets 1 through 256. The next 256 - * entries map to the offset slots for the remaining offsets, stepping - * through the offsets with a stride of 128. This relies on the fact - * that each of the remaining offset slots contains at least 128 offsets - * and has an offset base that is a multiple of 128. */ -#if USE_FULL_OFFSET_SLOT_FAST - u8 offset_slot_fast[DEFLATE_MAX_MATCH_OFFSET + 1]; -#else - u8 offset_slot_fast[512]; -#endif - - /* The "nice" match length: if a match of this length is found, choose - * it immediately without further consideration. */ - unsigned nice_match_length; - - /* The maximum search depth: consider at most this many potential - * matches at each position. */ - unsigned max_search_depth; - - /* The compression level with which this compressor was created. */ - unsigned compression_level; - - /* Anything smaller than this we won't bother trying to compress. */ - unsigned min_size_to_compress; - - /* Temporary space for Huffman code output */ - u32 precode_freqs[DEFLATE_NUM_PRECODE_SYMS]; - u8 precode_lens[DEFLATE_NUM_PRECODE_SYMS]; - u32 precode_codewords[DEFLATE_NUM_PRECODE_SYMS]; - unsigned precode_items[DEFLATE_NUM_LITLEN_SYMS + DEFLATE_NUM_OFFSET_SYMS]; - unsigned num_litlen_syms; - unsigned num_offset_syms; - unsigned num_explicit_lens; - unsigned num_precode_items; - - union { - /* Data for greedy or lazy parsing */ - struct { - /* Hash chain matchfinder */ - struct hc_matchfinder hc_mf; - - /* The matches and literals that the parser has chosen - * for the current block. The required length of this - * array is limited by the maximum number of matches - * that can ever be chosen for a single block, plus one - * for the special entry at the end. */ - struct deflate_sequence sequences[ - DIV_ROUND_UP(SOFT_MAX_BLOCK_LENGTH, - DEFLATE_MIN_MATCH_LEN) + 1]; - } g; /* (g)reedy */ - - #if SUPPORT_NEAR_OPTIMAL_PARSING - /* Data for near-optimal parsing */ - struct { - - /* Binary tree matchfinder */ - struct bt_matchfinder bt_mf; - - /* - * Cached matches for the current block. This array - * contains the matches that were found at each position - * in the block. Specifically, for each position, there - * is a list of matches found at that position, if any, - * sorted by strictly increasing length. In addition, - * following the matches for each position, there is a - * special 'struct lz_match' whose 'length' member - * contains the number of matches found at that - * position, and whose 'offset' member contains the - * literal at that position. - * - * Note: in rare cases, there will be a very high number - * of matches in the block and this array will overflow. - * If this happens, we force the end of the current - * block. CACHE_LENGTH is the length at which we - * actually check for overflow. The extra slots beyond - * this are enough to absorb the worst case overflow, - * which occurs if starting at &match_cache[CACHE_LENGTH - * - 1], we write MAX_MATCHES_PER_POS matches and a - * match count header, then skip searching for matches - * at 'DEFLATE_MAX_MATCH_LEN - 1' positions and write - * the match count header for each. - */ - struct lz_match match_cache[CACHE_LENGTH + - MAX_MATCHES_PER_POS + - DEFLATE_MAX_MATCH_LEN - 1]; - - /* - * Array of nodes, one per position, for running the - * minimum-cost path algorithm. - * - * This array must be large enough to accommodate the - * worst-case number of nodes, which occurs if we find a - * match of length DEFLATE_MAX_MATCH_LEN at position - * SOFT_MAX_BLOCK_LENGTH - 1, producing a block of - * length SOFT_MAX_BLOCK_LENGTH - 1 + - * DEFLATE_MAX_MATCH_LEN. Add one for the end-of-block - * node. - */ - struct deflate_optimum_node optimum_nodes[SOFT_MAX_BLOCK_LENGTH - 1 + - DEFLATE_MAX_MATCH_LEN + 1]; - - /* The current cost model being used. */ - struct deflate_costs costs; - - unsigned num_optim_passes; - } n; /* (n)ear-optimal */ - #endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - - } p; /* (p)arser */ -}; - -/* - * The type for the bitbuffer variable, which temporarily holds bits that are - * being packed into bytes and written to the output buffer. For best - * performance, this should have size equal to a machine word. - */ -typedef machine_word_t bitbuf_t; -#define BITBUF_NBITS (8 * sizeof(bitbuf_t)) - -/* Can the specified number of bits always be added to 'bitbuf' after any - * pending bytes have been flushed? */ -#define CAN_BUFFER(n) ((n) <= BITBUF_NBITS - 7) - -/* - * Structure to keep track of the current state of sending bits to the - * compressed output buffer. - */ -struct deflate_output_bitstream { - - /* Bits that haven't yet been written to the output buffer. */ - bitbuf_t bitbuf; - - /* Number of bits currently held in @bitbuf. */ - unsigned bitcount; - - /* Pointer to the beginning of the output buffer. */ - u8 *begin; - - /* Pointer to the position in the output buffer at which the next byte - * should be written. */ - u8 *next; - - /* Pointer just past the end of the output buffer. */ - u8 *end; -}; - -/* - * OUTPUT_END_PADDING is the size, in bytes, of the extra space that must be - * present following os->end, in order to not overrun the buffer when generating - * output. When UNALIGNED_ACCESS_IS_FAST, we need at least sizeof(bitbuf_t) - * bytes for put_unaligned_leword(). Otherwise we need only 1 byte. However, - * to make the compression algorithm produce the same result on all CPU - * architectures (which is sometimes desirable), we have to unconditionally use - * the maximum for any CPU, which is sizeof(bitbuf_t) == 8. - */ -#define OUTPUT_END_PADDING 8 - -/* Initialize the output bitstream. 'size' is assumed to be at least - * OUTPUT_END_PADDING. */ -static void -deflate_init_output(struct deflate_output_bitstream *os, - void *buffer, size_t size) -{ - os->bitbuf = 0; - os->bitcount = 0; - os->begin = buffer; - os->next = os->begin; - os->end = os->begin + size - OUTPUT_END_PADDING; -} - -/* Add some bits to the bitbuffer variable of the output bitstream. The caller - * must make sure there is enough room. */ -static forceinline void -deflate_add_bits(struct deflate_output_bitstream *os, - const bitbuf_t bits, const unsigned num_bits) -{ - os->bitbuf |= bits << os->bitcount; - os->bitcount += num_bits; -} - -/* Flush bits from the bitbuffer variable to the output buffer. */ -static forceinline void -deflate_flush_bits(struct deflate_output_bitstream *os) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - /* Flush a whole word (branchlessly). */ - put_unaligned_leword(os->bitbuf, os->next); - os->bitbuf >>= os->bitcount & ~7; - os->next += MIN(os->end - os->next, os->bitcount >> 3); - os->bitcount &= 7; - } else { - /* Flush a byte at a time. */ - while (os->bitcount >= 8) { - *os->next = os->bitbuf; - if (os->next != os->end) - os->next++; - os->bitcount -= 8; - os->bitbuf >>= 8; - } - } -} - -/* Align the bitstream on a byte boundary. */ -static forceinline void -deflate_align_bitstream(struct deflate_output_bitstream *os) -{ - os->bitcount += -os->bitcount & 7; - deflate_flush_bits(os); -} - -/* - * Flush any remaining bits to the output buffer if needed. Return the total - * number of bytes written to the output buffer, or 0 if an overflow occurred. - */ -static size_t -deflate_flush_output(struct deflate_output_bitstream *os) -{ - if (os->next == os->end) /* overflow? */ - return 0; - - while ((int)os->bitcount > 0) { - *os->next++ = os->bitbuf; - os->bitcount -= 8; - os->bitbuf >>= 8; - } - - return os->next - os->begin; -} - -/* Given the binary tree node A[subtree_idx] whose children already - * satisfy the maxheap property, swap the node with its greater child - * until it is greater than both its children, so that the maxheap - * property is satisfied in the subtree rooted at A[subtree_idx]. */ -static void -heapify_subtree(u32 A[], unsigned length, unsigned subtree_idx) -{ - unsigned parent_idx; - unsigned child_idx; - u32 v; - - v = A[subtree_idx]; - parent_idx = subtree_idx; - while ((child_idx = parent_idx * 2) <= length) { - if (child_idx < length && A[child_idx + 1] > A[child_idx]) - child_idx++; - if (v >= A[child_idx]) - break; - A[parent_idx] = A[child_idx]; - parent_idx = child_idx; - } - A[parent_idx] = v; -} - -/* Rearrange the array 'A' so that it satisfies the maxheap property. - * 'A' uses 1-based indices, so the children of A[i] are A[i*2] and A[i*2 + 1]. - */ -static void -heapify_array(u32 A[], unsigned length) -{ - unsigned subtree_idx; - - for (subtree_idx = length / 2; subtree_idx >= 1; subtree_idx--) - heapify_subtree(A, length, subtree_idx); -} - -/* - * Sort the array 'A', which contains 'length' unsigned 32-bit integers. - * - * Note: name this function heap_sort() instead of heapsort() to avoid colliding - * with heapsort() from stdlib.h on BSD-derived systems --- though this isn't - * necessary when compiling with -D_ANSI_SOURCE, which is the better solution. - */ -static void -heap_sort(u32 A[], unsigned length) -{ - A--; /* Use 1-based indices */ - - heapify_array(A, length); - - while (length >= 2) { - u32 tmp = A[length]; - A[length] = A[1]; - A[1] = tmp; - length--; - heapify_subtree(A, length, 1); - } -} - -#define NUM_SYMBOL_BITS 10 -#define SYMBOL_MASK ((1 << NUM_SYMBOL_BITS) - 1) - -#define GET_NUM_COUNTERS(num_syms) ((((num_syms) + 3 / 4) + 3) & ~3) -/* - * Sort the symbols primarily by frequency and secondarily by symbol - * value. Discard symbols with zero frequency and fill in an array with - * the remaining symbols, along with their frequencies. The low - * NUM_SYMBOL_BITS bits of each array entry will contain the symbol - * value, and the remaining bits will contain the frequency. - * - * @num_syms - * Number of symbols in the alphabet. - * Can't be greater than (1 << NUM_SYMBOL_BITS). - * - * @freqs[num_syms] - * The frequency of each symbol. - * - * @lens[num_syms] - * An array that eventually will hold the length of each codeword. - * This function only fills in the codeword lengths for symbols that - * have zero frequency, which are not well defined per se but will - * be set to 0. - * - * @symout[num_syms] - * The output array, described above. - * - * Returns the number of entries in 'symout' that were filled. This is - * the number of symbols that have nonzero frequency. - */ -static unsigned -sort_symbols(unsigned num_syms, const u32 freqs[restrict], - u8 lens[restrict], u32 symout[restrict]) -{ - unsigned sym; - unsigned i; - unsigned num_used_syms; - unsigned num_counters; - unsigned counters[GET_NUM_COUNTERS(DEFLATE_MAX_NUM_SYMS)]; - - /* We rely on heapsort, but with an added optimization. Since - * it's common for most symbol frequencies to be low, we first do - * a count sort using a limited number of counters. High - * frequencies will be counted in the last counter, and only they - * will be sorted with heapsort. - * - * Note: with more symbols, it is generally beneficial to have more - * counters. About 1 counter per 4 symbols seems fast. - * - * Note: I also tested radix sort, but even for large symbol - * counts (> 255) and frequencies bounded at 16 bits (enabling - * radix sort by just two base-256 digits), it didn't seem any - * faster than the method implemented here. - * - * Note: I tested the optimized quicksort implementation from - * glibc (with indirection overhead removed), but it was only - * marginally faster than the simple heapsort implemented here. - * - * Tests were done with building the codes for LZX. Results may - * vary for different compression algorithms...! */ - - num_counters = GET_NUM_COUNTERS(num_syms); - - memset(counters, 0, num_counters * sizeof(counters[0])); - - /* Count the frequencies. */ - for (sym = 0; sym < num_syms; sym++) - counters[MIN(freqs[sym], num_counters - 1)]++; - - /* Make the counters cumulative, ignoring the zero-th, which - * counted symbols with zero frequency. As a side effect, this - * calculates the number of symbols with nonzero frequency. */ - num_used_syms = 0; - for (i = 1; i < num_counters; i++) { - unsigned count = counters[i]; - counters[i] = num_used_syms; - num_used_syms += count; - } - - /* Sort nonzero-frequency symbols using the counters. At the - * same time, set the codeword lengths of zero-frequency symbols - * to 0. */ - for (sym = 0; sym < num_syms; sym++) { - u32 freq = freqs[sym]; - if (freq != 0) { - symout[counters[MIN(freq, num_counters - 1)]++] = - sym | (freq << NUM_SYMBOL_BITS); - } else { - lens[sym] = 0; - } - } - - /* Sort the symbols counted in the last counter. */ - heap_sort(symout + counters[num_counters - 2], - counters[num_counters - 1] - counters[num_counters - 2]); - - return num_used_syms; -} - -/* - * Build the Huffman tree. - * - * This is an optimized implementation that - * (a) takes advantage of the frequencies being already sorted; - * (b) only generates non-leaf nodes, since the non-leaf nodes of a - * Huffman tree are sufficient to generate a canonical code; - * (c) Only stores parent pointers, not child pointers; - * (d) Produces the nodes in the same memory used for input - * frequency information. - * - * Array 'A', which contains 'sym_count' entries, is used for both input - * and output. For this function, 'sym_count' must be at least 2. - * - * For input, the array must contain the frequencies of the symbols, - * sorted in increasing order. Specifically, each entry must contain a - * frequency left shifted by NUM_SYMBOL_BITS bits. Any data in the low - * NUM_SYMBOL_BITS bits of the entries will be ignored by this function. - * Although these bits will, in fact, contain the symbols that correspond - * to the frequencies, this function is concerned with frequencies only - * and keeps the symbols as-is. - * - * For output, this function will produce the non-leaf nodes of the - * Huffman tree. These nodes will be stored in the first (sym_count - 1) - * entries of the array. Entry A[sym_count - 2] will represent the root - * node. Each other node will contain the zero-based index of its parent - * node in 'A', left shifted by NUM_SYMBOL_BITS bits. The low - * NUM_SYMBOL_BITS bits of each entry in A will be kept as-is. Again, - * note that although these low bits will, in fact, contain a symbol - * value, this symbol will have *no relationship* with the Huffman tree - * node that happens to occupy the same slot. This is because this - * implementation only generates the non-leaf nodes of the tree. - */ -static void -build_tree(u32 A[], unsigned sym_count) -{ - /* Index, in 'A', of next lowest frequency symbol that has not - * yet been processed. */ - unsigned i = 0; - - /* Index, in 'A', of next lowest frequency parentless non-leaf - * node; or, if equal to 'e', then no such node exists yet. */ - unsigned b = 0; - - /* Index, in 'A', of next node to allocate as a non-leaf. */ - unsigned e = 0; - - do { - unsigned m, n; - u32 freq_shifted; - - /* Choose the two next lowest frequency entries. */ - - if (i != sym_count && - (b == e || (A[i] >> NUM_SYMBOL_BITS) <= (A[b] >> NUM_SYMBOL_BITS))) - m = i++; - else - m = b++; - - if (i != sym_count && - (b == e || (A[i] >> NUM_SYMBOL_BITS) <= (A[b] >> NUM_SYMBOL_BITS))) - n = i++; - else - n = b++; - - /* Allocate a non-leaf node and link the entries to it. - * - * If we link an entry that we're visiting for the first - * time (via index 'i'), then we're actually linking a - * leaf node and it will have no effect, since the leaf - * will be overwritten with a non-leaf when index 'e' - * catches up to it. But it's not any slower to - * unconditionally set the parent index. - * - * We also compute the frequency of the non-leaf node as - * the sum of its two children's frequencies. */ - - freq_shifted = (A[m] & ~SYMBOL_MASK) + (A[n] & ~SYMBOL_MASK); - - A[m] = (A[m] & SYMBOL_MASK) | (e << NUM_SYMBOL_BITS); - A[n] = (A[n] & SYMBOL_MASK) | (e << NUM_SYMBOL_BITS); - A[e] = (A[e] & SYMBOL_MASK) | freq_shifted; - e++; - } while (sym_count - e > 1); - /* When just one entry remains, it is a "leaf" that was - * linked to some other node. We ignore it, since the - * rest of the array contains the non-leaves which we - * need. (Note that we're assuming the cases with 0 or 1 - * symbols were handled separately.) */ -} - -/* - * Given the stripped-down Huffman tree constructed by build_tree(), - * determine the number of codewords that should be assigned each - * possible length, taking into account the length-limited constraint. - * - * @A - * The array produced by build_tree(), containing parent index - * information for the non-leaf nodes of the Huffman tree. Each - * entry in this array is a node; a node's parent always has a - * greater index than that node itself. This function will - * overwrite the parent index information in this array, so - * essentially it will destroy the tree. However, the data in the - * low NUM_SYMBOL_BITS of each entry will be preserved. - * - * @root_idx - * The 0-based index of the root node in 'A', and consequently one - * less than the number of tree node entries in 'A'. (Or, really 2 - * less than the actual length of 'A'.) - * - * @len_counts - * An array of length ('max_codeword_len' + 1) in which the number of - * codewords having each length <= max_codeword_len will be - * returned. - * - * @max_codeword_len - * The maximum permissible codeword length. - */ -static void -compute_length_counts(u32 A[restrict], unsigned root_idx, - unsigned len_counts[restrict], unsigned max_codeword_len) -{ - unsigned len; - int node; - - /* The key observations are: - * - * (1) We can traverse the non-leaf nodes of the tree, always - * visiting a parent before its children, by simply iterating - * through the array in reverse order. Consequently, we can - * compute the depth of each node in one pass, overwriting the - * parent indices with depths. - * - * (2) We can initially assume that in the real Huffman tree, - * both children of the root are leaves. This corresponds to two - * codewords of length 1. Then, whenever we visit a (non-leaf) - * node during the traversal, we modify this assumption to - * account for the current node *not* being a leaf, but rather - * its two children being leaves. This causes the loss of one - * codeword for the current depth and the addition of two - * codewords for the current depth plus one. - * - * (3) We can handle the length-limited constraint fairly easily - * by simply using the largest length available when a depth - * exceeds max_codeword_len. - */ - - for (len = 0; len <= max_codeword_len; len++) - len_counts[len] = 0; - len_counts[1] = 2; - - /* Set the root node's depth to 0. */ - A[root_idx] &= SYMBOL_MASK; - - for (node = root_idx - 1; node >= 0; node--) { - - /* Calculate the depth of this node. */ - - unsigned parent = A[node] >> NUM_SYMBOL_BITS; - unsigned parent_depth = A[parent] >> NUM_SYMBOL_BITS; - unsigned depth = parent_depth + 1; - unsigned len = depth; - - /* Set the depth of this node so that it is available - * when its children (if any) are processed. */ - - A[node] = (A[node] & SYMBOL_MASK) | (depth << NUM_SYMBOL_BITS); - - /* If needed, decrease the length to meet the - * length-limited constraint. This is not the optimal - * method for generating length-limited Huffman codes! - * But it should be good enough. */ - if (len >= max_codeword_len) { - len = max_codeword_len; - do { - len--; - } while (len_counts[len] == 0); - } - - /* Account for the fact that we have a non-leaf node at - * the current depth. */ - len_counts[len]--; - len_counts[len + 1] += 2; - } -} - -/* - * Generate the codewords for a canonical Huffman code. - * - * @A - * The output array for codewords. In addition, initially this - * array must contain the symbols, sorted primarily by frequency and - * secondarily by symbol value, in the low NUM_SYMBOL_BITS bits of - * each entry. - * - * @len - * Output array for codeword lengths. - * - * @len_counts - * An array that provides the number of codewords that will have - * each possible length <= max_codeword_len. - * - * @max_codeword_len - * Maximum length, in bits, of each codeword. - * - * @num_syms - * Number of symbols in the alphabet, including symbols with zero - * frequency. This is the length of the 'A' and 'len' arrays. - */ -static void -gen_codewords(u32 A[restrict], u8 lens[restrict], - const unsigned len_counts[restrict], - unsigned max_codeword_len, unsigned num_syms) -{ - u32 next_codewords[DEFLATE_MAX_CODEWORD_LEN + 1]; - unsigned i; - unsigned len; - unsigned sym; - - /* Given the number of codewords that will have each length, - * assign codeword lengths to symbols. We do this by assigning - * the lengths in decreasing order to the symbols sorted - * primarily by increasing frequency and secondarily by - * increasing symbol value. */ - for (i = 0, len = max_codeword_len; len >= 1; len--) { - unsigned count = len_counts[len]; - while (count--) - lens[A[i++] & SYMBOL_MASK] = len; - } - - /* Generate the codewords themselves. We initialize the - * 'next_codewords' array to provide the lexicographically first - * codeword of each length, then assign codewords in symbol - * order. This produces a canonical code. */ - next_codewords[0] = 0; - next_codewords[1] = 0; - for (len = 2; len <= max_codeword_len; len++) - next_codewords[len] = - (next_codewords[len - 1] + len_counts[len - 1]) << 1; - - for (sym = 0; sym < num_syms; sym++) - A[sym] = next_codewords[lens[sym]]++; -} - -/* - * --------------------------------------------------------------------- - * make_canonical_huffman_code() - * --------------------------------------------------------------------- - * - * Given an alphabet and the frequency of each symbol in it, construct a - * length-limited canonical Huffman code. - * - * @num_syms - * The number of symbols in the alphabet. The symbols are the - * integers in the range [0, num_syms - 1]. This parameter must be - * at least 2 and can't be greater than (1 << NUM_SYMBOL_BITS). - * - * @max_codeword_len - * The maximum permissible codeword length. - * - * @freqs - * An array of @num_syms entries, each of which specifies the - * frequency of the corresponding symbol. It is valid for some, - * none, or all of the frequencies to be 0. - * - * @lens - * An array of @num_syms entries in which this function will return - * the length, in bits, of the codeword assigned to each symbol. - * Symbols with 0 frequency will not have codewords per se, but - * their entries in this array will be set to 0. No lengths greater - * than @max_codeword_len will be assigned. - * - * @codewords - * An array of @num_syms entries in which this function will return - * the codeword for each symbol, right-justified and padded on the - * left with zeroes. Codewords for symbols with 0 frequency will be - * undefined. - * - * --------------------------------------------------------------------- - * - * This function builds a length-limited canonical Huffman code. - * - * A length-limited Huffman code contains no codewords longer than some - * specified length, and has exactly (with some algorithms) or - * approximately (with the algorithm used here) the minimum weighted path - * length from the root, given this constraint. - * - * A canonical Huffman code satisfies the properties that a longer - * codeword never lexicographically precedes a shorter codeword, and the - * lexicographic ordering of codewords of the same length is the same as - * the lexicographic ordering of the corresponding symbols. A canonical - * Huffman code, or more generally a canonical prefix code, can be - * reconstructed from only a list containing the codeword length of each - * symbol. - * - * The classic algorithm to generate a Huffman code creates a node for - * each symbol, then inserts these nodes into a min-heap keyed by symbol - * frequency. Then, repeatedly, the two lowest-frequency nodes are - * removed from the min-heap and added as the children of a new node - * having frequency equal to the sum of its two children, which is then - * inserted into the min-heap. When only a single node remains in the - * min-heap, it is the root of the Huffman tree. The codeword for each - * symbol is determined by the path needed to reach the corresponding - * node from the root. Descending to the left child appends a 0 bit, - * whereas descending to the right child appends a 1 bit. - * - * The classic algorithm is relatively easy to understand, but it is - * subject to a number of inefficiencies. In practice, it is fastest to - * first sort the symbols by frequency. (This itself can be subject to - * an optimization based on the fact that most frequencies tend to be - * low.) At the same time, we sort secondarily by symbol value, which - * aids the process of generating a canonical code. Then, during tree - * construction, no heap is necessary because both the leaf nodes and the - * unparented non-leaf nodes can be easily maintained in sorted order. - * Consequently, there can never be more than two possibilities for the - * next-lowest-frequency node. - * - * In addition, because we're generating a canonical code, we actually - * don't need the leaf nodes of the tree at all, only the non-leaf nodes. - * This is because for canonical code generation we don't need to know - * where the symbols are in the tree. Rather, we only need to know how - * many leaf nodes have each depth (codeword length). And this - * information can, in fact, be quickly generated from the tree of - * non-leaves only. - * - * Furthermore, we can build this stripped-down Huffman tree directly in - * the array in which the codewords are to be generated, provided that - * these array slots are large enough to hold a symbol and frequency - * value. - * - * Still furthermore, we don't even need to maintain explicit child - * pointers. We only need the parent pointers, and even those can be - * overwritten in-place with depth information as part of the process of - * extracting codeword lengths from the tree. So in summary, we do NOT - * need a big structure like: - * - * struct huffman_tree_node { - * unsigned int symbol; - * unsigned int frequency; - * unsigned int depth; - * struct huffman_tree_node *left_child; - * struct huffman_tree_node *right_child; - * }; - * - * - * ... which often gets used in "naive" implementations of Huffman code - * generation. - * - * Many of these optimizations are based on the implementation in 7-Zip - * (source file: C/HuffEnc.c), which has been placed in the public domain - * by Igor Pavlov. - */ -static void -make_canonical_huffman_code(unsigned num_syms, unsigned max_codeword_len, - const u32 freqs[restrict], - u8 lens[restrict], u32 codewords[restrict]) -{ - u32 *A = codewords; - unsigned num_used_syms; - - STATIC_ASSERT(DEFLATE_MAX_NUM_SYMS <= 1 << NUM_SYMBOL_BITS); - - /* We begin by sorting the symbols primarily by frequency and - * secondarily by symbol value. As an optimization, the array - * used for this purpose ('A') shares storage with the space in - * which we will eventually return the codewords. */ - - num_used_syms = sort_symbols(num_syms, freqs, lens, A); - - /* 'num_used_syms' is the number of symbols with nonzero - * frequency. This may be less than @num_syms. 'num_used_syms' - * is also the number of entries in 'A' that are valid. Each - * entry consists of a distinct symbol and a nonzero frequency - * packed into a 32-bit integer. */ - - /* Handle special cases where only 0 or 1 symbols were used (had - * nonzero frequency). */ - - if (unlikely(num_used_syms == 0)) { - /* Code is empty. sort_symbols() already set all lengths - * to 0, so there is nothing more to do. */ - return; - } - - if (unlikely(num_used_syms == 1)) { - /* Only one symbol was used, so we only need one - * codeword. But two codewords are needed to form the - * smallest complete Huffman code, which uses codewords 0 - * and 1. Therefore, we choose another symbol to which - * to assign a codeword. We use 0 (if the used symbol is - * not 0) or 1 (if the used symbol is 0). In either - * case, the lesser-valued symbol must be assigned - * codeword 0 so that the resulting code is canonical. */ - - unsigned sym = A[0] & SYMBOL_MASK; - unsigned nonzero_idx = sym ? sym : 1; - - codewords[0] = 0; - lens[0] = 1; - codewords[nonzero_idx] = 1; - lens[nonzero_idx] = 1; - return; - } - - /* Build a stripped-down version of the Huffman tree, sharing the - * array 'A' with the symbol values. Then extract length counts - * from the tree and use them to generate the final codewords. */ - - build_tree(A, num_used_syms); - - { - unsigned len_counts[DEFLATE_MAX_CODEWORD_LEN + 1]; - - compute_length_counts(A, num_used_syms - 2, - len_counts, max_codeword_len); - - gen_codewords(A, lens, len_counts, max_codeword_len, num_syms); - } -} - -/* - * Clear the Huffman symbol frequency counters. - * This must be called when starting a new DEFLATE block. - */ -static void -deflate_reset_symbol_frequencies(struct libdeflate_compressor *c) -{ - memset(&c->freqs, 0, sizeof(c->freqs)); -} - -/* Reverse the Huffman codeword 'codeword', which is 'len' bits in length. */ -static u32 -deflate_reverse_codeword(u32 codeword, u8 len) -{ - /* The following branchless algorithm is faster than going bit by bit. - * Note: since no codewords are longer than 16 bits, we only need to - * reverse the low 16 bits of the 'u32'. */ - STATIC_ASSERT(DEFLATE_MAX_CODEWORD_LEN <= 16); - - /* Flip adjacent 1-bit fields */ - codeword = ((codeword & 0x5555) << 1) | ((codeword & 0xAAAA) >> 1); - - /* Flip adjacent 2-bit fields */ - codeword = ((codeword & 0x3333) << 2) | ((codeword & 0xCCCC) >> 2); - - /* Flip adjacent 4-bit fields */ - codeword = ((codeword & 0x0F0F) << 4) | ((codeword & 0xF0F0) >> 4); - - /* Flip adjacent 8-bit fields */ - codeword = ((codeword & 0x00FF) << 8) | ((codeword & 0xFF00) >> 8); - - /* Return the high 'len' bits of the bit-reversed 16 bit value. */ - return codeword >> (16 - len); -} - -/* Make a canonical Huffman code with bit-reversed codewords. */ -static void -deflate_make_huffman_code(unsigned num_syms, unsigned max_codeword_len, - const u32 freqs[], u8 lens[], u32 codewords[]) -{ - unsigned sym; - - make_canonical_huffman_code(num_syms, max_codeword_len, - freqs, lens, codewords); - - for (sym = 0; sym < num_syms; sym++) - codewords[sym] = deflate_reverse_codeword(codewords[sym], lens[sym]); -} - -/* - * Build the literal/length and offset Huffman codes for a DEFLATE block. - * - * This takes as input the frequency tables for each code and produces as output - * a set of tables that map symbols to codewords and codeword lengths. - */ -static void -deflate_make_huffman_codes(const struct deflate_freqs *freqs, - struct deflate_codes *codes) -{ - STATIC_ASSERT(MAX_LITLEN_CODEWORD_LEN <= DEFLATE_MAX_LITLEN_CODEWORD_LEN); - STATIC_ASSERT(MAX_OFFSET_CODEWORD_LEN <= DEFLATE_MAX_OFFSET_CODEWORD_LEN); - - deflate_make_huffman_code(DEFLATE_NUM_LITLEN_SYMS, - MAX_LITLEN_CODEWORD_LEN, - freqs->litlen, - codes->lens.litlen, - codes->codewords.litlen); - - deflate_make_huffman_code(DEFLATE_NUM_OFFSET_SYMS, - MAX_OFFSET_CODEWORD_LEN, - freqs->offset, - codes->lens.offset, - codes->codewords.offset); -} - -/* Initialize c->static_codes. */ -static void -deflate_init_static_codes(struct libdeflate_compressor *c) -{ - unsigned i; - - for (i = 0; i < 144; i++) - c->freqs.litlen[i] = 1 << (9 - 8); - for (; i < 256; i++) - c->freqs.litlen[i] = 1 << (9 - 9); - for (; i < 280; i++) - c->freqs.litlen[i] = 1 << (9 - 7); - for (; i < 288; i++) - c->freqs.litlen[i] = 1 << (9 - 8); - - for (i = 0; i < 32; i++) - c->freqs.offset[i] = 1 << (5 - 5); - - deflate_make_huffman_codes(&c->freqs, &c->static_codes); -} - -/* Return the offset slot for the specified match offset. */ -static forceinline unsigned -deflate_get_offset_slot(struct libdeflate_compressor *c, unsigned offset) -{ -#if USE_FULL_OFFSET_SLOT_FAST - return c->offset_slot_fast[offset]; -#else - if (offset <= 256) - return c->offset_slot_fast[offset - 1]; - else - return c->offset_slot_fast[256 + ((offset - 1) >> 7)]; -#endif -} - -/* Write the header fields common to all DEFLATE block types. */ -static void -deflate_write_block_header(struct deflate_output_bitstream *os, - bool is_final_block, unsigned block_type) -{ - deflate_add_bits(os, is_final_block, 1); - deflate_add_bits(os, block_type, 2); - deflate_flush_bits(os); -} - -static unsigned -deflate_compute_precode_items(const u8 lens[restrict], - const unsigned num_lens, - u32 precode_freqs[restrict], - unsigned precode_items[restrict]) -{ - unsigned *itemptr; - unsigned run_start; - unsigned run_end; - unsigned extra_bits; - u8 len; - - memset(precode_freqs, 0, - DEFLATE_NUM_PRECODE_SYMS * sizeof(precode_freqs[0])); - - itemptr = precode_items; - run_start = 0; - do { - /* Find the next run of codeword lengths. */ - - /* len = the length being repeated */ - len = lens[run_start]; - - /* Extend the run. */ - run_end = run_start; - do { - run_end++; - } while (run_end != num_lens && len == lens[run_end]); - - if (len == 0) { - /* Run of zeroes. */ - - /* Symbol 18: RLE 11 to 138 zeroes at a time. */ - while ((run_end - run_start) >= 11) { - extra_bits = MIN((run_end - run_start) - 11, 0x7F); - precode_freqs[18]++; - *itemptr++ = 18 | (extra_bits << 5); - run_start += 11 + extra_bits; - } - - /* Symbol 17: RLE 3 to 10 zeroes at a time. */ - if ((run_end - run_start) >= 3) { - extra_bits = MIN((run_end - run_start) - 3, 0x7); - precode_freqs[17]++; - *itemptr++ = 17 | (extra_bits << 5); - run_start += 3 + extra_bits; - } - } else { - - /* A run of nonzero lengths. */ - - /* Symbol 16: RLE 3 to 6 of the previous length. */ - if ((run_end - run_start) >= 4) { - precode_freqs[len]++; - *itemptr++ = len; - run_start++; - do { - extra_bits = MIN((run_end - run_start) - 3, 0x3); - precode_freqs[16]++; - *itemptr++ = 16 | (extra_bits << 5); - run_start += 3 + extra_bits; - } while ((run_end - run_start) >= 3); - } - } - - /* Output any remaining lengths without RLE. */ - while (run_start != run_end) { - precode_freqs[len]++; - *itemptr++ = len; - run_start++; - } - } while (run_start != num_lens); - - return itemptr - precode_items; -} - -/* - * Huffman codeword lengths for dynamic Huffman blocks are compressed using a - * separate Huffman code, the "precode", which contains a symbol for each - * possible codeword length in the larger code as well as several special - * symbols to represent repeated codeword lengths (a form of run-length - * encoding). The precode is itself constructed in canonical form, and its - * codeword lengths are represented literally in 19 3-bit fields that - * immediately precede the compressed codeword lengths of the larger code. - */ - -/* Precompute the information needed to output Huffman codes. */ -static void -deflate_precompute_huffman_header(struct libdeflate_compressor *c) -{ - /* Compute how many litlen and offset symbols are needed. */ - - for (c->num_litlen_syms = DEFLATE_NUM_LITLEN_SYMS; - c->num_litlen_syms > 257; - c->num_litlen_syms--) - if (c->codes.lens.litlen[c->num_litlen_syms - 1] != 0) - break; - - for (c->num_offset_syms = DEFLATE_NUM_OFFSET_SYMS; - c->num_offset_syms > 1; - c->num_offset_syms--) - if (c->codes.lens.offset[c->num_offset_syms - 1] != 0) - break; - - /* If we're not using the full set of literal/length codeword lengths, - * then temporarily move the offset codeword lengths over so that the - * literal/length and offset codeword lengths are contiguous. */ - - STATIC_ASSERT(offsetof(struct deflate_lens, offset) == - DEFLATE_NUM_LITLEN_SYMS); - - if (c->num_litlen_syms != DEFLATE_NUM_LITLEN_SYMS) { - memmove((u8 *)&c->codes.lens + c->num_litlen_syms, - (u8 *)&c->codes.lens + DEFLATE_NUM_LITLEN_SYMS, - c->num_offset_syms); - } - - /* Compute the "items" (RLE / literal tokens and extra bits) with which - * the codeword lengths in the larger code will be output. */ - c->num_precode_items = - deflate_compute_precode_items((u8 *)&c->codes.lens, - c->num_litlen_syms + - c->num_offset_syms, - c->precode_freqs, - c->precode_items); - - /* Build the precode. */ - STATIC_ASSERT(MAX_PRE_CODEWORD_LEN <= DEFLATE_MAX_PRE_CODEWORD_LEN); - deflate_make_huffman_code(DEFLATE_NUM_PRECODE_SYMS, - MAX_PRE_CODEWORD_LEN, - c->precode_freqs, c->precode_lens, - c->precode_codewords); - - /* Count how many precode lengths we actually need to output. */ - for (c->num_explicit_lens = DEFLATE_NUM_PRECODE_SYMS; - c->num_explicit_lens > 4; - c->num_explicit_lens--) - if (c->precode_lens[deflate_precode_lens_permutation[ - c->num_explicit_lens - 1]] != 0) - break; - - /* Restore the offset codeword lengths if needed. */ - if (c->num_litlen_syms != DEFLATE_NUM_LITLEN_SYMS) { - memmove((u8 *)&c->codes.lens + DEFLATE_NUM_LITLEN_SYMS, - (u8 *)&c->codes.lens + c->num_litlen_syms, - c->num_offset_syms); - } -} - -/* Output the Huffman codes. */ -static void -deflate_write_huffman_header(struct libdeflate_compressor *c, - struct deflate_output_bitstream *os) -{ - unsigned i; - - deflate_add_bits(os, c->num_litlen_syms - 257, 5); - deflate_add_bits(os, c->num_offset_syms - 1, 5); - deflate_add_bits(os, c->num_explicit_lens - 4, 4); - deflate_flush_bits(os); - - /* Output the lengths of the codewords in the precode. */ - for (i = 0; i < c->num_explicit_lens; i++) { - deflate_add_bits(os, c->precode_lens[ - deflate_precode_lens_permutation[i]], 3); - deflate_flush_bits(os); - } - - /* Output the encoded lengths of the codewords in the larger code. */ - for (i = 0; i < c->num_precode_items; i++) { - unsigned precode_item = c->precode_items[i]; - unsigned precode_sym = precode_item & 0x1F; - deflate_add_bits(os, c->precode_codewords[precode_sym], - c->precode_lens[precode_sym]); - if (precode_sym >= 16) { - if (precode_sym == 16) - deflate_add_bits(os, precode_item >> 5, 2); - else if (precode_sym == 17) - deflate_add_bits(os, precode_item >> 5, 3); - else - deflate_add_bits(os, precode_item >> 5, 7); - } - STATIC_ASSERT(CAN_BUFFER(DEFLATE_MAX_PRE_CODEWORD_LEN + 7)); - deflate_flush_bits(os); - } -} - -static void -deflate_write_sequences(struct deflate_output_bitstream * restrict os, - const struct deflate_codes * restrict codes, - const struct deflate_sequence sequences[restrict], - const u8 * restrict in_next) -{ - const struct deflate_sequence *seq = sequences; - - for (;;) { - u32 litrunlen = seq->litrunlen_and_length & 0x7FFFFF; - unsigned length = seq->litrunlen_and_length >> 23; - unsigned length_slot; - unsigned litlen_symbol; - unsigned offset_symbol; - - if (litrunlen) { - #if 1 - while (litrunlen >= 4) { - unsigned lit0 = in_next[0]; - unsigned lit1 = in_next[1]; - unsigned lit2 = in_next[2]; - unsigned lit3 = in_next[3]; - - deflate_add_bits(os, codes->codewords.litlen[lit0], - codes->lens.litlen[lit0]); - if (!CAN_BUFFER(2 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - - deflate_add_bits(os, codes->codewords.litlen[lit1], - codes->lens.litlen[lit1]); - if (!CAN_BUFFER(4 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - - deflate_add_bits(os, codes->codewords.litlen[lit2], - codes->lens.litlen[lit2]); - if (!CAN_BUFFER(2 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - - deflate_add_bits(os, codes->codewords.litlen[lit3], - codes->lens.litlen[lit3]); - deflate_flush_bits(os); - in_next += 4; - litrunlen -= 4; - } - if (litrunlen-- != 0) { - deflate_add_bits(os, codes->codewords.litlen[*in_next], - codes->lens.litlen[*in_next]); - if (!CAN_BUFFER(3 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - in_next++; - if (litrunlen-- != 0) { - deflate_add_bits(os, codes->codewords.litlen[*in_next], - codes->lens.litlen[*in_next]); - if (!CAN_BUFFER(3 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - in_next++; - if (litrunlen-- != 0) { - deflate_add_bits(os, codes->codewords.litlen[*in_next], - codes->lens.litlen[*in_next]); - if (!CAN_BUFFER(3 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - in_next++; - } - } - if (CAN_BUFFER(3 * MAX_LITLEN_CODEWORD_LEN)) - deflate_flush_bits(os); - } - #else - do { - unsigned lit = *in_next++; - deflate_add_bits(os, codes->codewords.litlen[lit], - codes->lens.litlen[lit]); - deflate_flush_bits(os); - } while (--litrunlen); - #endif - } - - if (length == 0) - return; - - in_next += length; - - length_slot = seq->length_slot; - litlen_symbol = 257 + length_slot; - - /* Litlen symbol */ - deflate_add_bits(os, codes->codewords.litlen[litlen_symbol], - codes->lens.litlen[litlen_symbol]); - - /* Extra length bits */ - STATIC_ASSERT(CAN_BUFFER(MAX_LITLEN_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_LENGTH_BITS)); - deflate_add_bits(os, length - deflate_length_slot_base[length_slot], - deflate_extra_length_bits[length_slot]); - - if (!CAN_BUFFER(MAX_LITLEN_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_LENGTH_BITS + - MAX_OFFSET_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_OFFSET_BITS)) - deflate_flush_bits(os); - - /* Offset symbol */ - offset_symbol = seq->offset_symbol; - deflate_add_bits(os, codes->codewords.offset[offset_symbol], - codes->lens.offset[offset_symbol]); - - if (!CAN_BUFFER(MAX_OFFSET_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_OFFSET_BITS)) - deflate_flush_bits(os); - - /* Extra offset bits */ - deflate_add_bits(os, seq->offset - deflate_offset_slot_base[offset_symbol], - deflate_extra_offset_bits[offset_symbol]); - - deflate_flush_bits(os); - - seq++; - } -} - -#if SUPPORT_NEAR_OPTIMAL_PARSING -/* - * Follow the minimum-cost path in the graph of possible match/literal choices - * for the current block and write out the matches/literals using the specified - * Huffman codes. - * - * Note: this is slightly duplicated with deflate_write_sequences(), the reason - * being that we don't want to waste time translating between intermediate - * match/literal representations. - */ -static void -deflate_write_item_list(struct deflate_output_bitstream *os, - const struct deflate_codes *codes, - struct libdeflate_compressor *c, - u32 block_length) -{ - struct deflate_optimum_node *cur_node = &c->p.n.optimum_nodes[0]; - struct deflate_optimum_node * const end_node = &c->p.n.optimum_nodes[block_length]; - do { - unsigned length = cur_node->item & OPTIMUM_LEN_MASK; - unsigned offset = cur_node->item >> OPTIMUM_OFFSET_SHIFT; - unsigned litlen_symbol; - unsigned length_slot; - unsigned offset_slot; - - if (length == 1) { - /* Literal */ - litlen_symbol = offset; - deflate_add_bits(os, codes->codewords.litlen[litlen_symbol], - codes->lens.litlen[litlen_symbol]); - deflate_flush_bits(os); - } else { - /* Match length */ - length_slot = deflate_length_slot[length]; - litlen_symbol = 257 + length_slot; - deflate_add_bits(os, codes->codewords.litlen[litlen_symbol], - codes->lens.litlen[litlen_symbol]); - - deflate_add_bits(os, length - deflate_length_slot_base[length_slot], - deflate_extra_length_bits[length_slot]); - - if (!CAN_BUFFER(MAX_LITLEN_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_LENGTH_BITS + - MAX_OFFSET_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_OFFSET_BITS)) - deflate_flush_bits(os); - - - /* Match offset */ - offset_slot = deflate_get_offset_slot(c, offset); - deflate_add_bits(os, codes->codewords.offset[offset_slot], - codes->lens.offset[offset_slot]); - - if (!CAN_BUFFER(MAX_OFFSET_CODEWORD_LEN + - DEFLATE_MAX_EXTRA_OFFSET_BITS)) - deflate_flush_bits(os); - - deflate_add_bits(os, offset - deflate_offset_slot_base[offset_slot], - deflate_extra_offset_bits[offset_slot]); - - deflate_flush_bits(os); - } - cur_node += length; - } while (cur_node != end_node); -} -#endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - -/* Output the end-of-block symbol. */ -static void -deflate_write_end_of_block(struct deflate_output_bitstream *os, - const struct deflate_codes *codes) -{ - deflate_add_bits(os, codes->codewords.litlen[DEFLATE_END_OF_BLOCK], - codes->lens.litlen[DEFLATE_END_OF_BLOCK]); - deflate_flush_bits(os); -} - -static void -deflate_write_uncompressed_block(struct deflate_output_bitstream *os, - const u8 *data, u16 len, - bool is_final_block) -{ - deflate_write_block_header(os, is_final_block, - DEFLATE_BLOCKTYPE_UNCOMPRESSED); - deflate_align_bitstream(os); - - if (4 + (u32)len >= os->end - os->next) { - os->next = os->end; - return; - } - - put_unaligned_le16(len, os->next); - os->next += 2; - put_unaligned_le16(~len, os->next); - os->next += 2; - memcpy(os->next, data, len); - os->next += len; -} - -static void -deflate_write_uncompressed_blocks(struct deflate_output_bitstream *os, - const u8 *data, size_t data_length, - bool is_final_block) -{ - do { - u16 len = MIN(data_length, UINT16_MAX); - - deflate_write_uncompressed_block(os, data, len, - is_final_block && len == data_length); - data += len; - data_length -= len; - } while (data_length != 0); -} - -/* - * Choose the best type of block to use (dynamic Huffman, static Huffman, or - * uncompressed), then output it. - */ -static void -deflate_flush_block(struct libdeflate_compressor * restrict c, - struct deflate_output_bitstream * restrict os, - const u8 * restrict block_begin, u32 block_length, - bool is_final_block, bool use_item_list) -{ - static const u8 deflate_extra_precode_bits[DEFLATE_NUM_PRECODE_SYMS] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7, - }; - - /* Costs are measured in bits */ - u32 dynamic_cost = 0; - u32 static_cost = 0; - u32 uncompressed_cost = 0; - struct deflate_codes *codes; - int block_type; - unsigned sym; - - /* Tally the end-of-block symbol. */ - c->freqs.litlen[DEFLATE_END_OF_BLOCK]++; - - /* Build dynamic Huffman codes. */ - deflate_make_huffman_codes(&c->freqs, &c->codes); - - /* Account for the cost of sending dynamic Huffman codes. */ - deflate_precompute_huffman_header(c); - dynamic_cost += 5 + 5 + 4 + (3 * c->num_explicit_lens); - for (sym = 0; sym < DEFLATE_NUM_PRECODE_SYMS; sym++) { - u32 extra = deflate_extra_precode_bits[sym]; - dynamic_cost += c->precode_freqs[sym] * - (extra + c->precode_lens[sym]); - } - - /* Account for the cost of encoding literals. */ - for (sym = 0; sym < 256; sym++) { - dynamic_cost += c->freqs.litlen[sym] * - c->codes.lens.litlen[sym]; - } - for (sym = 0; sym < 144; sym++) - static_cost += c->freqs.litlen[sym] * 8; - for (; sym < 256; sym++) - static_cost += c->freqs.litlen[sym] * 9; - - /* Account for the cost of encoding the end-of-block symbol. */ - dynamic_cost += c->codes.lens.litlen[256]; - static_cost += 7; - - /* Account for the cost of encoding lengths. */ - for (sym = 257; sym < 257 + ARRAY_LEN(deflate_extra_length_bits); sym++) { - u32 extra = deflate_extra_length_bits[sym - 257]; - dynamic_cost += c->freqs.litlen[sym] * - (extra + c->codes.lens.litlen[sym]); - static_cost += c->freqs.litlen[sym] * - (extra + c->static_codes.lens.litlen[sym]); - } - - /* Account for the cost of encoding offsets. */ - for (sym = 0; sym < ARRAY_LEN(deflate_extra_offset_bits); sym++) { - u32 extra = deflate_extra_offset_bits[sym]; - dynamic_cost += c->freqs.offset[sym] * - (extra + c->codes.lens.offset[sym]); - static_cost += c->freqs.offset[sym] * (extra + 5); - } - - /* Compute the cost of using uncompressed blocks. */ - uncompressed_cost += (-(os->bitcount + 3) & 7) + 32 + - (40 * (DIV_ROUND_UP(block_length, - UINT16_MAX) - 1)) + - (8 * block_length); - - /* Choose the cheapest block type. */ - if (dynamic_cost < MIN(static_cost, uncompressed_cost)) { - block_type = DEFLATE_BLOCKTYPE_DYNAMIC_HUFFMAN; - codes = &c->codes; - } else if (static_cost < uncompressed_cost) { - block_type = DEFLATE_BLOCKTYPE_STATIC_HUFFMAN; - codes = &c->static_codes; - } else { - block_type = DEFLATE_BLOCKTYPE_UNCOMPRESSED; - } - - /* Now actually output the block. */ - - if (block_type == DEFLATE_BLOCKTYPE_UNCOMPRESSED) { - /* Note: the length being flushed may exceed the maximum length - * of an uncompressed block (65535 bytes). Therefore, more than - * one uncompressed block might be needed. */ - deflate_write_uncompressed_blocks(os, block_begin, block_length, - is_final_block); - } else { - /* Output the block header. */ - deflate_write_block_header(os, is_final_block, block_type); - - /* Output the Huffman codes (dynamic Huffman blocks only). */ - if (block_type == DEFLATE_BLOCKTYPE_DYNAMIC_HUFFMAN) - deflate_write_huffman_header(c, os); - - /* Output the literals, matches, and end-of-block symbol. */ - #if SUPPORT_NEAR_OPTIMAL_PARSING - if (use_item_list) - deflate_write_item_list(os, codes, c, block_length); - else - #endif - deflate_write_sequences(os, codes, c->p.g.sequences, - block_begin); - deflate_write_end_of_block(os, codes); - } -} - -static forceinline void -deflate_choose_literal(struct libdeflate_compressor *c, unsigned literal, - u32 *litrunlen_p) -{ - c->freqs.litlen[literal]++; - ++*litrunlen_p; -} - -static forceinline void -deflate_choose_match(struct libdeflate_compressor *c, - unsigned length, unsigned offset, - u32 *litrunlen_p, struct deflate_sequence **next_seq_p) -{ - struct deflate_sequence *seq = *next_seq_p; - unsigned length_slot = deflate_length_slot[length]; - unsigned offset_slot = deflate_get_offset_slot(c, offset); - - c->freqs.litlen[257 + length_slot]++; - c->freqs.offset[offset_slot]++; - - seq->litrunlen_and_length = ((u32)length << 23) | *litrunlen_p; - seq->offset = offset; - seq->length_slot = length_slot; - seq->offset_symbol = offset_slot; - - *litrunlen_p = 0; - *next_seq_p = seq + 1; -} - -static forceinline void -deflate_finish_sequence(struct deflate_sequence *seq, u32 litrunlen) -{ - seq->litrunlen_and_length = litrunlen; /* length = 0 */ -} - -/******************************************************************************/ - -/* - * Block splitting algorithm. The problem is to decide when it is worthwhile to - * start a new block with new Huffman codes. There is a theoretically optimal - * solution: recursively consider every possible block split, considering the - * exact cost of each block, and choose the minimum cost approach. But this is - * far too slow. Instead, as an approximation, we can count symbols and after - * every N symbols, compare the expected distribution of symbols based on the - * previous data with the actual distribution. If they differ "by enough", then - * start a new block. - * - * As an optimization and heuristic, we don't distinguish between every symbol - * but rather we combine many symbols into a single "observation type". For - * literals we only look at the high bits and low bits, and for matches we only - * look at whether the match is long or not. The assumption is that for typical - * "real" data, places that are good block boundaries will tend to be noticeable - * based only on changes in these aggregate frequencies, without looking for - * subtle differences in individual symbols. For example, a change from ASCII - * bytes to non-ASCII bytes, or from few matches (generally less compressible) - * to many matches (generally more compressible), would be easily noticed based - * on the aggregates. - * - * For determining whether the frequency distributions are "different enough" to - * start a new block, the simply heuristic of splitting when the sum of absolute - * differences exceeds a constant seems to be good enough. We also add a number - * proportional to the block length so that the algorithm is more likely to end - * long blocks than short blocks. This reflects the general expectation that it - * will become increasingly beneficial to start a new block as the current - * block grows longer. - * - * Finally, for an approximation, it is not strictly necessary that the exact - * symbols being used are considered. With "near-optimal parsing", for example, - * the actual symbols that will be used are unknown until after the block - * boundary is chosen and the block has been optimized. Since the final choices - * cannot be used, we can use preliminary "greedy" choices instead. - */ - -/* Initialize the block split statistics when starting a new block. */ -static void -init_block_split_stats(struct block_split_stats *stats) -{ - int i; - - for (i = 0; i < NUM_OBSERVATION_TYPES; i++) { - stats->new_observations[i] = 0; - stats->observations[i] = 0; - } - stats->num_new_observations = 0; - stats->num_observations = 0; -} - -/* Literal observation. Heuristic: use the top 2 bits and low 1 bits of the - * literal, for 8 possible literal observation types. */ -static forceinline void -observe_literal(struct block_split_stats *stats, u8 lit) -{ - stats->new_observations[((lit >> 5) & 0x6) | (lit & 1)]++; - stats->num_new_observations++; -} - -/* Match observation. Heuristic: use one observation type for "short match" and - * one observation type for "long match". */ -static forceinline void -observe_match(struct block_split_stats *stats, unsigned length) -{ - stats->new_observations[NUM_LITERAL_OBSERVATION_TYPES + (length >= 9)]++; - stats->num_new_observations++; -} - -static bool -do_end_block_check(struct block_split_stats *stats, u32 block_length) -{ - int i; - - if (stats->num_observations > 0) { - - /* Note: to avoid slow divisions, we do not divide by - * 'num_observations', but rather do all math with the numbers - * multiplied by 'num_observations'. */ - u32 total_delta = 0; - for (i = 0; i < NUM_OBSERVATION_TYPES; i++) { - u32 expected = stats->observations[i] * stats->num_new_observations; - u32 actual = stats->new_observations[i] * stats->num_observations; - u32 delta = (actual > expected) ? actual - expected : - expected - actual; - total_delta += delta; - } - - /* Ready to end the block? */ - if (total_delta + (block_length / 4096) * stats->num_observations >= - NUM_OBSERVATIONS_PER_BLOCK_CHECK * 200 / 512 * stats->num_observations) - return true; - } - - for (i = 0; i < NUM_OBSERVATION_TYPES; i++) { - stats->num_observations += stats->new_observations[i]; - stats->observations[i] += stats->new_observations[i]; - stats->new_observations[i] = 0; - } - stats->num_new_observations = 0; - return false; -} - -static forceinline bool -should_end_block(struct block_split_stats *stats, - const u8 *in_block_begin, const u8 *in_next, const u8 *in_end) -{ - /* Ready to check block split statistics? */ - if (stats->num_new_observations < NUM_OBSERVATIONS_PER_BLOCK_CHECK || - in_next - in_block_begin < MIN_BLOCK_LENGTH || - in_end - in_next < MIN_BLOCK_LENGTH) - return false; - - return do_end_block_check(stats, in_next - in_block_begin); -} - -/******************************************************************************/ - -/* - * This is the level 0 "compressor". It always outputs uncompressed blocks. - */ -static size_t -deflate_compress_none(struct libdeflate_compressor * restrict c, - const u8 * restrict in, size_t in_nbytes, - u8 * restrict out, size_t out_nbytes_avail) -{ - struct deflate_output_bitstream os; - - deflate_init_output(&os, out, out_nbytes_avail); - - deflate_write_uncompressed_blocks(&os, in, in_nbytes, true); - - return deflate_flush_output(&os); -} - -/* - * This is the "greedy" DEFLATE compressor. It always chooses the longest match. - */ -static size_t -deflate_compress_greedy(struct libdeflate_compressor * restrict c, - const u8 * restrict in, size_t in_nbytes, - u8 * restrict out, size_t out_nbytes_avail) -{ - const u8 *in_next = in; - const u8 *in_end = in_next + in_nbytes; - struct deflate_output_bitstream os; - const u8 *in_cur_base = in_next; - unsigned max_len = DEFLATE_MAX_MATCH_LEN; - unsigned nice_len = MIN(c->nice_match_length, max_len); - u32 next_hashes[2] = {0, 0}; - - deflate_init_output(&os, out, out_nbytes_avail); - hc_matchfinder_init(&c->p.g.hc_mf); - - do { - /* Starting a new DEFLATE block. */ - - const u8 * const in_block_begin = in_next; - const u8 * const in_max_block_end = - in_next + MIN(in_end - in_next, SOFT_MAX_BLOCK_LENGTH); - u32 litrunlen = 0; - struct deflate_sequence *next_seq = c->p.g.sequences; - - init_block_split_stats(&c->split_stats); - deflate_reset_symbol_frequencies(c); - - do { - u32 length; - u32 offset; - - /* Decrease the maximum and nice match lengths if we're - * approaching the end of the input buffer. */ - if (unlikely(max_len > in_end - in_next)) { - max_len = in_end - in_next; - nice_len = MIN(nice_len, max_len); - } - - length = hc_matchfinder_longest_match(&c->p.g.hc_mf, - &in_cur_base, - in_next, - DEFLATE_MIN_MATCH_LEN - 1, - max_len, - nice_len, - c->max_search_depth, - next_hashes, - &offset); - - if (length >= DEFLATE_MIN_MATCH_LEN) { - /* Match found. */ - deflate_choose_match(c, length, offset, - &litrunlen, &next_seq); - observe_match(&c->split_stats, length); - in_next = hc_matchfinder_skip_positions(&c->p.g.hc_mf, - &in_cur_base, - in_next + 1, - in_end, - length - 1, - next_hashes); - } else { - /* No match found. */ - deflate_choose_literal(c, *in_next, &litrunlen); - observe_literal(&c->split_stats, *in_next); - in_next++; - } - - /* Check if it's time to output another block. */ - } while (in_next < in_max_block_end && - !should_end_block(&c->split_stats, in_block_begin, in_next, in_end)); - - deflate_finish_sequence(next_seq, litrunlen); - deflate_flush_block(c, &os, in_block_begin, - in_next - in_block_begin, - in_next == in_end, false); - } while (in_next != in_end); - - return deflate_flush_output(&os); -} - -/* - * This is the "lazy" DEFLATE compressor. Before choosing a match, it checks to - * see if there's a longer match at the next position. If yes, it outputs a - * literal and continues to the next position. If no, it outputs the match. - */ -static size_t -deflate_compress_lazy(struct libdeflate_compressor * restrict c, - const u8 * restrict in, size_t in_nbytes, - u8 * restrict out, size_t out_nbytes_avail) -{ - const u8 *in_next = in; - const u8 *in_end = in_next + in_nbytes; - struct deflate_output_bitstream os; - const u8 *in_cur_base = in_next; - unsigned max_len = DEFLATE_MAX_MATCH_LEN; - unsigned nice_len = MIN(c->nice_match_length, max_len); - u32 next_hashes[2] = {0, 0}; - - deflate_init_output(&os, out, out_nbytes_avail); - hc_matchfinder_init(&c->p.g.hc_mf); - - do { - /* Starting a new DEFLATE block. */ - - const u8 * const in_block_begin = in_next; - const u8 * const in_max_block_end = - in_next + MIN(in_end - in_next, SOFT_MAX_BLOCK_LENGTH); - u32 litrunlen = 0; - struct deflate_sequence *next_seq = c->p.g.sequences; - - init_block_split_stats(&c->split_stats); - deflate_reset_symbol_frequencies(c); - - do { - unsigned cur_len; - unsigned cur_offset; - unsigned next_len; - unsigned next_offset; - - if (unlikely(in_end - in_next < DEFLATE_MAX_MATCH_LEN)) { - max_len = in_end - in_next; - nice_len = MIN(nice_len, max_len); - } - - /* Find the longest match at the current position. */ - cur_len = hc_matchfinder_longest_match(&c->p.g.hc_mf, - &in_cur_base, - in_next, - DEFLATE_MIN_MATCH_LEN - 1, - max_len, - nice_len, - c->max_search_depth, - next_hashes, - &cur_offset); - in_next += 1; - - if (cur_len < DEFLATE_MIN_MATCH_LEN) { - /* No match found. Choose a literal. */ - deflate_choose_literal(c, *(in_next - 1), &litrunlen); - observe_literal(&c->split_stats, *(in_next - 1)); - continue; - } - - have_cur_match: - observe_match(&c->split_stats, cur_len); - - /* We have a match at the current position. */ - - /* If the current match is very long, choose it - * immediately. */ - if (cur_len >= nice_len) { - deflate_choose_match(c, cur_len, cur_offset, - &litrunlen, &next_seq); - in_next = hc_matchfinder_skip_positions(&c->p.g.hc_mf, - &in_cur_base, - in_next, - in_end, - cur_len - 1, - next_hashes); - continue; - } - - /* - * Try to find a match at the next position. - * - * Note: since we already have a match at the *current* - * position, we use only half the 'max_search_depth' - * when checking the *next* position. This is a useful - * trade-off because it's more worthwhile to use a - * greater search depth on the initial match. - * - * Note: it's possible to structure the code such that - * there's only one call to longest_match(), which - * handles both the "find the initial match" and "try to - * find a longer match" cases. However, it is faster to - * have two call sites, with longest_match() inlined at - * each. - */ - if (unlikely(in_end - in_next < DEFLATE_MAX_MATCH_LEN)) { - max_len = in_end - in_next; - nice_len = MIN(nice_len, max_len); - } - next_len = hc_matchfinder_longest_match(&c->p.g.hc_mf, - &in_cur_base, - in_next, - cur_len, - max_len, - nice_len, - c->max_search_depth / 2, - next_hashes, - &next_offset); - in_next += 1; - - if (next_len > cur_len) { - /* Found a longer match at the next position. - * Output a literal. Then the next match - * becomes the current match. */ - deflate_choose_literal(c, *(in_next - 2), &litrunlen); - cur_len = next_len; - cur_offset = next_offset; - goto have_cur_match; - } - - /* No longer match at the next position. - * Output the current match. */ - deflate_choose_match(c, cur_len, cur_offset, - &litrunlen, &next_seq); - in_next = hc_matchfinder_skip_positions(&c->p.g.hc_mf, - &in_cur_base, - in_next, - in_end, - cur_len - 2, - next_hashes); - - /* Check if it's time to output another block. */ - } while (in_next < in_max_block_end && - !should_end_block(&c->split_stats, in_block_begin, in_next, in_end)); - - deflate_finish_sequence(next_seq, litrunlen); - deflate_flush_block(c, &os, in_block_begin, - in_next - in_block_begin, - in_next == in_end, false); - } while (in_next != in_end); - - return deflate_flush_output(&os); -} - -#if SUPPORT_NEAR_OPTIMAL_PARSING - -/* - * Follow the minimum-cost path in the graph of possible match/literal choices - * for the current block and compute the frequencies of the Huffman symbols that - * would be needed to output those matches and literals. - */ -static void -deflate_tally_item_list(struct libdeflate_compressor *c, u32 block_length) -{ - struct deflate_optimum_node *cur_node = &c->p.n.optimum_nodes[0]; - struct deflate_optimum_node *end_node = &c->p.n.optimum_nodes[block_length]; - do { - unsigned length = cur_node->item & OPTIMUM_LEN_MASK; - unsigned offset = cur_node->item >> OPTIMUM_OFFSET_SHIFT; - - if (length == 1) { - /* Literal */ - c->freqs.litlen[offset]++; - } else { - /* Match */ - c->freqs.litlen[257 + deflate_length_slot[length]]++; - c->freqs.offset[deflate_get_offset_slot(c, offset)]++; - } - cur_node += length; - } while (cur_node != end_node); -} - -/* Set the current cost model from the codeword lengths specified in @lens. */ -static void -deflate_set_costs_from_codes(struct libdeflate_compressor *c, - const struct deflate_lens *lens) -{ - unsigned i; - - /* Literals */ - for (i = 0; i < DEFLATE_NUM_LITERALS; i++) { - u32 bits = (lens->litlen[i] ? lens->litlen[i] : LITERAL_NOSTAT_BITS); - c->p.n.costs.literal[i] = bits << COST_SHIFT; - } - - /* Lengths */ - for (i = DEFLATE_MIN_MATCH_LEN; i <= DEFLATE_MAX_MATCH_LEN; i++) { - unsigned length_slot = deflate_length_slot[i]; - unsigned litlen_sym = 257 + length_slot; - u32 bits = (lens->litlen[litlen_sym] ? lens->litlen[litlen_sym] : LENGTH_NOSTAT_BITS); - bits += deflate_extra_length_bits[length_slot]; - c->p.n.costs.length[i] = bits << COST_SHIFT; - } - - /* Offset slots */ - for (i = 0; i < ARRAY_LEN(deflate_offset_slot_base); i++) { - u32 bits = (lens->offset[i] ? lens->offset[i] : OFFSET_NOSTAT_BITS); - bits += deflate_extra_offset_bits[i]; - c->p.n.costs.offset_slot[i] = bits << COST_SHIFT; - } -} - -static forceinline u32 -deflate_default_literal_cost(unsigned literal) -{ - STATIC_ASSERT(COST_SHIFT == 3); - /* 66 is 8.25 bits/symbol */ - return 66; -} - -static forceinline u32 -deflate_default_length_slot_cost(unsigned length_slot) -{ - STATIC_ASSERT(COST_SHIFT == 3); - /* 60 is 7.5 bits/symbol */ - return 60 + ((u32)deflate_extra_length_bits[length_slot] << COST_SHIFT); -} - -static forceinline u32 -deflate_default_offset_slot_cost(unsigned offset_slot) -{ - STATIC_ASSERT(COST_SHIFT == 3); - /* 39 is 4.875 bits/symbol */ - return 39 + ((u32)deflate_extra_offset_bits[offset_slot] << COST_SHIFT); -} - -/* - * Set default symbol costs for the first block's first optimization pass. - * - * It works well to assume that each symbol is equally probable. This results - * in each symbol being assigned a cost of (-log2(1.0/num_syms) * (1 << - * COST_SHIFT)) where 'num_syms' is the number of symbols in the corresponding - * alphabet. However, we intentionally bias the parse towards matches rather - * than literals by using a slightly lower default cost for length symbols than - * for literals. This often improves the compression ratio slightly. - */ -static void -deflate_set_default_costs(struct libdeflate_compressor *c) -{ - unsigned i; - - /* Literals */ - for (i = 0; i < DEFLATE_NUM_LITERALS; i++) - c->p.n.costs.literal[i] = deflate_default_literal_cost(i); - - /* Lengths */ - for (i = DEFLATE_MIN_MATCH_LEN; i <= DEFLATE_MAX_MATCH_LEN; i++) - c->p.n.costs.length[i] = deflate_default_length_slot_cost( - deflate_length_slot[i]); - - /* Offset slots */ - for (i = 0; i < ARRAY_LEN(deflate_offset_slot_base); i++) - c->p.n.costs.offset_slot[i] = deflate_default_offset_slot_cost(i); -} - -static forceinline void -deflate_adjust_cost(u32 *cost_p, u32 default_cost) -{ - *cost_p += ((s32)default_cost - (s32)*cost_p) >> 1; -} - -/* - * Adjust the costs when beginning a new block. - * - * Since the current costs have been optimized for the data, it's undesirable to - * throw them away and start over with the default costs. At the same time, we - * don't want to bias the parse by assuming that the next block will be similar - * to the current block. As a compromise, make the costs closer to the - * defaults, but don't simply set them to the defaults. - */ -static void -deflate_adjust_costs(struct libdeflate_compressor *c) -{ - unsigned i; - - /* Literals */ - for (i = 0; i < DEFLATE_NUM_LITERALS; i++) - deflate_adjust_cost(&c->p.n.costs.literal[i], - deflate_default_literal_cost(i)); - - /* Lengths */ - for (i = DEFLATE_MIN_MATCH_LEN; i <= DEFLATE_MAX_MATCH_LEN; i++) - deflate_adjust_cost(&c->p.n.costs.length[i], - deflate_default_length_slot_cost( - deflate_length_slot[i])); - - /* Offset slots */ - for (i = 0; i < ARRAY_LEN(deflate_offset_slot_base); i++) - deflate_adjust_cost(&c->p.n.costs.offset_slot[i], - deflate_default_offset_slot_cost(i)); -} - -/* - * Find the minimum-cost path through the graph of possible match/literal - * choices for this block. - * - * We find the minimum cost path from 'c->p.n.optimum_nodes[0]', which - * represents the node at the beginning of the block, to - * 'c->p.n.optimum_nodes[block_length]', which represents the node at the end of - * the block. Edge costs are evaluated using the cost model 'c->p.n.costs'. - * - * The algorithm works backwards, starting at the end node and proceeding - * backwards one node at a time. At each node, the minimum cost to reach the - * end node is computed and the match/literal choice that begins that path is - * saved. - */ -static void -deflate_find_min_cost_path(struct libdeflate_compressor *c, - const u32 block_length, - const struct lz_match *cache_ptr) -{ - struct deflate_optimum_node *end_node = &c->p.n.optimum_nodes[block_length]; - struct deflate_optimum_node *cur_node = end_node; - - cur_node->cost_to_end = 0; - do { - unsigned num_matches; - unsigned literal; - u32 best_cost_to_end; - - cur_node--; - cache_ptr--; - - num_matches = cache_ptr->length; - literal = cache_ptr->offset; - - /* It's always possible to choose a literal. */ - best_cost_to_end = c->p.n.costs.literal[literal] + - (cur_node + 1)->cost_to_end; - cur_node->item = ((u32)literal << OPTIMUM_OFFSET_SHIFT) | 1; - - /* Also consider matches if there are any. */ - if (num_matches) { - const struct lz_match *match; - unsigned len; - unsigned offset; - unsigned offset_slot; - u32 offset_cost; - u32 cost_to_end; - - /* - * Consider each length from the minimum - * (DEFLATE_MIN_MATCH_LEN) to the length of the longest - * match found at this position. For each length, we - * consider only the smallest offset for which that - * length is available. Although this is not guaranteed - * to be optimal due to the possibility of a larger - * offset costing less than a smaller offset to code, - * this is a very useful heuristic. - */ - match = cache_ptr - num_matches; - len = DEFLATE_MIN_MATCH_LEN; - do { - offset = match->offset; - offset_slot = deflate_get_offset_slot(c, offset); - offset_cost = c->p.n.costs.offset_slot[offset_slot]; - do { - cost_to_end = offset_cost + - c->p.n.costs.length[len] + - (cur_node + len)->cost_to_end; - if (cost_to_end < best_cost_to_end) { - best_cost_to_end = cost_to_end; - cur_node->item = ((u32)offset << OPTIMUM_OFFSET_SHIFT) | len; - } - } while (++len <= match->length); - } while (++match != cache_ptr); - cache_ptr -= num_matches; - } - cur_node->cost_to_end = best_cost_to_end; - } while (cur_node != &c->p.n.optimum_nodes[0]); -} - -/* - * Choose the literal/match sequence to use for the current block. The basic - * algorithm finds a minimum-cost path through the block's graph of - * literal/match choices, given a cost model. However, the cost of each symbol - * is unknown until the Huffman codes have been built, but at the same time the - * Huffman codes depend on the frequencies of chosen symbols. Consequently, - * multiple passes must be used to try to approximate an optimal solution. The - * first pass uses default costs, mixed with the costs from the previous block - * if any. Later passes use the Huffman codeword lengths from the previous pass - * as the costs. - */ -static void -deflate_optimize_block(struct libdeflate_compressor *c, u32 block_length, - const struct lz_match *cache_ptr, bool is_first_block) -{ - unsigned num_passes_remaining = c->p.n.num_optim_passes; - u32 i; - - /* Force the block to really end at the desired length, even if some - * matches extend beyond it. */ - for (i = block_length; i <= MIN(block_length - 1 + DEFLATE_MAX_MATCH_LEN, - ARRAY_LEN(c->p.n.optimum_nodes) - 1); i++) - c->p.n.optimum_nodes[i].cost_to_end = 0x80000000; - - /* Set the initial costs. */ - if (is_first_block) - deflate_set_default_costs(c); - else - deflate_adjust_costs(c); - - for (;;) { - /* Find the minimum cost path for this pass. */ - deflate_find_min_cost_path(c, block_length, cache_ptr); - - /* Compute frequencies of the chosen symbols. */ - deflate_reset_symbol_frequencies(c); - deflate_tally_item_list(c, block_length); - - if (--num_passes_remaining == 0) - break; - - /* At least one optimization pass remains; update the costs. */ - deflate_make_huffman_codes(&c->freqs, &c->codes); - deflate_set_costs_from_codes(c, &c->codes.lens); - } -} - -/* - * This is the "near-optimal" DEFLATE compressor. It computes the optimal - * representation of each DEFLATE block using a minimum-cost path search over - * the graph of possible match/literal choices for that block, assuming a - * certain cost for each Huffman symbol. - * - * For several reasons, the end result is not guaranteed to be optimal: - * - * - Nonoptimal choice of blocks - * - Heuristic limitations on which matches are actually considered - * - Symbol costs are unknown until the symbols have already been chosen - * (so iterative optimization must be used) - */ -static size_t -deflate_compress_near_optimal(struct libdeflate_compressor * restrict c, - const u8 * restrict in, size_t in_nbytes, - u8 * restrict out, size_t out_nbytes_avail) -{ - const u8 *in_next = in; - const u8 *in_end = in_next + in_nbytes; - struct deflate_output_bitstream os; - const u8 *in_cur_base = in_next; - const u8 *in_next_slide = in_next + MIN(in_end - in_next, MATCHFINDER_WINDOW_SIZE); - unsigned max_len = DEFLATE_MAX_MATCH_LEN; - unsigned nice_len = MIN(c->nice_match_length, max_len); - u32 next_hashes[2] = {0, 0}; - - deflate_init_output(&os, out, out_nbytes_avail); - bt_matchfinder_init(&c->p.n.bt_mf); - - do { - /* Starting a new DEFLATE block. */ - - struct lz_match *cache_ptr = c->p.n.match_cache; - const u8 * const in_block_begin = in_next; - const u8 * const in_max_block_end = - in_next + MIN(in_end - in_next, SOFT_MAX_BLOCK_LENGTH); - const u8 *next_observation = in_next; - - init_block_split_stats(&c->split_stats); - - /* - * Find matches until we decide to end the block. We end the - * block if any of the following is true: - * - * (1) Maximum block length has been reached - * (2) Match catch may overflow. - * (3) Block split heuristic says to split now. - */ - do { - struct lz_match *matches; - unsigned best_len; - - /* Slide the window forward if needed. */ - if (in_next == in_next_slide) { - bt_matchfinder_slide_window(&c->p.n.bt_mf); - in_cur_base = in_next; - in_next_slide = in_next + MIN(in_end - in_next, - MATCHFINDER_WINDOW_SIZE); - } - - /* Decrease the maximum and nice match lengths if we're - * approaching the end of the input buffer. */ - if (unlikely(max_len > in_end - in_next)) { - max_len = in_end - in_next; - nice_len = MIN(nice_len, max_len); - } - - /* - * Find matches with the current position using the - * binary tree matchfinder and save them in - * 'match_cache'. - * - * Note: the binary tree matchfinder is more suited for - * optimal parsing than the hash chain matchfinder. The - * reasons for this include: - * - * - The binary tree matchfinder can find more matches - * in the same number of steps. - * - One of the major advantages of hash chains is that - * skipping positions (not searching for matches at - * them) is faster; however, with optimal parsing we - * search for matches at almost all positions, so this - * advantage of hash chains is negated. - */ - matches = cache_ptr; - best_len = 0; - if (likely(max_len >= BT_MATCHFINDER_REQUIRED_NBYTES)) { - cache_ptr = bt_matchfinder_get_matches(&c->p.n.bt_mf, - in_cur_base, - in_next - in_cur_base, - max_len, - nice_len, - c->max_search_depth, - next_hashes, - &best_len, - matches); - } - - if (in_next >= next_observation) { - if (best_len >= 4) { - observe_match(&c->split_stats, best_len); - next_observation = in_next + best_len; - } else { - observe_literal(&c->split_stats, *in_next); - next_observation = in_next + 1; - } - } - - cache_ptr->length = cache_ptr - matches; - cache_ptr->offset = *in_next; - in_next++; - cache_ptr++; - - /* - * If there was a very long match found, don't cache any - * matches for the bytes covered by that match. This - * avoids degenerate behavior when compressing highly - * redundant data, where the number of matches can be - * very large. - * - * This heuristic doesn't actually hurt the compression - * ratio very much. If there's a long match, then the - * data must be highly compressible, so it doesn't - * matter much what we do. - */ - if (best_len >= DEFLATE_MIN_MATCH_LEN && best_len >= nice_len) { - --best_len; - do { - if (in_next == in_next_slide) { - bt_matchfinder_slide_window(&c->p.n.bt_mf); - in_cur_base = in_next; - in_next_slide = in_next + MIN(in_end - in_next, - MATCHFINDER_WINDOW_SIZE); - } - if (unlikely(max_len > in_end - in_next)) { - max_len = in_end - in_next; - nice_len = MIN(nice_len, max_len); - } - if (max_len >= BT_MATCHFINDER_REQUIRED_NBYTES) { - bt_matchfinder_skip_position(&c->p.n.bt_mf, - in_cur_base, - in_next - in_cur_base, - nice_len, - c->max_search_depth, - next_hashes); - } - cache_ptr->length = 0; - cache_ptr->offset = *in_next; - in_next++; - cache_ptr++; - } while (--best_len); - } - } while (in_next < in_max_block_end && - cache_ptr < &c->p.n.match_cache[CACHE_LENGTH] && - !should_end_block(&c->split_stats, in_block_begin, in_next, in_end)); - - /* All the matches for this block have been cached. Now choose - * the sequence of items to output and flush the block. */ - deflate_optimize_block(c, in_next - in_block_begin, cache_ptr, - in_block_begin == in); - deflate_flush_block(c, &os, in_block_begin, in_next - in_block_begin, - in_next == in_end, true); - } while (in_next != in_end); - - return deflate_flush_output(&os); -} - -#endif /* SUPPORT_NEAR_OPTIMAL_PARSING */ - -/* Initialize c->offset_slot_fast. */ -static void -deflate_init_offset_slot_fast(struct libdeflate_compressor *c) -{ - unsigned offset_slot; - unsigned offset; - unsigned offset_end; - - for (offset_slot = 0; - offset_slot < ARRAY_LEN(deflate_offset_slot_base); - offset_slot++) - { - offset = deflate_offset_slot_base[offset_slot]; - #if USE_FULL_OFFSET_SLOT_FAST - offset_end = offset + (1 << deflate_extra_offset_bits[offset_slot]); - do { - c->offset_slot_fast[offset] = offset_slot; - } while (++offset != offset_end); - #else - if (offset <= 256) { - offset_end = offset + (1 << deflate_extra_offset_bits[offset_slot]); - do { - c->offset_slot_fast[offset - 1] = offset_slot; - } while (++offset != offset_end); - } else { - offset_end = offset + (1 << deflate_extra_offset_bits[offset_slot]); - do { - c->offset_slot_fast[256 + ((offset - 1) >> 7)] = offset_slot; - } while ((offset += (1 << 7)) != offset_end); - } - #endif - } -} - -LIBDEFLATEEXPORT struct libdeflate_compressor * LIBDEFLATEAPI -libdeflate_alloc_compressor(int compression_level) -{ - struct libdeflate_compressor *c; - size_t size = offsetof(struct libdeflate_compressor, p); - - if (compression_level < 0 || compression_level > 12) - return NULL; - -#if SUPPORT_NEAR_OPTIMAL_PARSING - if (compression_level >= 8) - size += sizeof(c->p.n); - else if (compression_level >= 1) - size += sizeof(c->p.g); -#else - if (compression_level >= 1) - size += sizeof(c->p.g); -#endif - - c = libdeflate_aligned_malloc(MATCHFINDER_MEM_ALIGNMENT, size); - if (!c) - return NULL; - - c->compression_level = compression_level; - - /* - * The higher the compression level, the more we should bother trying to - * compress very small inputs. - */ - c->min_size_to_compress = 56 - (compression_level * 4); - - switch (compression_level) { - case 0: - c->impl = deflate_compress_none; - break; - case 1: - c->impl = deflate_compress_greedy; - c->max_search_depth = 2; - c->nice_match_length = 8; - break; - case 2: - c->impl = deflate_compress_greedy; - c->max_search_depth = 6; - c->nice_match_length = 10; - break; - case 3: - c->impl = deflate_compress_greedy; - c->max_search_depth = 12; - c->nice_match_length = 14; - break; - case 4: - c->impl = deflate_compress_greedy; - c->max_search_depth = 24; - c->nice_match_length = 24; - break; - case 5: - c->impl = deflate_compress_lazy; - c->max_search_depth = 20; - c->nice_match_length = 30; - break; - case 6: - c->impl = deflate_compress_lazy; - c->max_search_depth = 40; - c->nice_match_length = 65; - break; - case 7: - c->impl = deflate_compress_lazy; - c->max_search_depth = 100; - c->nice_match_length = 130; - break; -#if SUPPORT_NEAR_OPTIMAL_PARSING - case 8: - c->impl = deflate_compress_near_optimal; - c->max_search_depth = 12; - c->nice_match_length = 20; - c->p.n.num_optim_passes = 1; - break; - case 9: - c->impl = deflate_compress_near_optimal; - c->max_search_depth = 16; - c->nice_match_length = 26; - c->p.n.num_optim_passes = 2; - break; - case 10: - c->impl = deflate_compress_near_optimal; - c->max_search_depth = 30; - c->nice_match_length = 50; - c->p.n.num_optim_passes = 2; - break; - case 11: - c->impl = deflate_compress_near_optimal; - c->max_search_depth = 60; - c->nice_match_length = 80; - c->p.n.num_optim_passes = 3; - break; - default: - c->impl = deflate_compress_near_optimal; - c->max_search_depth = 100; - c->nice_match_length = 133; - c->p.n.num_optim_passes = 4; - break; -#else - case 8: - c->impl = deflate_compress_lazy; - c->max_search_depth = 150; - c->nice_match_length = 200; - break; - default: - c->impl = deflate_compress_lazy; - c->max_search_depth = 200; - c->nice_match_length = DEFLATE_MAX_MATCH_LEN; - break; -#endif - } - - deflate_init_offset_slot_fast(c); - deflate_init_static_codes(c); - - return c; -} - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_deflate_compress(struct libdeflate_compressor *c, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail) -{ - if (unlikely(out_nbytes_avail < OUTPUT_END_PADDING)) - return 0; - - /* For extremely small inputs just use a single uncompressed block. */ - if (unlikely(in_nbytes < c->min_size_to_compress)) { - struct deflate_output_bitstream os; - deflate_init_output(&os, out, out_nbytes_avail); - if (in_nbytes == 0) - in = &os; /* Avoid passing NULL to memcpy() */ - deflate_write_uncompressed_block(&os, in, in_nbytes, true); - return deflate_flush_output(&os); - } - - return (*c->impl)(c, in, in_nbytes, out, out_nbytes_avail); -} - -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_free_compressor(struct libdeflate_compressor *c) -{ - libdeflate_aligned_free(c); -} - -unsigned int -deflate_get_compression_level(struct libdeflate_compressor *c) -{ - return c->compression_level; -} - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_deflate_compress_bound(struct libdeflate_compressor *c, - size_t in_nbytes) -{ - /* - * The worst case is all uncompressed blocks where one block has length - * <= MIN_BLOCK_LENGTH and the others have length MIN_BLOCK_LENGTH. - * Each uncompressed block has 5 bytes of overhead: 1 for BFINAL, BTYPE, - * and alignment to a byte boundary; 2 for LEN; and 2 for NLEN. - */ - size_t max_num_blocks = MAX(DIV_ROUND_UP(in_nbytes, MIN_BLOCK_LENGTH), 1); - return (5 * max_num_blocks) + in_nbytes + 1 + OUTPUT_END_PADDING; -} diff --git a/util/compress/libdeflate/lib/deflate_compress.h b/util/compress/libdeflate/lib/deflate_compress.h deleted file mode 100644 index d97d019ae7..0000000000 --- a/util/compress/libdeflate/lib/deflate_compress.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef LIB_DEFLATE_COMPRESS_H -#define LIB_DEFLATE_COMPRESS_H - -#include "lib_common.h" - -/* DEFLATE compression is private to deflate_compress.c, but we do need to be - * able to query the compression level for zlib and gzip header generation. */ - -struct libdeflate_compressor; - -unsigned int deflate_get_compression_level(struct libdeflate_compressor *c); - -#endif /* LIB_DEFLATE_COMPRESS_H */ diff --git a/util/compress/libdeflate/lib/deflate_constants.h b/util/compress/libdeflate/lib/deflate_constants.h deleted file mode 100644 index a10b57dec0..0000000000 --- a/util/compress/libdeflate/lib/deflate_constants.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * deflate_constants.h - constants for the DEFLATE compression format - */ - -#ifndef LIB_DEFLATE_CONSTANTS_H -#define LIB_DEFLATE_CONSTANTS_H - -/* Valid block types */ -#define DEFLATE_BLOCKTYPE_UNCOMPRESSED 0 -#define DEFLATE_BLOCKTYPE_STATIC_HUFFMAN 1 -#define DEFLATE_BLOCKTYPE_DYNAMIC_HUFFMAN 2 - -/* Minimum and maximum supported match lengths (in bytes) */ -#define DEFLATE_MIN_MATCH_LEN 3 -#define DEFLATE_MAX_MATCH_LEN 258 - -/* Minimum and maximum supported match offsets (in bytes) */ -#define DEFLATE_MIN_MATCH_OFFSET 1 -#define DEFLATE_MAX_MATCH_OFFSET 32768 - -#define DEFLATE_MAX_WINDOW_SIZE 32768 - -/* Number of symbols in each Huffman code. Note: for the literal/length - * and offset codes, these are actually the maximum values; a given block - * might use fewer symbols. */ -#define DEFLATE_NUM_PRECODE_SYMS 19 -#define DEFLATE_NUM_LITLEN_SYMS 288 -#define DEFLATE_NUM_OFFSET_SYMS 32 - -/* The maximum number of symbols across all codes */ -#define DEFLATE_MAX_NUM_SYMS 288 - -/* Division of symbols in the literal/length code */ -#define DEFLATE_NUM_LITERALS 256 -#define DEFLATE_END_OF_BLOCK 256 -#define DEFLATE_NUM_LEN_SYMS 31 - -/* Maximum codeword length, in bits, within each Huffman code */ -#define DEFLATE_MAX_PRE_CODEWORD_LEN 7 -#define DEFLATE_MAX_LITLEN_CODEWORD_LEN 15 -#define DEFLATE_MAX_OFFSET_CODEWORD_LEN 15 - -/* The maximum codeword length across all codes */ -#define DEFLATE_MAX_CODEWORD_LEN 15 - -/* Maximum possible overrun when decoding codeword lengths */ -#define DEFLATE_MAX_LENS_OVERRUN 137 - -/* - * Maximum number of extra bits that may be required to represent a match - * length or offset. - * - * TODO: are we going to have full DEFLATE64 support? If so, up to 16 - * length bits must be supported. - */ -#define DEFLATE_MAX_EXTRA_LENGTH_BITS 5 -#define DEFLATE_MAX_EXTRA_OFFSET_BITS 14 - -/* The maximum number of bits in which a match can be represented. This - * is the absolute worst case, which assumes the longest possible Huffman - * codewords and the maximum numbers of extra bits. */ -#define DEFLATE_MAX_MATCH_BITS \ - (DEFLATE_MAX_LITLEN_CODEWORD_LEN + DEFLATE_MAX_EXTRA_LENGTH_BITS + \ - DEFLATE_MAX_OFFSET_CODEWORD_LEN + DEFLATE_MAX_EXTRA_OFFSET_BITS) - -#endif /* LIB_DEFLATE_CONSTANTS_H */ diff --git a/util/compress/libdeflate/lib/deflate_decompress.c b/util/compress/libdeflate/lib/deflate_decompress.c deleted file mode 100644 index 1990e74d6f..0000000000 --- a/util/compress/libdeflate/lib/deflate_decompress.c +++ /dev/null @@ -1,1000 +0,0 @@ -/* - * deflate_decompress.c - a decompressor for DEFLATE - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * --------------------------------------------------------------------------- - * - * This is a highly optimized DEFLATE decompressor. When compiled with gcc on - * x86_64, it decompresses data in about 52% of the time of zlib (48% if BMI2 - * instructions are available). On other architectures it should still be - * significantly faster than zlib, but the difference may be smaller. - * - * Why this is faster than zlib's implementation: - * - * - Word accesses rather than byte accesses when reading input - * - Word accesses rather than byte accesses when copying matches - * - Faster Huffman decoding combined with various DEFLATE-specific tricks - * - Larger bitbuffer variable that doesn't need to be filled as often - * - Other optimizations to remove unnecessary branches - * - Only full-buffer decompression is supported, so the code doesn't need to - * support stopping and resuming decompression. - * - On x86_64, compile a version of the decompression routine using BMI2 - * instructions and use it automatically at runtime when supported. - */ - -#include - -#include "deflate_constants.h" -#include "unaligned.h" - -#include "libdeflate.h" - -/* - * If the expression passed to SAFETY_CHECK() evaluates to false, then the - * decompression routine immediately returns LIBDEFLATE_BAD_DATA, indicating the - * compressed data is invalid. - * - * Theoretically, these checks could be disabled for specialized applications - * where all input to the decompressor will be trusted. - */ -#if 0 -# pragma message("UNSAFE DECOMPRESSION IS ENABLED. THIS MUST ONLY BE USED IF THE DECOMPRESSOR INPUT WILL ALWAYS BE TRUSTED!") -# define SAFETY_CHECK(expr) (void)(expr) -#else -# define SAFETY_CHECK(expr) if (unlikely(!(expr))) return LIBDEFLATE_BAD_DATA -#endif - -/* - * Each TABLEBITS number is the base-2 logarithm of the number of entries in the - * main portion of the corresponding decode table. Each number should be large - * enough to ensure that for typical data, the vast majority of symbols can be - * decoded by a direct lookup of the next TABLEBITS bits of compressed data. - * However, this must be balanced against the fact that a larger table requires - * more memory and requires more time to fill. - * - * Note: you cannot change a TABLEBITS number without also changing the - * corresponding ENOUGH number! - */ -#define PRECODE_TABLEBITS 7 -#define LITLEN_TABLEBITS 10 -#define OFFSET_TABLEBITS 8 - -/* - * Each ENOUGH number is the maximum number of decode table entries that may be - * required for the corresponding Huffman code, including the main table and all - * subtables. Each number depends on three parameters: - * - * (1) the maximum number of symbols in the code (DEFLATE_NUM_*_SYMS) - * (2) the number of main table bits (the TABLEBITS numbers defined above) - * (3) the maximum allowed codeword length (DEFLATE_MAX_*_CODEWORD_LEN) - * - * The ENOUGH numbers were computed using the utility program 'enough' from - * zlib. This program enumerates all possible relevant Huffman codes to find - * the worst-case usage of decode table entries. - */ -#define PRECODE_ENOUGH 128 /* enough 19 7 7 */ -#define LITLEN_ENOUGH 1334 /* enough 288 10 15 */ -#define OFFSET_ENOUGH 402 /* enough 32 8 15 */ - -/* - * Type for codeword lengths. - */ -typedef u8 len_t; - -/* - * The main DEFLATE decompressor structure. Since this implementation only - * supports full buffer decompression, this structure does not store the entire - * decompression state, but rather only some arrays that are too large to - * comfortably allocate on the stack. - */ -struct libdeflate_decompressor { - - /* - * The arrays aren't all needed at the same time. 'precode_lens' and - * 'precode_decode_table' are unneeded after 'lens' has been filled. - * Furthermore, 'lens' need not be retained after building the litlen - * and offset decode tables. In fact, 'lens' can be in union with - * 'litlen_decode_table' provided that 'offset_decode_table' is separate - * and is built first. - */ - - union { - len_t precode_lens[DEFLATE_NUM_PRECODE_SYMS]; - - struct { - len_t lens[DEFLATE_NUM_LITLEN_SYMS + - DEFLATE_NUM_OFFSET_SYMS + - DEFLATE_MAX_LENS_OVERRUN]; - - u32 precode_decode_table[PRECODE_ENOUGH]; - } l; - - u32 litlen_decode_table[LITLEN_ENOUGH]; - } u; - - u32 offset_decode_table[OFFSET_ENOUGH]; - - /* used only during build_decode_table() */ - u16 sorted_syms[DEFLATE_MAX_NUM_SYMS]; - - bool static_codes_loaded; -}; - -/***************************************************************************** - * Input bitstream * - *****************************************************************************/ - -/* - * The state of the "input bitstream" consists of the following variables: - * - * - in_next: pointer to the next unread byte in the input buffer - * - * - in_end: pointer just past the end of the input buffer - * - * - bitbuf: a word-sized variable containing bits that have been read from - * the input buffer. The buffered bits are right-aligned - * (they're the low-order bits). - * - * - bitsleft: number of bits in 'bitbuf' that are valid. - * - * To make it easier for the compiler to optimize the code by keeping variables - * in registers, these are declared as normal variables and manipulated using - * macros. - */ - -/* - * The type for the bitbuffer variable ('bitbuf' described above). For best - * performance, this should have size equal to a machine word. - * - * 64-bit platforms have a significant advantage: they get a bigger bitbuffer - * which they have to fill less often. - */ -typedef machine_word_t bitbuf_t; - -/* - * Number of bits the bitbuffer variable can hold. - * - * This is one less than the obvious value because of the optimized arithmetic - * in FILL_BITS_WORDWISE() that leaves 'bitsleft' in the range - * [WORDBITS - 8, WORDBITS - 1] rather than [WORDBITS - 7, WORDBITS]. - */ -#define BITBUF_NBITS (8 * sizeof(bitbuf_t) - 1) - -/* - * The maximum number of bits that can be ensured in the bitbuffer variable, - * i.e. the maximum value of 'n' that can be passed ENSURE_BITS(n). The decoder - * only reads whole bytes from memory, so this is the lowest value of 'bitsleft' - * at which another byte cannot be read without first consuming some bits. - */ -#define MAX_ENSURE (BITBUF_NBITS - 7) - -/* - * Evaluates to true if 'n' is a valid argument to ENSURE_BITS(n), or false if - * 'n' is too large to be passed to ENSURE_BITS(n). Note: if 'n' is a compile - * time constant, then this expression will be a compile-type constant. - * Therefore, CAN_ENSURE() can be used choose between alternative - * implementations at compile time. - */ -#define CAN_ENSURE(n) ((n) <= MAX_ENSURE) - -/* - * Fill the bitbuffer variable, reading one byte at a time. - * - * If we would overread the input buffer, we just don't read anything, leaving - * the bits zeroed but marking them filled. This simplifies the decompressor - * because it removes the need to distinguish between real overreads and - * overreads that occur only because of the decompressor's own lookahead. - * - * The disadvantage is that real overreads are not detected immediately. - * However, this is safe because the decompressor is still guaranteed to make - * forward progress when presented never-ending 0 bits. In an existing block - * output will be getting generated, whereas new blocks can only be uncompressed - * (since the type code for uncompressed blocks is 0), for which we check for - * previous overread. But even if we didn't check, uncompressed blocks would - * fail to validate because LEN would not equal ~NLEN. So the decompressor will - * eventually either detect that the output buffer is full, or detect invalid - * input, or finish the final block. - */ -#define FILL_BITS_BYTEWISE() \ -do { \ - if (likely(in_next != in_end)) \ - bitbuf |= (bitbuf_t)*in_next++ << bitsleft; \ - else \ - overrun_count++; \ - bitsleft += 8; \ -} while (bitsleft <= BITBUF_NBITS - 8) - -/* - * Fill the bitbuffer variable by reading the next word from the input buffer - * and branchlessly updating 'in_next' and 'bitsleft' based on how many bits - * were filled. This can be significantly faster than FILL_BITS_BYTEWISE(). - * However, for this to work correctly, the word must be interpreted in - * little-endian format. In addition, the memory access may be unaligned. - * Therefore, this method is most efficient on little-endian architectures that - * support fast unaligned access, such as x86 and x86_64. - * - * For faster updating of 'bitsleft', we consider the bitbuffer size in bits to - * be 1 less than the word size and therefore be all 1 bits. Then the number of - * bits filled is the value of the 0 bits in position >= 3 when changed to 1. - * E.g. if words are 64 bits and bitsleft = 16 = b010000 then we refill b101000 - * = 40 bits = 5 bytes. This uses only 4 operations to update 'in_next' and - * 'bitsleft': one each of +, ^, >>, and |. (Not counting operations the - * compiler optimizes out.) In contrast, the alternative of: - * - * in_next += (BITBUF_NBITS - bitsleft) >> 3; - * bitsleft += (BITBUF_NBITS - bitsleft) & ~7; - * - * (where BITBUF_NBITS would be WORDBITS rather than WORDBITS - 1) would on - * average refill an extra bit, but uses 5 operations: two +, and one each of - * -, >>, and &. Also the - and & must be completed before 'bitsleft' can be - * updated, while the current solution updates 'bitsleft' with no dependencies. - */ -#define FILL_BITS_WORDWISE() \ -do { \ - /* BITBUF_NBITS must be all 1's in binary, see above */ \ - STATIC_ASSERT((BITBUF_NBITS & (BITBUF_NBITS + 1)) == 0);\ - \ - bitbuf |= get_unaligned_leword(in_next) << bitsleft; \ - in_next += (bitsleft ^ BITBUF_NBITS) >> 3; \ - bitsleft |= BITBUF_NBITS & ~7; \ -} while (0) - -/* - * Does the bitbuffer variable currently contain at least 'n' bits? - */ -#define HAVE_BITS(n) (bitsleft >= (n)) - -/* - * Load more bits from the input buffer until the specified number of bits is - * present in the bitbuffer variable. 'n' cannot be too large; see MAX_ENSURE - * and CAN_ENSURE(). - */ -#define ENSURE_BITS(n) \ -if (!HAVE_BITS(n)) { \ - if (CPU_IS_LITTLE_ENDIAN() && \ - UNALIGNED_ACCESS_IS_FAST && \ - likely(in_end - in_next >= sizeof(bitbuf_t))) \ - FILL_BITS_WORDWISE(); \ - else \ - FILL_BITS_BYTEWISE(); \ -} - -/* - * Return the next 'n' bits from the bitbuffer variable without removing them. - */ -#define BITS(n) ((u32)bitbuf & (((u32)1 << (n)) - 1)) - -/* - * Remove the next 'n' bits from the bitbuffer variable. - */ -#define REMOVE_BITS(n) (bitbuf >>= (n), bitsleft -= (n)) - -/* - * Remove and return the next 'n' bits from the bitbuffer variable. - */ -#define POP_BITS(n) (tmp32 = BITS(n), REMOVE_BITS(n), tmp32) - -/* - * Verify that the input buffer hasn't been overread, then align the input to - * the next byte boundary, discarding any remaining bits in the current byte. - * - * Note that if the bitbuffer variable currently contains more than 7 bits, then - * we must rewind 'in_next', effectively putting those bits back. Only the bits - * in what would be the "current" byte if we were reading one byte at a time can - * be actually discarded. - */ -#define ALIGN_INPUT() \ -do { \ - SAFETY_CHECK(overrun_count <= (bitsleft >> 3)); \ - in_next -= (bitsleft >> 3) - overrun_count; \ - overrun_count = 0; \ - bitbuf = 0; \ - bitsleft = 0; \ -} while(0) - -/* - * Read a 16-bit value from the input. This must have been preceded by a call - * to ALIGN_INPUT(), and the caller must have already checked for overrun. - */ -#define READ_U16() (tmp16 = get_unaligned_le16(in_next), in_next += 2, tmp16) - -/***************************************************************************** - * Huffman decoding * - *****************************************************************************/ - -/* - * A decode table for order TABLEBITS consists of a main table of (1 << - * TABLEBITS) entries followed by a variable number of subtables. - * - * The decoding algorithm takes the next TABLEBITS bits of compressed data and - * uses them as an index into the decode table. The resulting entry is either a - * "direct entry", meaning that it contains the value desired, or a "subtable - * pointer", meaning that the entry references a subtable that must be indexed - * using more bits of the compressed data to decode the symbol. - * - * Each decode table (a main table along with its subtables, if any) is - * associated with a Huffman code. Logically, the result of a decode table - * lookup is a symbol from the alphabet from which the corresponding Huffman - * code was constructed. A symbol with codeword length n <= TABLEBITS is - * associated with 2**(TABLEBITS - n) direct entries in the table, whereas a - * symbol with codeword length n > TABLEBITS is associated with one or more - * subtable entries. - * - * On top of this basic design, we implement several optimizations: - * - * - We store the length of each codeword directly in each of its decode table - * entries. This allows the codeword length to be produced without indexing - * an additional table. - * - * - When beneficial, we don't store the Huffman symbol itself, but instead data - * generated from it. For example, when decoding an offset symbol in DEFLATE, - * it's more efficient if we can decode the offset base and number of extra - * offset bits directly rather than decoding the offset symbol and then - * looking up both of those values in an additional table or tables. - * - * The size of each decode table entry is 32 bits, which provides slightly - * better performance than 16-bit entries on 32 and 64 bit processers, provided - * that the table doesn't get so large that it takes up too much memory and - * starts generating cache misses. The bits of each decode table entry are - * defined as follows: - * - * - Bits 30 -- 31: flags (see below) - * - Bits 8 -- 29: decode result: a Huffman symbol or related data - * - Bits 0 -- 7: codeword length - */ - -/* - * This flag is set in all main decode table entries that represent subtable - * pointers. - */ -#define HUFFDEC_SUBTABLE_POINTER 0x80000000 - -/* - * This flag is set in all entries in the litlen decode table that represent - * literals. - */ -#define HUFFDEC_LITERAL 0x40000000 - -/* Mask for extracting the codeword length from a decode table entry. */ -#define HUFFDEC_LENGTH_MASK 0xFF - -/* Shift to extract the decode result from a decode table entry. */ -#define HUFFDEC_RESULT_SHIFT 8 - -/* Shift a decode result into its position in the decode table entry. */ -#define HUFFDEC_RESULT_ENTRY(result) ((u32)(result) << HUFFDEC_RESULT_SHIFT) - -/* The decode result for each precode symbol. There is no special optimization - * for the precode; the decode result is simply the symbol value. */ -static const u32 precode_decode_results[DEFLATE_NUM_PRECODE_SYMS] = { -#define ENTRY(presym) HUFFDEC_RESULT_ENTRY(presym) - ENTRY(0) , ENTRY(1) , ENTRY(2) , ENTRY(3) , - ENTRY(4) , ENTRY(5) , ENTRY(6) , ENTRY(7) , - ENTRY(8) , ENTRY(9) , ENTRY(10) , ENTRY(11) , - ENTRY(12) , ENTRY(13) , ENTRY(14) , ENTRY(15) , - ENTRY(16) , ENTRY(17) , ENTRY(18) , -#undef ENTRY -}; - -/* The decode result for each litlen symbol. For literals, this is the literal - * value itself and the HUFFDEC_LITERAL flag. For lengths, this is the length - * base and the number of extra length bits. */ -static const u32 litlen_decode_results[DEFLATE_NUM_LITLEN_SYMS] = { - - /* Literals */ -#define ENTRY(literal) (HUFFDEC_LITERAL | HUFFDEC_RESULT_ENTRY(literal)) - ENTRY(0) , ENTRY(1) , ENTRY(2) , ENTRY(3) , - ENTRY(4) , ENTRY(5) , ENTRY(6) , ENTRY(7) , - ENTRY(8) , ENTRY(9) , ENTRY(10) , ENTRY(11) , - ENTRY(12) , ENTRY(13) , ENTRY(14) , ENTRY(15) , - ENTRY(16) , ENTRY(17) , ENTRY(18) , ENTRY(19) , - ENTRY(20) , ENTRY(21) , ENTRY(22) , ENTRY(23) , - ENTRY(24) , ENTRY(25) , ENTRY(26) , ENTRY(27) , - ENTRY(28) , ENTRY(29) , ENTRY(30) , ENTRY(31) , - ENTRY(32) , ENTRY(33) , ENTRY(34) , ENTRY(35) , - ENTRY(36) , ENTRY(37) , ENTRY(38) , ENTRY(39) , - ENTRY(40) , ENTRY(41) , ENTRY(42) , ENTRY(43) , - ENTRY(44) , ENTRY(45) , ENTRY(46) , ENTRY(47) , - ENTRY(48) , ENTRY(49) , ENTRY(50) , ENTRY(51) , - ENTRY(52) , ENTRY(53) , ENTRY(54) , ENTRY(55) , - ENTRY(56) , ENTRY(57) , ENTRY(58) , ENTRY(59) , - ENTRY(60) , ENTRY(61) , ENTRY(62) , ENTRY(63) , - ENTRY(64) , ENTRY(65) , ENTRY(66) , ENTRY(67) , - ENTRY(68) , ENTRY(69) , ENTRY(70) , ENTRY(71) , - ENTRY(72) , ENTRY(73) , ENTRY(74) , ENTRY(75) , - ENTRY(76) , ENTRY(77) , ENTRY(78) , ENTRY(79) , - ENTRY(80) , ENTRY(81) , ENTRY(82) , ENTRY(83) , - ENTRY(84) , ENTRY(85) , ENTRY(86) , ENTRY(87) , - ENTRY(88) , ENTRY(89) , ENTRY(90) , ENTRY(91) , - ENTRY(92) , ENTRY(93) , ENTRY(94) , ENTRY(95) , - ENTRY(96) , ENTRY(97) , ENTRY(98) , ENTRY(99) , - ENTRY(100) , ENTRY(101) , ENTRY(102) , ENTRY(103) , - ENTRY(104) , ENTRY(105) , ENTRY(106) , ENTRY(107) , - ENTRY(108) , ENTRY(109) , ENTRY(110) , ENTRY(111) , - ENTRY(112) , ENTRY(113) , ENTRY(114) , ENTRY(115) , - ENTRY(116) , ENTRY(117) , ENTRY(118) , ENTRY(119) , - ENTRY(120) , ENTRY(121) , ENTRY(122) , ENTRY(123) , - ENTRY(124) , ENTRY(125) , ENTRY(126) , ENTRY(127) , - ENTRY(128) , ENTRY(129) , ENTRY(130) , ENTRY(131) , - ENTRY(132) , ENTRY(133) , ENTRY(134) , ENTRY(135) , - ENTRY(136) , ENTRY(137) , ENTRY(138) , ENTRY(139) , - ENTRY(140) , ENTRY(141) , ENTRY(142) , ENTRY(143) , - ENTRY(144) , ENTRY(145) , ENTRY(146) , ENTRY(147) , - ENTRY(148) , ENTRY(149) , ENTRY(150) , ENTRY(151) , - ENTRY(152) , ENTRY(153) , ENTRY(154) , ENTRY(155) , - ENTRY(156) , ENTRY(157) , ENTRY(158) , ENTRY(159) , - ENTRY(160) , ENTRY(161) , ENTRY(162) , ENTRY(163) , - ENTRY(164) , ENTRY(165) , ENTRY(166) , ENTRY(167) , - ENTRY(168) , ENTRY(169) , ENTRY(170) , ENTRY(171) , - ENTRY(172) , ENTRY(173) , ENTRY(174) , ENTRY(175) , - ENTRY(176) , ENTRY(177) , ENTRY(178) , ENTRY(179) , - ENTRY(180) , ENTRY(181) , ENTRY(182) , ENTRY(183) , - ENTRY(184) , ENTRY(185) , ENTRY(186) , ENTRY(187) , - ENTRY(188) , ENTRY(189) , ENTRY(190) , ENTRY(191) , - ENTRY(192) , ENTRY(193) , ENTRY(194) , ENTRY(195) , - ENTRY(196) , ENTRY(197) , ENTRY(198) , ENTRY(199) , - ENTRY(200) , ENTRY(201) , ENTRY(202) , ENTRY(203) , - ENTRY(204) , ENTRY(205) , ENTRY(206) , ENTRY(207) , - ENTRY(208) , ENTRY(209) , ENTRY(210) , ENTRY(211) , - ENTRY(212) , ENTRY(213) , ENTRY(214) , ENTRY(215) , - ENTRY(216) , ENTRY(217) , ENTRY(218) , ENTRY(219) , - ENTRY(220) , ENTRY(221) , ENTRY(222) , ENTRY(223) , - ENTRY(224) , ENTRY(225) , ENTRY(226) , ENTRY(227) , - ENTRY(228) , ENTRY(229) , ENTRY(230) , ENTRY(231) , - ENTRY(232) , ENTRY(233) , ENTRY(234) , ENTRY(235) , - ENTRY(236) , ENTRY(237) , ENTRY(238) , ENTRY(239) , - ENTRY(240) , ENTRY(241) , ENTRY(242) , ENTRY(243) , - ENTRY(244) , ENTRY(245) , ENTRY(246) , ENTRY(247) , - ENTRY(248) , ENTRY(249) , ENTRY(250) , ENTRY(251) , - ENTRY(252) , ENTRY(253) , ENTRY(254) , ENTRY(255) , -#undef ENTRY - -#define HUFFDEC_EXTRA_LENGTH_BITS_MASK 0xFF -#define HUFFDEC_LENGTH_BASE_SHIFT 8 -#define HUFFDEC_END_OF_BLOCK_LENGTH 0 - -#define ENTRY(length_base, num_extra_bits) HUFFDEC_RESULT_ENTRY( \ - ((u32)(length_base) << HUFFDEC_LENGTH_BASE_SHIFT) | (num_extra_bits)) - - /* End of block */ - ENTRY(HUFFDEC_END_OF_BLOCK_LENGTH, 0), - - /* Lengths */ - ENTRY(3 , 0) , ENTRY(4 , 0) , ENTRY(5 , 0) , ENTRY(6 , 0), - ENTRY(7 , 0) , ENTRY(8 , 0) , ENTRY(9 , 0) , ENTRY(10 , 0), - ENTRY(11 , 1) , ENTRY(13 , 1) , ENTRY(15 , 1) , ENTRY(17 , 1), - ENTRY(19 , 2) , ENTRY(23 , 2) , ENTRY(27 , 2) , ENTRY(31 , 2), - ENTRY(35 , 3) , ENTRY(43 , 3) , ENTRY(51 , 3) , ENTRY(59 , 3), - ENTRY(67 , 4) , ENTRY(83 , 4) , ENTRY(99 , 4) , ENTRY(115, 4), - ENTRY(131, 5) , ENTRY(163, 5) , ENTRY(195, 5) , ENTRY(227, 5), - ENTRY(258, 0) , ENTRY(258, 0) , ENTRY(258, 0) , -#undef ENTRY -}; - -/* The decode result for each offset symbol. This is the offset base and the - * number of extra offset bits. */ -static const u32 offset_decode_results[DEFLATE_NUM_OFFSET_SYMS] = { - -#define HUFFDEC_EXTRA_OFFSET_BITS_SHIFT 16 -#define HUFFDEC_OFFSET_BASE_MASK (((u32)1 << HUFFDEC_EXTRA_OFFSET_BITS_SHIFT) - 1) - -#define ENTRY(offset_base, num_extra_bits) HUFFDEC_RESULT_ENTRY( \ - ((u32)(num_extra_bits) << HUFFDEC_EXTRA_OFFSET_BITS_SHIFT) | \ - (offset_base)) - ENTRY(1 , 0) , ENTRY(2 , 0) , ENTRY(3 , 0) , ENTRY(4 , 0) , - ENTRY(5 , 1) , ENTRY(7 , 1) , ENTRY(9 , 2) , ENTRY(13 , 2) , - ENTRY(17 , 3) , ENTRY(25 , 3) , ENTRY(33 , 4) , ENTRY(49 , 4) , - ENTRY(65 , 5) , ENTRY(97 , 5) , ENTRY(129 , 6) , ENTRY(193 , 6) , - ENTRY(257 , 7) , ENTRY(385 , 7) , ENTRY(513 , 8) , ENTRY(769 , 8) , - ENTRY(1025 , 9) , ENTRY(1537 , 9) , ENTRY(2049 , 10) , ENTRY(3073 , 10) , - ENTRY(4097 , 11) , ENTRY(6145 , 11) , ENTRY(8193 , 12) , ENTRY(12289 , 12) , - ENTRY(16385 , 13) , ENTRY(24577 , 13) , ENTRY(32769 , 14) , ENTRY(49153 , 14) , -#undef ENTRY -}; - -/* - * Build a table for fast decoding of symbols from a Huffman code. As input, - * this function takes the codeword length of each symbol which may be used in - * the code. As output, it produces a decode table for the canonical Huffman - * code described by the codeword lengths. The decode table is built with the - * assumption that it will be indexed with "bit-reversed" codewords, where the - * low-order bit is the first bit of the codeword. This format is used for all - * Huffman codes in DEFLATE. - * - * @decode_table - * The array in which the decode table will be generated. This array must - * have sufficient length; see the definition of the ENOUGH numbers. - * @lens - * An array which provides, for each symbol, the length of the - * corresponding codeword in bits, or 0 if the symbol is unused. This may - * alias @decode_table, since nothing is written to @decode_table until all - * @lens have been consumed. All codeword lengths are assumed to be <= - * @max_codeword_len but are otherwise considered untrusted. If they do - * not form a valid Huffman code, then the decode table is not built and - * %false is returned. - * @num_syms - * The number of symbols in the code, including all unused symbols. - * @decode_results - * An array which provides, for each symbol, the actual value to store into - * the decode table. This value will be directly produced as the result of - * decoding that symbol, thereby moving the indirection out of the decode - * loop and into the table initialization. - * @table_bits - * The log base-2 of the number of main table entries to use. - * @max_codeword_len - * The maximum allowed codeword length for this Huffman code. - * Must be <= DEFLATE_MAX_CODEWORD_LEN. - * @sorted_syms - * A temporary array of length @num_syms. - * - * Returns %true if successful; %false if the codeword lengths do not form a - * valid Huffman code. - */ -static bool -build_decode_table(u32 decode_table[], - const len_t lens[], - const unsigned num_syms, - const u32 decode_results[], - const unsigned table_bits, - const unsigned max_codeword_len, - u16 *sorted_syms) -{ - unsigned len_counts[DEFLATE_MAX_CODEWORD_LEN + 1]; - unsigned offsets[DEFLATE_MAX_CODEWORD_LEN + 1]; - unsigned sym; /* current symbol */ - unsigned codeword; /* current codeword, bit-reversed */ - unsigned len; /* current codeword length in bits */ - unsigned count; /* num codewords remaining with this length */ - u32 codespace_used; /* codespace used out of '2^max_codeword_len' */ - unsigned cur_table_end; /* end index of current table */ - unsigned subtable_prefix; /* codeword prefix of current subtable */ - unsigned subtable_start; /* start index of current subtable */ - unsigned subtable_bits; /* log2 of current subtable length */ - - /* Count how many codewords have each length, including 0. */ - for (len = 0; len <= max_codeword_len; len++) - len_counts[len] = 0; - for (sym = 0; sym < num_syms; sym++) - len_counts[lens[sym]]++; - - /* - * Sort the symbols primarily by increasing codeword length and - * secondarily by increasing symbol value; or equivalently by their - * codewords in lexicographic order, since a canonical code is assumed. - * - * For efficiency, also compute 'codespace_used' in the same pass over - * 'len_counts[]' used to build 'offsets[]' for sorting. - */ - - /* Ensure that 'codespace_used' cannot overflow. */ - STATIC_ASSERT(sizeof(codespace_used) == 4); - STATIC_ASSERT(UINT32_MAX / (1U << (DEFLATE_MAX_CODEWORD_LEN - 1)) >= - DEFLATE_MAX_NUM_SYMS); - - offsets[0] = 0; - offsets[1] = len_counts[0]; - codespace_used = 0; - for (len = 1; len < max_codeword_len; len++) { - offsets[len + 1] = offsets[len] + len_counts[len]; - codespace_used = (codespace_used << 1) + len_counts[len]; - } - codespace_used = (codespace_used << 1) + len_counts[len]; - - for (sym = 0; sym < num_syms; sym++) - sorted_syms[offsets[lens[sym]]++] = sym; - - sorted_syms += offsets[0]; /* Skip unused symbols */ - - /* lens[] is done being used, so we can write to decode_table[] now. */ - - /* - * Check whether the lengths form a complete code (exactly fills the - * codespace), an incomplete code (doesn't fill the codespace), or an - * overfull code (overflows the codespace). A codeword of length 'n' - * uses proportion '1/(2^n)' of the codespace. An overfull code is - * nonsensical, so is considered invalid. An incomplete code is - * considered valid only in two specific cases; see below. - */ - - /* overfull code? */ - if (unlikely(codespace_used > (1U << max_codeword_len))) - return false; - - /* incomplete code? */ - if (unlikely(codespace_used < (1U << max_codeword_len))) { - u32 entry; - unsigned i; - - if (codespace_used == 0) { - /* - * An empty code is allowed. This can happen for the - * offset code in DEFLATE, since a dynamic Huffman block - * need not contain any matches. - */ - - /* sym=0, len=1 (arbitrary) */ - entry = decode_results[0] | 1; - } else { - /* - * Allow codes with a single used symbol, with codeword - * length 1. The DEFLATE RFC is unclear regarding this - * case. What zlib's decompressor does is permit this - * for the litlen and offset codes and assume the - * codeword is '0' rather than '1'. We do the same - * except we allow this for precodes too, since there's - * no convincing reason to treat the codes differently. - * We also assign both codewords '0' and '1' to the - * symbol to avoid having to handle '1' specially. - */ - if (codespace_used != (1U << (max_codeword_len - 1)) || - len_counts[1] != 1) - return false; - entry = decode_results[*sorted_syms] | 1; - } - /* - * Note: the decode table still must be fully initialized, in - * case the stream is malformed and contains bits from the part - * of the codespace the incomplete code doesn't use. - */ - for (i = 0; i < (1U << table_bits); i++) - decode_table[i] = entry; - return true; - } - - /* - * The lengths form a complete code. Now, enumerate the codewords in - * lexicographic order and fill the decode table entries for each one. - * - * First, process all codewords with len <= table_bits. Each one gets - * '2^(table_bits-len)' direct entries in the table. - * - * Since DEFLATE uses bit-reversed codewords, these entries aren't - * consecutive but rather are spaced '2^len' entries apart. This makes - * filling them naively somewhat awkward and inefficient, since strided - * stores are less cache-friendly and preclude the use of word or - * vector-at-a-time stores to fill multiple entries per instruction. - * - * To optimize this, we incrementally double the table size. When - * processing codewords with length 'len', the table is treated as - * having only '2^len' entries, so each codeword uses just one entry. - * Then, each time 'len' is incremented, the table size is doubled and - * the first half is copied to the second half. This significantly - * improves performance over naively doing strided stores. - * - * Note that some entries copied for each table doubling may not have - * been initialized yet, but it doesn't matter since they're guaranteed - * to be initialized later (because the Huffman code is complete). - */ - codeword = 0; - len = 1; - while ((count = len_counts[len]) == 0) - len++; - cur_table_end = 1U << len; - while (len <= table_bits) { - /* Process all 'count' codewords with length 'len' bits. */ - do { - unsigned bit; - - /* Fill the first entry for the current codeword. */ - decode_table[codeword] = - decode_results[*sorted_syms++] | len; - - if (codeword == cur_table_end - 1) { - /* Last codeword (all 1's) */ - for (; len < table_bits; len++) { - memcpy(&decode_table[cur_table_end], - decode_table, - cur_table_end * - sizeof(decode_table[0])); - cur_table_end <<= 1; - } - return true; - } - /* - * To advance to the lexicographically next codeword in - * the canonical code, the codeword must be incremented, - * then 0's must be appended to the codeword as needed - * to match the next codeword's length. - * - * Since the codeword is bit-reversed, appending 0's is - * a no-op. However, incrementing it is nontrivial. To - * do so efficiently, use the 'bsr' instruction to find - * the last (highest order) 0 bit in the codeword, set - * it, and clear any later (higher order) 1 bits. But - * 'bsr' actually finds the highest order 1 bit, so to - * use it first flip all bits in the codeword by XOR'ing - * it with (1U << len) - 1 == cur_table_end - 1. - */ - bit = 1U << bsr32(codeword ^ (cur_table_end - 1)); - codeword &= bit - 1; - codeword |= bit; - } while (--count); - - /* Advance to the next codeword length. */ - do { - if (++len <= table_bits) { - memcpy(&decode_table[cur_table_end], - decode_table, - cur_table_end * sizeof(decode_table[0])); - cur_table_end <<= 1; - } - } while ((count = len_counts[len]) == 0); - } - - /* Process codewords with len > table_bits. These require subtables. */ - cur_table_end = 1U << table_bits; - subtable_prefix = -1; - subtable_start = 0; - for (;;) { - u32 entry; - unsigned i; - unsigned stride; - unsigned bit; - - /* - * Start a new subtable if the first 'table_bits' bits of the - * codeword don't match the prefix of the current subtable. - */ - if ((codeword & ((1U << table_bits) - 1)) != subtable_prefix) { - subtable_prefix = (codeword & ((1U << table_bits) - 1)); - subtable_start = cur_table_end; - /* - * Calculate the subtable length. If the codeword has - * length 'table_bits + n', then the subtable needs - * '2^n' entries. But it may need more; if fewer than - * '2^n' codewords of length 'table_bits + n' remain, - * then the length will need to be incremented to bring - * in longer codewords until the subtable can be - * completely filled. Note that because the Huffman - * code is complete, it will always be possible to fill - * the subtable eventually. - */ - subtable_bits = len - table_bits; - codespace_used = count; - while (codespace_used < (1U << subtable_bits)) { - subtable_bits++; - codespace_used = (codespace_used << 1) + - len_counts[table_bits + subtable_bits]; - } - cur_table_end = subtable_start + (1U << subtable_bits); - - /* - * Create the entry that points from the main table to - * the subtable. This entry contains the index of the - * start of the subtable and the number of bits with - * which the subtable is indexed (the log base 2 of the - * number of entries it contains). - */ - decode_table[subtable_prefix] = - HUFFDEC_SUBTABLE_POINTER | - HUFFDEC_RESULT_ENTRY(subtable_start) | - subtable_bits; - } - - /* Fill the subtable entries for the current codeword. */ - entry = decode_results[*sorted_syms++] | (len - table_bits); - i = subtable_start + (codeword >> table_bits); - stride = 1U << (len - table_bits); - do { - decode_table[i] = entry; - i += stride; - } while (i < cur_table_end); - - /* Advance to the next codeword. */ - if (codeword == (1U << len) - 1) /* last codeword (all 1's)? */ - return true; - bit = 1U << bsr32(codeword ^ ((1U << len) - 1)); - codeword &= bit - 1; - codeword |= bit; - count--; - while (count == 0) - count = len_counts[++len]; - } -} - -/* Build the decode table for the precode. */ -static bool -build_precode_decode_table(struct libdeflate_decompressor *d) -{ - /* When you change TABLEBITS, you must change ENOUGH, and vice versa! */ - STATIC_ASSERT(PRECODE_TABLEBITS == 7 && PRECODE_ENOUGH == 128); - - return build_decode_table(d->u.l.precode_decode_table, - d->u.precode_lens, - DEFLATE_NUM_PRECODE_SYMS, - precode_decode_results, - PRECODE_TABLEBITS, - DEFLATE_MAX_PRE_CODEWORD_LEN, - d->sorted_syms); -} - -/* Build the decode table for the literal/length code. */ -static bool -build_litlen_decode_table(struct libdeflate_decompressor *d, - unsigned num_litlen_syms, unsigned num_offset_syms) -{ - /* When you change TABLEBITS, you must change ENOUGH, and vice versa! */ - STATIC_ASSERT(LITLEN_TABLEBITS == 10 && LITLEN_ENOUGH == 1334); - - return build_decode_table(d->u.litlen_decode_table, - d->u.l.lens, - num_litlen_syms, - litlen_decode_results, - LITLEN_TABLEBITS, - DEFLATE_MAX_LITLEN_CODEWORD_LEN, - d->sorted_syms); -} - -/* Build the decode table for the offset code. */ -static bool -build_offset_decode_table(struct libdeflate_decompressor *d, - unsigned num_litlen_syms, unsigned num_offset_syms) -{ - /* When you change TABLEBITS, you must change ENOUGH, and vice versa! */ - STATIC_ASSERT(OFFSET_TABLEBITS == 8 && OFFSET_ENOUGH == 402); - - return build_decode_table(d->offset_decode_table, - d->u.l.lens + num_litlen_syms, - num_offset_syms, - offset_decode_results, - OFFSET_TABLEBITS, - DEFLATE_MAX_OFFSET_CODEWORD_LEN, - d->sorted_syms); -} - -static forceinline machine_word_t -repeat_byte(u8 b) -{ - machine_word_t v; - - STATIC_ASSERT(WORDBITS == 32 || WORDBITS == 64); - - v = b; - v |= v << 8; - v |= v << 16; - v |= v << ((WORDBITS == 64) ? 32 : 0); - return v; -} - -static forceinline void -copy_word_unaligned(const void *src, void *dst) -{ - store_word_unaligned(load_word_unaligned(src), dst); -} - -/***************************************************************************** - * Main decompression routine - *****************************************************************************/ - -typedef enum libdeflate_result (*decompress_func_t) - (struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, size_t *actual_out_nbytes_ret); - -#undef DEFAULT_IMPL -#undef DISPATCH -#if defined(__i386__) || defined(__x86_64__) -# include "x86/decompress_impl.h" -#endif - -#ifndef DEFAULT_IMPL -# define FUNCNAME deflate_decompress_default -# define ATTRIBUTES -# include "decompress_template.h" -# define DEFAULT_IMPL deflate_decompress_default -#endif - -#ifdef DISPATCH -static enum libdeflate_result -dispatch(struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, size_t *actual_out_nbytes_ret); - -static volatile decompress_func_t decompress_impl = dispatch; - -/* Choose the fastest implementation at runtime */ -static enum libdeflate_result -dispatch(struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, size_t *actual_out_nbytes_ret) -{ - decompress_func_t f = arch_select_decompress_func(); - - if (f == NULL) - f = DEFAULT_IMPL; - - decompress_impl = f; - return (*f)(d, in, in_nbytes, out, out_nbytes_avail, - actual_in_nbytes_ret, actual_out_nbytes_ret); -} -#else -# define decompress_impl DEFAULT_IMPL /* only one implementation, use it */ -#endif - - -/* - * This is the main DEFLATE decompression routine. See libdeflate.h for the - * documentation. - * - * Note that the real code is in decompress_template.h. The part here just - * handles calling the appropriate implementation depending on the CPU features - * at runtime. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_deflate_decompress_ex(struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret) -{ - return decompress_impl(d, in, in_nbytes, out, out_nbytes_avail, - actual_in_nbytes_ret, actual_out_nbytes_ret); -} - -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_deflate_decompress(struct libdeflate_decompressor * restrict d, - const void * restrict in, size_t in_nbytes, - void * restrict out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret) -{ - return libdeflate_deflate_decompress_ex(d, in, in_nbytes, - out, out_nbytes_avail, - NULL, actual_out_nbytes_ret); -} - -LIBDEFLATEEXPORT struct libdeflate_decompressor * LIBDEFLATEAPI -libdeflate_alloc_decompressor(void) -{ - /* - * Note that only certain parts of the decompressor actually must be - * initialized here: - * - * - 'static_codes_loaded' must be initialized to false. - * - * - The first half of the main portion of each decode table must be - * initialized to any value, to avoid reading from uninitialized - * memory during table expansion in build_decode_table(). (Although, - * this is really just to avoid warnings with dynamic tools like - * valgrind, since build_decode_table() is guaranteed to initialize - * all entries eventually anyway.) - * - * But for simplicity, we currently just zero the whole decompressor. - */ - struct libdeflate_decompressor *d = libdeflate_malloc(sizeof(*d)); - - if (d == NULL) - return NULL; - memset(d, 0, sizeof(*d)); - return d; -} - -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_free_decompressor(struct libdeflate_decompressor *d) -{ - libdeflate_free(d); -} diff --git a/util/compress/libdeflate/lib/gzip_compress.c b/util/compress/libdeflate/lib/gzip_compress.c deleted file mode 100644 index 3cb8803cf6..0000000000 --- a/util/compress/libdeflate/lib/gzip_compress.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * gzip_compress.c - compress with a gzip wrapper - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "deflate_compress.h" -#include "gzip_constants.h" -#include "unaligned.h" - -#include "libdeflate.h" - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_gzip_compress(struct libdeflate_compressor *c, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail) -{ - u8 *out_next = out; - unsigned compression_level; - u8 xfl; - size_t deflate_size; - - if (out_nbytes_avail <= GZIP_MIN_OVERHEAD) - return 0; - - /* ID1 */ - *out_next++ = GZIP_ID1; - /* ID2 */ - *out_next++ = GZIP_ID2; - /* CM */ - *out_next++ = GZIP_CM_DEFLATE; - /* FLG */ - *out_next++ = 0; - /* MTIME */ - put_unaligned_le32(GZIP_MTIME_UNAVAILABLE, out_next); - out_next += 4; - /* XFL */ - xfl = 0; - compression_level = deflate_get_compression_level(c); - if (compression_level < 2) - xfl |= GZIP_XFL_FASTEST_COMPRESSION; - else if (compression_level >= 8) - xfl |= GZIP_XFL_SLOWEST_COMPRESSION; - *out_next++ = xfl; - /* OS */ - *out_next++ = GZIP_OS_UNKNOWN; /* OS */ - - /* Compressed data */ - deflate_size = libdeflate_deflate_compress(c, in, in_nbytes, out_next, - out_nbytes_avail - GZIP_MIN_OVERHEAD); - if (deflate_size == 0) - return 0; - out_next += deflate_size; - - /* CRC32 */ - put_unaligned_le32(libdeflate_crc32(0, in, in_nbytes), out_next); - out_next += 4; - - /* ISIZE */ - put_unaligned_le32((u32)in_nbytes, out_next); - out_next += 4; - - return out_next - (u8 *)out; -} - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_gzip_compress_bound(struct libdeflate_compressor *c, - size_t in_nbytes) -{ - return GZIP_MIN_OVERHEAD + - libdeflate_deflate_compress_bound(c, in_nbytes); -} diff --git a/util/compress/libdeflate/lib/gzip_constants.h b/util/compress/libdeflate/lib/gzip_constants.h deleted file mode 100644 index 35e4728d86..0000000000 --- a/util/compress/libdeflate/lib/gzip_constants.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * gzip_constants.h - constants for the gzip wrapper format - */ - -#ifndef LIB_GZIP_CONSTANTS_H -#define LIB_GZIP_CONSTANTS_H - -#define GZIP_MIN_HEADER_SIZE 10 -#define GZIP_FOOTER_SIZE 8 -#define GZIP_MIN_OVERHEAD (GZIP_MIN_HEADER_SIZE + GZIP_FOOTER_SIZE) - -#define GZIP_ID1 0x1F -#define GZIP_ID2 0x8B - -#define GZIP_CM_DEFLATE 8 - -#define GZIP_FTEXT 0x01 -#define GZIP_FHCRC 0x02 -#define GZIP_FEXTRA 0x04 -#define GZIP_FNAME 0x08 -#define GZIP_FCOMMENT 0x10 -#define GZIP_FRESERVED 0xE0 - -#define GZIP_MTIME_UNAVAILABLE 0 - -#define GZIP_XFL_SLOWEST_COMPRESSION 0x02 -#define GZIP_XFL_FASTEST_COMPRESSION 0x04 - -#define GZIP_OS_FAT 0 -#define GZIP_OS_AMIGA 1 -#define GZIP_OS_VMS 2 -#define GZIP_OS_UNIX 3 -#define GZIP_OS_VM_CMS 4 -#define GZIP_OS_ATARI_TOS 5 -#define GZIP_OS_HPFS 6 -#define GZIP_OS_MACINTOSH 7 -#define GZIP_OS_Z_SYSTEM 8 -#define GZIP_OS_CP_M 9 -#define GZIP_OS_TOPS_20 10 -#define GZIP_OS_NTFS 11 -#define GZIP_OS_QDOS 12 -#define GZIP_OS_RISCOS 13 -#define GZIP_OS_UNKNOWN 255 - -#endif /* LIB_GZIP_CONSTANTS_H */ diff --git a/util/compress/libdeflate/lib/gzip_decompress.c b/util/compress/libdeflate/lib/gzip_decompress.c deleted file mode 100644 index 1b31d8a8e1..0000000000 --- a/util/compress/libdeflate/lib/gzip_decompress.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * gzip_decompress.c - decompress with a gzip wrapper - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "gzip_constants.h" -#include "unaligned.h" - -#include "libdeflate.h" - -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *d, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret) -{ - const u8 *in_next = in; - const u8 * const in_end = in_next + in_nbytes; - u8 flg; - size_t actual_in_nbytes; - size_t actual_out_nbytes; - enum libdeflate_result result; - - if (in_nbytes < GZIP_MIN_OVERHEAD) - return LIBDEFLATE_BAD_DATA; - - /* ID1 */ - if (*in_next++ != GZIP_ID1) - return LIBDEFLATE_BAD_DATA; - /* ID2 */ - if (*in_next++ != GZIP_ID2) - return LIBDEFLATE_BAD_DATA; - /* CM */ - if (*in_next++ != GZIP_CM_DEFLATE) - return LIBDEFLATE_BAD_DATA; - flg = *in_next++; - /* MTIME */ - in_next += 4; - /* XFL */ - in_next += 1; - /* OS */ - in_next += 1; - - if (flg & GZIP_FRESERVED) - return LIBDEFLATE_BAD_DATA; - - /* Extra field */ - if (flg & GZIP_FEXTRA) { - u16 xlen = get_unaligned_le16(in_next); - in_next += 2; - - if (in_end - in_next < (u32)xlen + GZIP_FOOTER_SIZE) - return LIBDEFLATE_BAD_DATA; - - in_next += xlen; - } - - /* Original file name (zero terminated) */ - if (flg & GZIP_FNAME) { - while (*in_next++ != 0 && in_next != in_end) - ; - if (in_end - in_next < GZIP_FOOTER_SIZE) - return LIBDEFLATE_BAD_DATA; - } - - /* File comment (zero terminated) */ - if (flg & GZIP_FCOMMENT) { - while (*in_next++ != 0 && in_next != in_end) - ; - if (in_end - in_next < GZIP_FOOTER_SIZE) - return LIBDEFLATE_BAD_DATA; - } - - /* CRC16 for gzip header */ - if (flg & GZIP_FHCRC) { - in_next += 2; - if (in_end - in_next < GZIP_FOOTER_SIZE) - return LIBDEFLATE_BAD_DATA; - } - - /* Compressed data */ - result = libdeflate_deflate_decompress_ex(d, in_next, - in_end - GZIP_FOOTER_SIZE - in_next, - out, out_nbytes_avail, - &actual_in_nbytes, - actual_out_nbytes_ret); - if (result != LIBDEFLATE_SUCCESS) - return result; - - if (actual_out_nbytes_ret) - actual_out_nbytes = *actual_out_nbytes_ret; - else - actual_out_nbytes = out_nbytes_avail; - - in_next += actual_in_nbytes; - - /* CRC32 */ - if (libdeflate_crc32(0, out, actual_out_nbytes) != - get_unaligned_le32(in_next)) - return LIBDEFLATE_BAD_DATA; - in_next += 4; - - /* ISIZE */ - if ((u32)actual_out_nbytes != get_unaligned_le32(in_next)) - return LIBDEFLATE_BAD_DATA; - in_next += 4; - - if (actual_in_nbytes_ret) - *actual_in_nbytes_ret = in_next - (u8 *)in; - - return LIBDEFLATE_SUCCESS; -} - -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_gzip_decompress(struct libdeflate_decompressor *d, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret) -{ - return libdeflate_gzip_decompress_ex(d, in, in_nbytes, - out, out_nbytes_avail, - NULL, actual_out_nbytes_ret); -} diff --git a/util/compress/libdeflate/lib/hc_matchfinder.h b/util/compress/libdeflate/lib/hc_matchfinder.h deleted file mode 100644 index b81d32c6c9..0000000000 --- a/util/compress/libdeflate/lib/hc_matchfinder.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - * hc_matchfinder.h - Lempel-Ziv matchfinding with a hash table of linked lists - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * --------------------------------------------------------------------------- - * - * Algorithm - * - * This is a Hash Chains (hc) based matchfinder. - * - * The main data structure is a hash table where each hash bucket contains a - * linked list (or "chain") of sequences whose first 4 bytes share the same hash - * code. Each sequence is identified by its starting position in the input - * buffer. - * - * The algorithm processes the input buffer sequentially. At each byte - * position, the hash code of the first 4 bytes of the sequence beginning at - * that position (the sequence being matched against) is computed. This - * identifies the hash bucket to use for that position. Then, this hash - * bucket's linked list is searched for matches. Then, a new linked list node - * is created to represent the current sequence and is prepended to the list. - * - * This algorithm has several useful properties: - * - * - It only finds true Lempel-Ziv matches; i.e., those where the matching - * sequence occurs prior to the sequence being matched against. - * - * - The sequences in each linked list are always sorted by decreasing starting - * position. Therefore, the closest (smallest offset) matches are found - * first, which in many compression formats tend to be the cheapest to encode. - * - * - Although fast running time is not guaranteed due to the possibility of the - * lists getting very long, the worst degenerate behavior can be easily - * prevented by capping the number of nodes searched at each position. - * - * - If the compressor decides not to search for matches at a certain position, - * then that position can be quickly inserted without searching the list. - * - * - The algorithm is adaptable to sliding windows: just store the positions - * relative to a "base" value that is updated from time to time, and stop - * searching each list when the sequences get too far away. - * - * ---------------------------------------------------------------------------- - * - * Optimizations - * - * The main hash table and chains handle length 4+ matches. Length 3 matches - * are handled by a separate hash table with no chains. This works well for - * typical "greedy" or "lazy"-style compressors, where length 3 matches are - * often only helpful if they have small offsets. Instead of searching a full - * chain for length 3+ matches, the algorithm just checks for one close length 3 - * match, then focuses on finding length 4+ matches. - * - * The longest_match() and skip_positions() functions are inlined into the - * compressors that use them. This isn't just about saving the overhead of a - * function call. These functions are intended to be called from the inner - * loops of compressors, where giving the compiler more control over register - * allocation is very helpful. There is also significant benefit to be gained - * from allowing the CPU to predict branches independently at each call site. - * For example, "lazy"-style compressors can be written with two calls to - * longest_match(), each of which starts with a different 'best_len' and - * therefore has significantly different performance characteristics. - * - * Although any hash function can be used, a multiplicative hash is fast and - * works well. - * - * On some processors, it is significantly faster to extend matches by whole - * words (32 or 64 bits) instead of by individual bytes. For this to be the - * case, the processor must implement unaligned memory accesses efficiently and - * must have either a fast "find first set bit" instruction or a fast "find last - * set bit" instruction, depending on the processor's endianness. - * - * The code uses one loop for finding the first match and one loop for finding a - * longer match. Each of these loops is tuned for its respective task and in - * combination are faster than a single generalized loop that handles both - * tasks. - * - * The code also uses a tight inner loop that only compares the last and first - * bytes of a potential match. It is only when these bytes match that a full - * match extension is attempted. - * - * ---------------------------------------------------------------------------- - */ - -#ifndef LIB_HC_MATCHFINDER_H -#define LIB_HC_MATCHFINDER_H - -#include "matchfinder_common.h" - -#define HC_MATCHFINDER_HASH3_ORDER 15 -#define HC_MATCHFINDER_HASH4_ORDER 16 - -#define HC_MATCHFINDER_TOTAL_HASH_SIZE \ - (((1UL << HC_MATCHFINDER_HASH3_ORDER) + \ - (1UL << HC_MATCHFINDER_HASH4_ORDER)) * sizeof(mf_pos_t)) - -struct hc_matchfinder { - - /* The hash table for finding length 3 matches */ - mf_pos_t hash3_tab[1UL << HC_MATCHFINDER_HASH3_ORDER]; - - /* The hash table which contains the first nodes of the linked lists for - * finding length 4+ matches */ - mf_pos_t hash4_tab[1UL << HC_MATCHFINDER_HASH4_ORDER]; - - /* The "next node" references for the linked lists. The "next node" of - * the node for the sequence with position 'pos' is 'next_tab[pos]'. */ - mf_pos_t next_tab[MATCHFINDER_WINDOW_SIZE]; - -} -#ifdef _aligned_attribute - _aligned_attribute(MATCHFINDER_MEM_ALIGNMENT) -#endif -; - -/* Prepare the matchfinder for a new input buffer. */ -static forceinline void -hc_matchfinder_init(struct hc_matchfinder *mf) -{ - STATIC_ASSERT(HC_MATCHFINDER_TOTAL_HASH_SIZE % - MATCHFINDER_SIZE_ALIGNMENT == 0); - - matchfinder_init((mf_pos_t *)mf, HC_MATCHFINDER_TOTAL_HASH_SIZE); -} - -static forceinline void -hc_matchfinder_slide_window(struct hc_matchfinder *mf) -{ - STATIC_ASSERT(sizeof(*mf) % MATCHFINDER_SIZE_ALIGNMENT == 0); - - matchfinder_rebase((mf_pos_t *)mf, sizeof(*mf)); -} - -/* - * Find the longest match longer than 'best_len' bytes. - * - * @mf - * The matchfinder structure. - * @in_base_p - * Location of a pointer which points to the place in the input data the - * matchfinder currently stores positions relative to. This may be updated - * by this function. - * @cur_pos - * The current position in the input buffer relative to @in_base (the - * position of the sequence being matched against). - * @best_len - * Require a match longer than this length. - * @max_len - * The maximum permissible match length at this position. - * @nice_len - * Stop searching if a match of at least this length is found. - * Must be <= @max_len. - * @max_search_depth - * Limit on the number of potential matches to consider. Must be >= 1. - * @next_hashes - * The precomputed hash codes for the sequence beginning at @in_next. - * These will be used and then updated with the precomputed hashcodes for - * the sequence beginning at @in_next + 1. - * @offset_ret - * If a match is found, its offset is returned in this location. - * - * Return the length of the match found, or 'best_len' if no match longer than - * 'best_len' was found. - */ -static forceinline u32 -hc_matchfinder_longest_match(struct hc_matchfinder * const restrict mf, - const u8 ** const restrict in_base_p, - const u8 * const restrict in_next, - u32 best_len, - const u32 max_len, - const u32 nice_len, - const u32 max_search_depth, - u32 * const restrict next_hashes, - u32 * const restrict offset_ret) -{ - u32 depth_remaining = max_search_depth; - const u8 *best_matchptr = in_next; - mf_pos_t cur_node3, cur_node4; - u32 hash3, hash4; - u32 next_hashseq; - u32 seq4; - const u8 *matchptr; - u32 len; - u32 cur_pos = in_next - *in_base_p; - const u8 *in_base; - mf_pos_t cutoff; - - if (cur_pos == MATCHFINDER_WINDOW_SIZE) { - hc_matchfinder_slide_window(mf); - *in_base_p += MATCHFINDER_WINDOW_SIZE; - cur_pos = 0; - } - - in_base = *in_base_p; - cutoff = cur_pos - MATCHFINDER_WINDOW_SIZE; - - if (unlikely(max_len < 5)) /* can we read 4 bytes from 'in_next + 1'? */ - goto out; - - /* Get the precomputed hash codes. */ - hash3 = next_hashes[0]; - hash4 = next_hashes[1]; - - /* From the hash buckets, get the first node of each linked list. */ - cur_node3 = mf->hash3_tab[hash3]; - cur_node4 = mf->hash4_tab[hash4]; - - /* Update for length 3 matches. This replaces the singleton node in the - * 'hash3' bucket with the node for the current sequence. */ - mf->hash3_tab[hash3] = cur_pos; - - /* Update for length 4 matches. This prepends the node for the current - * sequence to the linked list in the 'hash4' bucket. */ - mf->hash4_tab[hash4] = cur_pos; - mf->next_tab[cur_pos] = cur_node4; - - /* Compute the next hash codes. */ - next_hashseq = get_unaligned_le32(in_next + 1); - next_hashes[0] = lz_hash(next_hashseq & 0xFFFFFF, HC_MATCHFINDER_HASH3_ORDER); - next_hashes[1] = lz_hash(next_hashseq, HC_MATCHFINDER_HASH4_ORDER); - prefetchw(&mf->hash3_tab[next_hashes[0]]); - prefetchw(&mf->hash4_tab[next_hashes[1]]); - - if (best_len < 4) { /* No match of length >= 4 found yet? */ - - /* Check for a length 3 match if needed. */ - - if (cur_node3 <= cutoff) - goto out; - - seq4 = load_u32_unaligned(in_next); - - if (best_len < 3) { - matchptr = &in_base[cur_node3]; - if (load_u24_unaligned(matchptr) == loaded_u32_to_u24(seq4)) { - best_len = 3; - best_matchptr = matchptr; - } - } - - /* Check for a length 4 match. */ - - if (cur_node4 <= cutoff) - goto out; - - for (;;) { - /* No length 4 match found yet. Check the first 4 bytes. */ - matchptr = &in_base[cur_node4]; - - if (load_u32_unaligned(matchptr) == seq4) - break; - - /* The first 4 bytes did not match. Keep trying. */ - cur_node4 = mf->next_tab[cur_node4 & (MATCHFINDER_WINDOW_SIZE - 1)]; - if (cur_node4 <= cutoff || !--depth_remaining) - goto out; - } - - /* Found a match of length >= 4. Extend it to its full length. */ - best_matchptr = matchptr; - best_len = lz_extend(in_next, best_matchptr, 4, max_len); - if (best_len >= nice_len) - goto out; - cur_node4 = mf->next_tab[cur_node4 & (MATCHFINDER_WINDOW_SIZE - 1)]; - if (cur_node4 <= cutoff || !--depth_remaining) - goto out; - } else { - if (cur_node4 <= cutoff || best_len >= nice_len) - goto out; - } - - /* Check for matches of length >= 5. */ - - for (;;) { - for (;;) { - matchptr = &in_base[cur_node4]; - - /* Already found a length 4 match. Try for a longer - * match; start by checking either the last 4 bytes and - * the first 4 bytes, or the last byte. (The last byte, - * the one which would extend the match length by 1, is - * the most important.) */ - #if UNALIGNED_ACCESS_IS_FAST - if ((load_u32_unaligned(matchptr + best_len - 3) == - load_u32_unaligned(in_next + best_len - 3)) && - (load_u32_unaligned(matchptr) == - load_u32_unaligned(in_next))) - #else - if (matchptr[best_len] == in_next[best_len]) - #endif - break; - - /* Continue to the next node in the list. */ - cur_node4 = mf->next_tab[cur_node4 & (MATCHFINDER_WINDOW_SIZE - 1)]; - if (cur_node4 <= cutoff || !--depth_remaining) - goto out; - } - - #if UNALIGNED_ACCESS_IS_FAST - len = 4; - #else - len = 0; - #endif - len = lz_extend(in_next, matchptr, len, max_len); - if (len > best_len) { - /* This is the new longest match. */ - best_len = len; - best_matchptr = matchptr; - if (best_len >= nice_len) - goto out; - } - - /* Continue to the next node in the list. */ - cur_node4 = mf->next_tab[cur_node4 & (MATCHFINDER_WINDOW_SIZE - 1)]; - if (cur_node4 <= cutoff || !--depth_remaining) - goto out; - } -out: - *offset_ret = in_next - best_matchptr; - return best_len; -} - -/* - * Advance the matchfinder, but don't search for matches. - * - * @mf - * The matchfinder structure. - * @in_base_p - * Location of a pointer which points to the place in the input data the - * matchfinder currently stores positions relative to. This may be updated - * by this function. - * @cur_pos - * The current position in the input buffer relative to @in_base. - * @end_pos - * The end position of the input buffer, relative to @in_base. - * @next_hashes - * The precomputed hash codes for the sequence beginning at @in_next. - * These will be used and then updated with the precomputed hashcodes for - * the sequence beginning at @in_next + @count. - * @count - * The number of bytes to advance. Must be > 0. - * - * Returns @in_next + @count. - */ -static forceinline const u8 * -hc_matchfinder_skip_positions(struct hc_matchfinder * const restrict mf, - const u8 ** const restrict in_base_p, - const u8 *in_next, - const u8 * const in_end, - const u32 count, - u32 * const restrict next_hashes) -{ - u32 cur_pos; - u32 hash3, hash4; - u32 next_hashseq; - u32 remaining = count; - - if (unlikely(count + 5 > in_end - in_next)) - return &in_next[count]; - - cur_pos = in_next - *in_base_p; - hash3 = next_hashes[0]; - hash4 = next_hashes[1]; - do { - if (cur_pos == MATCHFINDER_WINDOW_SIZE) { - hc_matchfinder_slide_window(mf); - *in_base_p += MATCHFINDER_WINDOW_SIZE; - cur_pos = 0; - } - mf->hash3_tab[hash3] = cur_pos; - mf->next_tab[cur_pos] = mf->hash4_tab[hash4]; - mf->hash4_tab[hash4] = cur_pos; - - next_hashseq = get_unaligned_le32(++in_next); - hash3 = lz_hash(next_hashseq & 0xFFFFFF, HC_MATCHFINDER_HASH3_ORDER); - hash4 = lz_hash(next_hashseq, HC_MATCHFINDER_HASH4_ORDER); - cur_pos++; - } while (--remaining); - - prefetchw(&mf->hash3_tab[hash3]); - prefetchw(&mf->hash4_tab[hash4]); - next_hashes[0] = hash3; - next_hashes[1] = hash4; - - return in_next; -} - -#endif /* LIB_HC_MATCHFINDER_H */ diff --git a/util/compress/libdeflate/lib/lib_common.h b/util/compress/libdeflate/lib/lib_common.h deleted file mode 100644 index 2eea56c729..0000000000 --- a/util/compress/libdeflate/lib/lib_common.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * lib_common.h - internal header included by all library code - */ - -#ifndef LIB_LIB_COMMON_H -#define LIB_LIB_COMMON_H - -#ifdef LIBDEFLATE_H -# error "lib_common.h must always be included before libdeflate.h" - /* because BUILDING_LIBDEFLATE must be set first */ -#endif - -#define BUILDING_LIBDEFLATE - -#include "../common/common_defs.h" - -/* - * Prefix with "_libdeflate_" all global symbols which are not part of the API - * and don't already have a "libdeflate" prefix. This avoids exposing overly - * generic names when libdeflate is built as a static library. - * - * Note that the chosen prefix is not really important and can be changed - * without breaking library users. It was just chosen so that the resulting - * symbol names are unlikely to conflict with those from any other software. - * Also note that this fixup has no useful effect when libdeflate is built as a - * shared library, since these symbols are not exported. - */ -#define SYM_FIXUP(sym) _libdeflate_##sym -#define deflate_get_compression_level SYM_FIXUP(deflate_get_compression_level) -#define _cpu_features SYM_FIXUP(_cpu_features) -#define setup_cpu_features SYM_FIXUP(setup_cpu_features) - -void *libdeflate_malloc(size_t size); -void libdeflate_free(void *ptr); - -void *libdeflate_aligned_malloc(size_t alignment, size_t size); -void libdeflate_aligned_free(void *ptr); - -#ifdef FREESTANDING -/* - * With -ffreestanding, may be missing, and we must provide - * implementations of memset(), memcpy(), memmove(), and memcmp(). - * See https://gcc.gnu.org/onlinedocs/gcc/Standards.html - * - * Also, -ffreestanding disables interpreting calls to these functions as - * built-ins. E.g., calling memcpy(&v, p, WORDBYTES) will make a function call, - * not be optimized to a single load instruction. For performance reasons we - * don't want that. So, declare these functions as macros that expand to the - * corresponding built-ins. This approach is recommended in the gcc man page. - * We still need the actual function definitions in case gcc calls them. - */ -void *memset(void *s, int c, size_t n); -#define memset(s, c, n) __builtin_memset((s), (c), (n)) - -void *memcpy(void *dest, const void *src, size_t n); -#define memcpy(dest, src, n) __builtin_memcpy((dest), (src), (n)) - -void *memmove(void *dest, const void *src, size_t n); -#define memmove(dest, src, n) __builtin_memmove((dest), (src), (n)) - -int memcmp(const void *s1, const void *s2, size_t n); -#define memcmp(s1, s2, n) __builtin_memcmp((s1), (s2), (n)) -#else -#include -#endif - -#endif /* LIB_LIB_COMMON_H */ diff --git a/util/compress/libdeflate/lib/matchfinder_common.h b/util/compress/libdeflate/lib/matchfinder_common.h deleted file mode 100644 index 49ff3343e1..0000000000 --- a/util/compress/libdeflate/lib/matchfinder_common.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * matchfinder_common.h - common code for Lempel-Ziv matchfinding - */ - -#ifndef LIB_MATCHFINDER_COMMON_H -#define LIB_MATCHFINDER_COMMON_H - -#include "lib_common.h" -#include "unaligned.h" - -#ifndef MATCHFINDER_WINDOW_ORDER -# error "MATCHFINDER_WINDOW_ORDER must be defined!" -#endif - -#define MATCHFINDER_WINDOW_SIZE (1UL << MATCHFINDER_WINDOW_ORDER) - -typedef s16 mf_pos_t; - -#define MATCHFINDER_INITVAL ((mf_pos_t)-MATCHFINDER_WINDOW_SIZE) - -/* - * Required alignment of the matchfinder buffer pointer and size. The values - * here come from the AVX-2 implementation, which is the worst case. - */ -#define MATCHFINDER_MEM_ALIGNMENT 32 -#define MATCHFINDER_SIZE_ALIGNMENT 128 - -#undef matchfinder_init -#undef matchfinder_rebase -#ifdef _aligned_attribute -# if defined(__arm__) || defined(__aarch64__) -# include "arm/matchfinder_impl.h" -# elif defined(__i386__) || defined(__x86_64__) -# include "x86/matchfinder_impl.h" -# endif -#endif - -/* - * Initialize the hash table portion of the matchfinder. - * - * Essentially, this is an optimized memset(). - * - * 'data' must be aligned to a MATCHFINDER_MEM_ALIGNMENT boundary, and - * 'size' must be a multiple of MATCHFINDER_SIZE_ALIGNMENT. - */ -#ifndef matchfinder_init -static forceinline void -matchfinder_init(mf_pos_t *data, size_t size) -{ - size_t num_entries = size / sizeof(*data); - size_t i; - - for (i = 0; i < num_entries; i++) - data[i] = MATCHFINDER_INITVAL; -} -#endif - -/* - * Slide the matchfinder by WINDOW_SIZE bytes. - * - * This must be called just after each WINDOW_SIZE bytes have been run through - * the matchfinder. - * - * This will subtract WINDOW_SIZE bytes from each entry in the array specified. - * The effect is that all entries are updated to be relative to the current - * position, rather than the position WINDOW_SIZE bytes prior. - * - * Underflow is detected and replaced with signed saturation. This ensures that - * once the sliding window has passed over a position, that position forever - * remains out of bounds. - * - * The array passed in must contain all matchfinder data that is - * position-relative. Concretely, this will include the hash table as well as - * the table of positions that is used to link together the sequences in each - * hash bucket. Note that in the latter table, the links are 1-ary in the case - * of "hash chains", and 2-ary in the case of "binary trees". In either case, - * the links need to be rebased in the same way. - * - * 'data' must be aligned to a MATCHFINDER_MEM_ALIGNMENT boundary, and - * 'size' must be a multiple of MATCHFINDER_SIZE_ALIGNMENT. - */ -#ifndef matchfinder_rebase -static forceinline void -matchfinder_rebase(mf_pos_t *data, size_t size) -{ - size_t num_entries = size / sizeof(*data); - size_t i; - - if (MATCHFINDER_WINDOW_SIZE == 32768) { - /* Branchless version for 32768 byte windows. If the value was - * already negative, clear all bits except the sign bit; this - * changes the value to -32768. Otherwise, set the sign bit; - * this is equivalent to subtracting 32768. */ - for (i = 0; i < num_entries; i++) { - u16 v = data[i]; - u16 sign_bit = v & 0x8000; - v &= sign_bit - ((sign_bit >> 15) ^ 1); - v |= 0x8000; - data[i] = v; - } - return; - } - - for (i = 0; i < num_entries; i++) { - if (data[i] >= 0) - data[i] -= (mf_pos_t)-MATCHFINDER_WINDOW_SIZE; - else - data[i] = (mf_pos_t)-MATCHFINDER_WINDOW_SIZE; - } -} -#endif - -/* - * The hash function: given a sequence prefix held in the low-order bits of a - * 32-bit value, multiply by a carefully-chosen large constant. Discard any - * bits of the product that don't fit in a 32-bit value, but take the - * next-highest @num_bits bits of the product as the hash value, as those have - * the most randomness. - */ -static forceinline u32 -lz_hash(u32 seq, unsigned num_bits) -{ - return (u32)(seq * 0x1E35A7BD) >> (32 - num_bits); -} - -/* - * Return the number of bytes at @matchptr that match the bytes at @strptr, up - * to a maximum of @max_len. Initially, @start_len bytes are matched. - */ -static forceinline unsigned -lz_extend(const u8 * const strptr, const u8 * const matchptr, - const unsigned start_len, const unsigned max_len) -{ - unsigned len = start_len; - machine_word_t v_word; - - if (UNALIGNED_ACCESS_IS_FAST) { - - if (likely(max_len - len >= 4 * WORDBYTES)) { - - #define COMPARE_WORD_STEP \ - v_word = load_word_unaligned(&matchptr[len]) ^ \ - load_word_unaligned(&strptr[len]); \ - if (v_word != 0) \ - goto word_differs; \ - len += WORDBYTES; \ - - COMPARE_WORD_STEP - COMPARE_WORD_STEP - COMPARE_WORD_STEP - COMPARE_WORD_STEP - #undef COMPARE_WORD_STEP - } - - while (len + WORDBYTES <= max_len) { - v_word = load_word_unaligned(&matchptr[len]) ^ - load_word_unaligned(&strptr[len]); - if (v_word != 0) - goto word_differs; - len += WORDBYTES; - } - } - - while (len < max_len && matchptr[len] == strptr[len]) - len++; - return len; - -word_differs: - if (CPU_IS_LITTLE_ENDIAN()) - len += (bsfw(v_word) >> 3); - else - len += (WORDBITS - 1 - bsrw(v_word)) >> 3; - return len; -} - -#endif /* LIB_MATCHFINDER_COMMON_H */ diff --git a/util/compress/libdeflate/lib/unaligned.h b/util/compress/libdeflate/lib/unaligned.h deleted file mode 100644 index bb48bf8283..0000000000 --- a/util/compress/libdeflate/lib/unaligned.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * unaligned.h - inline functions for unaligned memory accesses - */ - -#ifndef LIB_UNALIGNED_H -#define LIB_UNALIGNED_H - -#include "lib_common.h" - -/***** Unaligned loads and stores without endianness conversion *****/ - -/* - * memcpy() is portable, and it usually gets optimized appropriately by modern - * compilers. I.e., each memcpy() of 1, 2, 4, or WORDBYTES bytes gets compiled - * to a load or store instruction, not to an actual function call. - * - * We no longer use the "packed struct" approach, as that is nonstandard, has - * unclear semantics, and doesn't receive enough testing - * (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94994). - * - * arm32 with __ARM_FEATURE_UNALIGNED in gcc 5 and earlier is a known exception - * where memcpy() generates inefficient code - * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67366). However, we no longer - * consider that one case important enough to maintain different code for. - * If you run into it, please just use a newer version of gcc (or use clang). - */ - -#define DEFINE_UNALIGNED_TYPE(type) \ -static forceinline type \ -load_##type##_unaligned(const void *p) \ -{ \ - type v; \ - memcpy(&v, p, sizeof(v)); \ - return v; \ -} \ - \ -static forceinline void \ -store_##type##_unaligned(type v, void *p) \ -{ \ - memcpy(p, &v, sizeof(v)); \ -} - -DEFINE_UNALIGNED_TYPE(u16) -DEFINE_UNALIGNED_TYPE(u32) -DEFINE_UNALIGNED_TYPE(u64) -DEFINE_UNALIGNED_TYPE(machine_word_t) - -#define load_word_unaligned load_machine_word_t_unaligned -#define store_word_unaligned store_machine_word_t_unaligned - -/***** Unaligned loads with endianness conversion *****/ - -static forceinline u16 -get_unaligned_le16(const u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) - return le16_bswap(load_u16_unaligned(p)); - else - return ((u16)p[1] << 8) | p[0]; -} - -static forceinline u16 -get_unaligned_be16(const u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) - return be16_bswap(load_u16_unaligned(p)); - else - return ((u16)p[0] << 8) | p[1]; -} - -static forceinline u32 -get_unaligned_le32(const u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) - return le32_bswap(load_u32_unaligned(p)); - else - return ((u32)p[3] << 24) | ((u32)p[2] << 16) | - ((u32)p[1] << 8) | p[0]; -} - -static forceinline u32 -get_unaligned_be32(const u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) - return be32_bswap(load_u32_unaligned(p)); - else - return ((u32)p[0] << 24) | ((u32)p[1] << 16) | - ((u32)p[2] << 8) | p[3]; -} - -static forceinline u64 -get_unaligned_le64(const u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) - return le64_bswap(load_u64_unaligned(p)); - else - return ((u64)p[7] << 56) | ((u64)p[6] << 48) | - ((u64)p[5] << 40) | ((u64)p[4] << 32) | - ((u64)p[3] << 24) | ((u64)p[2] << 16) | - ((u64)p[1] << 8) | p[0]; -} - -static forceinline machine_word_t -get_unaligned_leword(const u8 *p) -{ - STATIC_ASSERT(WORDBITS == 32 || WORDBITS == 64); - if (WORDBITS == 32) - return get_unaligned_le32(p); - else - return get_unaligned_le64(p); -} - -/***** Unaligned stores with endianness conversion *****/ - -static forceinline void -put_unaligned_le16(u16 v, u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - store_u16_unaligned(le16_bswap(v), p); - } else { - p[0] = (u8)(v >> 0); - p[1] = (u8)(v >> 8); - } -} - -static forceinline void -put_unaligned_be16(u16 v, u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - store_u16_unaligned(be16_bswap(v), p); - } else { - p[0] = (u8)(v >> 8); - p[1] = (u8)(v >> 0); - } -} - -static forceinline void -put_unaligned_le32(u32 v, u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - store_u32_unaligned(le32_bswap(v), p); - } else { - p[0] = (u8)(v >> 0); - p[1] = (u8)(v >> 8); - p[2] = (u8)(v >> 16); - p[3] = (u8)(v >> 24); - } -} - -static forceinline void -put_unaligned_be32(u32 v, u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - store_u32_unaligned(be32_bswap(v), p); - } else { - p[0] = (u8)(v >> 24); - p[1] = (u8)(v >> 16); - p[2] = (u8)(v >> 8); - p[3] = (u8)(v >> 0); - } -} - -static forceinline void -put_unaligned_le64(u64 v, u8 *p) -{ - if (UNALIGNED_ACCESS_IS_FAST) { - store_u64_unaligned(le64_bswap(v), p); - } else { - p[0] = (u8)(v >> 0); - p[1] = (u8)(v >> 8); - p[2] = (u8)(v >> 16); - p[3] = (u8)(v >> 24); - p[4] = (u8)(v >> 32); - p[5] = (u8)(v >> 40); - p[6] = (u8)(v >> 48); - p[7] = (u8)(v >> 56); - } -} - -static forceinline void -put_unaligned_leword(machine_word_t v, u8 *p) -{ - STATIC_ASSERT(WORDBITS == 32 || WORDBITS == 64); - if (WORDBITS == 32) - put_unaligned_le32(v, p); - else - put_unaligned_le64(v, p); -} - -/***** 24-bit loads *****/ - -/* - * Given a 32-bit value that was loaded with the platform's native endianness, - * return a 32-bit value whose high-order 8 bits are 0 and whose low-order 24 - * bits contain the first 3 bytes, arranged in octets in a platform-dependent - * order, at the memory location from which the input 32-bit value was loaded. - */ -static forceinline u32 -loaded_u32_to_u24(u32 v) -{ - if (CPU_IS_LITTLE_ENDIAN()) - return v & 0xFFFFFF; - else - return v >> 8; -} - -/* - * Load the next 3 bytes from the memory location @p into the 24 low-order bits - * of a 32-bit value. The order in which the 3 bytes will be arranged as octets - * in the 24 bits is platform-dependent. At least LOAD_U24_REQUIRED_NBYTES - * bytes must be available at @p; note that this may be more than 3. - */ -static forceinline u32 -load_u24_unaligned(const u8 *p) -{ -#if UNALIGNED_ACCESS_IS_FAST -# define LOAD_U24_REQUIRED_NBYTES 4 - return loaded_u32_to_u24(load_u32_unaligned(p)); -#else -# define LOAD_U24_REQUIRED_NBYTES 3 - if (CPU_IS_LITTLE_ENDIAN()) - return ((u32)p[0] << 0) | ((u32)p[1] << 8) | ((u32)p[2] << 16); - else - return ((u32)p[2] << 0) | ((u32)p[1] << 8) | ((u32)p[0] << 16); -#endif -} - -#endif /* LIB_UNALIGNED_H */ diff --git a/util/compress/libdeflate/lib/utils.c b/util/compress/libdeflate/lib/utils.c deleted file mode 100644 index c626af1f2a..0000000000 --- a/util/compress/libdeflate/lib/utils.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * utils.c - utility functions for libdeflate - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "lib_common.h" - -#include "libdeflate.h" - -#ifdef FREESTANDING -# define malloc NULL -# define free NULL -#else -# include -#endif - -static void *(*libdeflate_malloc_func)(size_t) = malloc; -static void (*libdeflate_free_func)(void *) = free; - -void * -libdeflate_malloc(size_t size) -{ - return (*libdeflate_malloc_func)(size); -} - -void -libdeflate_free(void *ptr) -{ - (*libdeflate_free_func)(ptr); -} - -void * -libdeflate_aligned_malloc(size_t alignment, size_t size) -{ - void *ptr = libdeflate_malloc(sizeof(void *) + alignment - 1 + size); - if (ptr) { - void *orig_ptr = ptr; - ptr = (void *)ALIGN((uintptr_t)ptr + sizeof(void *), alignment); - ((void **)ptr)[-1] = orig_ptr; - } - return ptr; -} - -void -libdeflate_aligned_free(void *ptr) -{ - if (ptr) - libdeflate_free(((void **)ptr)[-1]); -} - -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_set_memory_allocator(void *(*malloc_func)(size_t), - void (*free_func)(void *)) -{ - libdeflate_malloc_func = malloc_func; - libdeflate_free_func = free_func; -} - -/* - * Implementations of libc functions for freestanding library builds. - * Normal library builds don't use these. Not optimized yet; usually the - * compiler expands these functions and doesn't actually call them anyway. - */ -#ifdef FREESTANDING -#undef memset -void * __attribute__((weak)) -memset(void *s, int c, size_t n) -{ - u8 *p = s; - size_t i; - - for (i = 0; i < n; i++) - p[i] = c; - return s; -} - -#undef memcpy -void * __attribute__((weak)) -memcpy(void *dest, const void *src, size_t n) -{ - u8 *d = dest; - const u8 *s = src; - size_t i; - - for (i = 0; i < n; i++) - d[i] = s[i]; - return dest; -} - -#undef memmove -void * __attribute__((weak)) -memmove(void *dest, const void *src, size_t n) -{ - u8 *d = dest; - const u8 *s = src; - size_t i; - - if (d <= s) - return memcpy(d, s, n); - - for (i = n; i > 0; i--) - d[i - 1] = s[i - 1]; - return dest; -} - -#undef memcmp -int __attribute__((weak)) -memcmp(const void *s1, const void *s2, size_t n) -{ - const u8 *p1 = s1; - const u8 *p2 = s2; - size_t i; - - for (i = 0; i < n; i++) { - if (p1[i] != p2[i]) - return (int)p1[i] - (int)p2[i]; - } - return 0; -} -#endif /* FREESTANDING */ diff --git a/util/compress/libdeflate/lib/x86/adler32_impl.h b/util/compress/libdeflate/lib/x86/adler32_impl.h deleted file mode 100644 index f89bde585c..0000000000 --- a/util/compress/libdeflate/lib/x86/adler32_impl.h +++ /dev/null @@ -1,337 +0,0 @@ -/* - * x86/adler32_impl.h - x86 implementations of Adler-32 checksum algorithm - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_X86_ADLER32_IMPL_H -#define LIB_X86_ADLER32_IMPL_H - -#include "cpu_features.h" - -/* - * The following macros horizontally sum the s1 counters and add them to the - * real s1, and likewise for s2. They do this via a series of reductions, each - * of which halves the vector length, until just one counter remains. - * - * The s1 reductions don't depend on the s2 reductions and vice versa, so for - * efficiency they are interleaved. Also, every other s1 counter is 0 due to - * the 'psadbw' instruction (_mm_sad_epu8) summing groups of 8 bytes rather than - * 4; hence, one of the s1 reductions is skipped when going from 128 => 32 bits. - */ - -#define ADLER32_FINISH_VEC_CHUNK_128(s1, s2, v_s1, v_s2) \ -{ \ - __v4su s1_last = (v_s1), s2_last = (v_s2); \ - \ - /* 128 => 32 bits */ \ - s2_last += (__v4su)_mm_shuffle_epi32((__m128i)s2_last, 0x31); \ - s1_last += (__v4su)_mm_shuffle_epi32((__m128i)s1_last, 0x02); \ - s2_last += (__v4su)_mm_shuffle_epi32((__m128i)s2_last, 0x02); \ - \ - *(s1) += (u32)_mm_cvtsi128_si32((__m128i)s1_last); \ - *(s2) += (u32)_mm_cvtsi128_si32((__m128i)s2_last); \ -} - -#define ADLER32_FINISH_VEC_CHUNK_256(s1, s2, v_s1, v_s2) \ -{ \ - __v4su s1_128bit, s2_128bit; \ - \ - /* 256 => 128 bits */ \ - s1_128bit = (__v4su)_mm256_extracti128_si256((__m256i)(v_s1), 0) + \ - (__v4su)_mm256_extracti128_si256((__m256i)(v_s1), 1); \ - s2_128bit = (__v4su)_mm256_extracti128_si256((__m256i)(v_s2), 0) + \ - (__v4su)_mm256_extracti128_si256((__m256i)(v_s2), 1); \ - \ - ADLER32_FINISH_VEC_CHUNK_128((s1), (s2), s1_128bit, s2_128bit); \ -} - -#define ADLER32_FINISH_VEC_CHUNK_512(s1, s2, v_s1, v_s2) \ -{ \ - __v8su s1_256bit, s2_256bit; \ - \ - /* 512 => 256 bits */ \ - s1_256bit = (__v8su)_mm512_extracti64x4_epi64((__m512i)(v_s1), 0) + \ - (__v8su)_mm512_extracti64x4_epi64((__m512i)(v_s1), 1); \ - s2_256bit = (__v8su)_mm512_extracti64x4_epi64((__m512i)(v_s2), 0) + \ - (__v8su)_mm512_extracti64x4_epi64((__m512i)(v_s2), 1); \ - \ - ADLER32_FINISH_VEC_CHUNK_256((s1), (s2), s1_256bit, s2_256bit); \ -} - -/* AVX-512BW implementation: like the AVX2 one, but does 64 bytes at a time */ -#undef DISPATCH_AVX512BW -#if !defined(DEFAULT_IMPL) && \ - /* - * clang before v3.9 is missing some AVX-512BW intrinsics including - * _mm512_sad_epu8(), a.k.a. __builtin_ia32_psadbw512. So just make using - * AVX-512BW, even when __AVX512BW__ is defined, conditional on - * COMPILER_SUPPORTS_AVX512BW_TARGET where we check for that builtin. - */ \ - COMPILER_SUPPORTS_AVX512BW_TARGET && \ - (defined(__AVX512BW__) || (X86_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_AVX512BW_TARGET_INTRINSICS)) -# define FUNCNAME adler32_avx512bw -# define FUNCNAME_CHUNK adler32_avx512bw_chunk -# define IMPL_ALIGNMENT 64 -# define IMPL_SEGMENT_SIZE 64 -# define IMPL_MAX_CHUNK_SIZE MAX_CHUNK_SIZE -# ifdef __AVX512BW__ -# define ATTRIBUTES -# define DEFAULT_IMPL adler32_avx512bw -# else -# define ATTRIBUTES __attribute__((target("avx512bw"))) -# define DISPATCH 1 -# define DISPATCH_AVX512BW 1 -# endif -# include -static forceinline ATTRIBUTES void -adler32_avx512bw_chunk(const __m512i *p, const __m512i *const end, - u32 *s1, u32 *s2) -{ - const __m512i zeroes = _mm512_setzero_si512(); - const __v64qi multipliers = (__v64qi){ - 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, - 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, - 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, - }; - const __v32hi ones = (__v32hi)_mm512_set1_epi16(1); - __v16si v_s1 = (__v16si)zeroes; - __v16si v_s1_sums = (__v16si)zeroes; - __v16si v_s2 = (__v16si)zeroes; - - do { - /* Load the next 64-byte segment */ - __m512i bytes = *p++; - - /* Multiply the bytes by 64...1 (the number of times they need - * to be added to s2) and add adjacent products */ - __v32hi sums = (__v32hi)_mm512_maddubs_epi16( - bytes, (__m512i)multipliers); - - /* Keep sum of all previous s1 counters, for adding to s2 later. - * This allows delaying the multiplication by 64 to the end. */ - v_s1_sums += v_s1; - - /* Add the sum of each group of 8 bytes to the corresponding s1 - * counter */ - v_s1 += (__v16si)_mm512_sad_epu8(bytes, zeroes); - - /* Add the sum of each group of 4 products of the bytes by - * 64...1 to the corresponding s2 counter */ - v_s2 += (__v16si)_mm512_madd_epi16((__m512i)sums, - (__m512i)ones); - } while (p != end); - - /* Finish the s2 counters by adding the sum of the s1 values at the - * beginning of each segment, multiplied by the segment size (64) */ - v_s2 += (__v16si)_mm512_slli_epi32((__m512i)v_s1_sums, 6); - - /* Add the counters to the real s1 and s2 */ - ADLER32_FINISH_VEC_CHUNK_512(s1, s2, v_s1, v_s2); -} -# include "../adler32_vec_template.h" -#endif /* AVX-512BW implementation */ - -/* AVX2 implementation: like the AVX-512BW one, but does 32 bytes at a time */ -#undef DISPATCH_AVX2 -#if !defined(DEFAULT_IMPL) && \ - (defined(__AVX2__) || (X86_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_AVX2_TARGET_INTRINSICS)) -# define FUNCNAME adler32_avx2 -# define FUNCNAME_CHUNK adler32_avx2_chunk -# define IMPL_ALIGNMENT 32 -# define IMPL_SEGMENT_SIZE 32 -# define IMPL_MAX_CHUNK_SIZE MAX_CHUNK_SIZE -# ifdef __AVX2__ -# define ATTRIBUTES -# define DEFAULT_IMPL adler32_avx2 -# else -# define ATTRIBUTES __attribute__((target("avx2"))) -# define DISPATCH 1 -# define DISPATCH_AVX2 1 -# endif -# include -static forceinline ATTRIBUTES void -adler32_avx2_chunk(const __m256i *p, const __m256i *const end, u32 *s1, u32 *s2) -{ - const __m256i zeroes = _mm256_setzero_si256(); - const __v32qu multipliers = (__v32qu){ - 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, - 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, - }; - const __v16hu ones = (__v16hu)_mm256_set1_epi16(1); - __v8su v_s1 = (__v8su)zeroes; - __v8su v_s1_sums = (__v8su)zeroes; - __v8su v_s2 = (__v8su)zeroes; - - do { - /* Load the next 32-byte segment */ - __m256i bytes = *p++; - - /* Multiply the bytes by 32...1 (the number of times they need - * to be added to s2) and add adjacent products */ - __v16hu sums = (__v16hu)_mm256_maddubs_epi16( - bytes, (__m256i)multipliers); - - /* Keep sum of all previous s1 counters, for adding to s2 later. - * This allows delaying the multiplication by 32 to the end. */ - v_s1_sums += v_s1; - - /* Add the sum of each group of 8 bytes to the corresponding s1 - * counter */ - v_s1 += (__v8su)_mm256_sad_epu8(bytes, zeroes); - - /* Add the sum of each group of 4 products of the bytes by - * 32...1 to the corresponding s2 counter */ - v_s2 += (__v8su)_mm256_madd_epi16((__m256i)sums, (__m256i)ones); - } while (p != end); - - /* Finish the s2 counters by adding the sum of the s1 values at the - * beginning of each segment, multiplied by the segment size (32) */ - v_s2 += (__v8su)_mm256_slli_epi32((__m256i)v_s1_sums, 5); - - /* Add the counters to the real s1 and s2 */ - ADLER32_FINISH_VEC_CHUNK_256(s1, s2, v_s1, v_s2); -} -# include "../adler32_vec_template.h" -#endif /* AVX2 implementation */ - -/* SSE2 implementation */ -#undef DISPATCH_SSE2 -#if !defined(DEFAULT_IMPL) && \ - (defined(__SSE2__) || (X86_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_SSE2_TARGET_INTRINSICS)) -# define FUNCNAME adler32_sse2 -# define FUNCNAME_CHUNK adler32_sse2_chunk -# define IMPL_ALIGNMENT 16 -# define IMPL_SEGMENT_SIZE 32 -/* - * The 16-bit precision byte counters must not be allowed to undergo *signed* - * overflow, otherwise the signed multiplications at the end (_mm_madd_epi16) - * would behave incorrectly. - */ -# define IMPL_MAX_CHUNK_SIZE (32 * (0x7FFF / 0xFF)) -# ifdef __SSE2__ -# define ATTRIBUTES -# define DEFAULT_IMPL adler32_sse2 -# else -# define ATTRIBUTES __attribute__((target("sse2"))) -# define DISPATCH 1 -# define DISPATCH_SSE2 1 -# endif -# include -static forceinline ATTRIBUTES void -adler32_sse2_chunk(const __m128i *p, const __m128i *const end, u32 *s1, u32 *s2) -{ - const __m128i zeroes = _mm_setzero_si128(); - - /* s1 counters: 32-bit, sum of bytes */ - __v4su v_s1 = (__v4su)zeroes; - - /* s2 counters: 32-bit, sum of s1 values */ - __v4su v_s2 = (__v4su)zeroes; - - /* - * Thirty-two 16-bit counters for byte sums. Each accumulates the bytes - * that eventually need to be multiplied by a number 32...1 for addition - * into s2. - */ - __v8hu v_byte_sums_a = (__v8hu)zeroes; - __v8hu v_byte_sums_b = (__v8hu)zeroes; - __v8hu v_byte_sums_c = (__v8hu)zeroes; - __v8hu v_byte_sums_d = (__v8hu)zeroes; - - do { - /* Load the next 32 bytes */ - const __m128i bytes1 = *p++; - const __m128i bytes2 = *p++; - - /* - * Accumulate the previous s1 counters into the s2 counters. - * Logically, this really should be v_s2 += v_s1 * 32, but we - * can do the multiplication (or left shift) later. - */ - v_s2 += v_s1; - - /* - * s1 update: use "Packed Sum of Absolute Differences" to add - * the bytes horizontally with 8 bytes per sum. Then add the - * sums to the s1 counters. - */ - v_s1 += (__v4su)_mm_sad_epu8(bytes1, zeroes); - v_s1 += (__v4su)_mm_sad_epu8(bytes2, zeroes); - - /* - * Also accumulate the bytes into 32 separate counters that have - * 16-bit precision. - */ - v_byte_sums_a += (__v8hu)_mm_unpacklo_epi8(bytes1, zeroes); - v_byte_sums_b += (__v8hu)_mm_unpackhi_epi8(bytes1, zeroes); - v_byte_sums_c += (__v8hu)_mm_unpacklo_epi8(bytes2, zeroes); - v_byte_sums_d += (__v8hu)_mm_unpackhi_epi8(bytes2, zeroes); - - } while (p != end); - - /* Finish calculating the s2 counters */ - v_s2 = (__v4su)_mm_slli_epi32((__m128i)v_s2, 5); - v_s2 += (__v4su)_mm_madd_epi16((__m128i)v_byte_sums_a, - (__m128i)(__v8hu){ 32, 31, 30, 29, 28, 27, 26, 25 }); - v_s2 += (__v4su)_mm_madd_epi16((__m128i)v_byte_sums_b, - (__m128i)(__v8hu){ 24, 23, 22, 21, 20, 19, 18, 17 }); - v_s2 += (__v4su)_mm_madd_epi16((__m128i)v_byte_sums_c, - (__m128i)(__v8hu){ 16, 15, 14, 13, 12, 11, 10, 9 }); - v_s2 += (__v4su)_mm_madd_epi16((__m128i)v_byte_sums_d, - (__m128i)(__v8hu){ 8, 7, 6, 5, 4, 3, 2, 1 }); - - /* Add the counters to the real s1 and s2 */ - ADLER32_FINISH_VEC_CHUNK_128(s1, s2, v_s1, v_s2); -} -# include "../adler32_vec_template.h" -#endif /* SSE2 implementation */ - -#ifdef DISPATCH -static inline adler32_func_t -arch_select_adler32_func(void) -{ - u32 features = get_cpu_features(); - -#ifdef DISPATCH_AVX512BW - if (features & X86_CPU_FEATURE_AVX512BW) - return adler32_avx512bw; -#endif -#ifdef DISPATCH_AVX2 - if (features & X86_CPU_FEATURE_AVX2) - return adler32_avx2; -#endif -#ifdef DISPATCH_SSE2 - if (features & X86_CPU_FEATURE_SSE2) - return adler32_sse2; -#endif - return NULL; -} -#endif /* DISPATCH */ - -#endif /* LIB_X86_ADLER32_IMPL_H */ diff --git a/util/compress/libdeflate/lib/x86/cpu_features.c b/util/compress/libdeflate/lib/x86/cpu_features.c deleted file mode 100644 index e3471d4689..0000000000 --- a/util/compress/libdeflate/lib/x86/cpu_features.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * x86/cpu_features.c - feature detection for x86 processors - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "../cpu_features_common.h" /* must be included first */ -#include "cpu_features.h" - -#if X86_CPU_FEATURES_ENABLED - -volatile u32 _cpu_features = 0; - -/* With old GCC versions we have to manually save and restore the x86_32 PIC - * register (ebx). See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47602 */ -#if defined(__i386__) && defined(__PIC__) -# define EBX_CONSTRAINT "=&r" -#else -# define EBX_CONSTRAINT "=b" -#endif - -/* Execute the CPUID instruction. */ -static inline void -cpuid(u32 leaf, u32 subleaf, u32 *a, u32 *b, u32 *c, u32 *d) -{ - __asm__(".ifnc %%ebx, %1; mov %%ebx, %1; .endif\n" - "cpuid \n" - ".ifnc %%ebx, %1; xchg %%ebx, %1; .endif\n" - : "=a" (*a), EBX_CONSTRAINT (*b), "=c" (*c), "=d" (*d) - : "a" (leaf), "c" (subleaf)); -} - -/* Read an extended control register. */ -static inline u64 -read_xcr(u32 index) -{ - u32 edx, eax; - - /* Execute the "xgetbv" instruction. Old versions of binutils do not - * recognize this instruction, so list the raw bytes instead. */ - __asm__ (".byte 0x0f, 0x01, 0xd0" : "=d" (edx), "=a" (eax) : "c" (index)); - - return ((u64)edx << 32) | eax; -} - -#undef BIT -#define BIT(nr) (1UL << (nr)) - -#define XCR0_BIT_SSE BIT(1) -#define XCR0_BIT_AVX BIT(2) -#define XCR0_BIT_OPMASK BIT(5) -#define XCR0_BIT_ZMM_HI256 BIT(6) -#define XCR0_BIT_HI16_ZMM BIT(7) - -#define IS_SET(reg, nr) ((reg) & BIT(nr)) -#define IS_ALL_SET(reg, mask) (((reg) & (mask)) == (mask)) - -static const struct cpu_feature x86_cpu_feature_table[] = { - {X86_CPU_FEATURE_SSE2, "sse2"}, - {X86_CPU_FEATURE_PCLMUL, "pclmul"}, - {X86_CPU_FEATURE_AVX, "avx"}, - {X86_CPU_FEATURE_AVX2, "avx2"}, - {X86_CPU_FEATURE_BMI2, "bmi2"}, - {X86_CPU_FEATURE_AVX512BW, "avx512bw"}, -}; - -/* Initialize _cpu_features with bits for interesting processor features. */ -void setup_cpu_features(void) -{ - u32 features = 0; - u32 dummy1, dummy2, dummy3, dummy4; - u32 max_function; - u32 features_1, features_2, features_3, features_4; - bool os_avx_support = false; - bool os_avx512_support = false; - - /* Get maximum supported function */ - cpuid(0, 0, &max_function, &dummy2, &dummy3, &dummy4); - if (max_function < 1) - goto out; - - /* Standard feature flags */ - cpuid(1, 0, &dummy1, &dummy2, &features_2, &features_1); - - if (IS_SET(features_1, 26)) - features |= X86_CPU_FEATURE_SSE2; - - if (IS_SET(features_2, 1)) - features |= X86_CPU_FEATURE_PCLMUL; - - if (IS_SET(features_2, 27)) { /* OSXSAVE set? */ - u64 xcr0 = read_xcr(0); - - os_avx_support = IS_ALL_SET(xcr0, - XCR0_BIT_SSE | - XCR0_BIT_AVX); - - os_avx512_support = IS_ALL_SET(xcr0, - XCR0_BIT_SSE | - XCR0_BIT_AVX | - XCR0_BIT_OPMASK | - XCR0_BIT_ZMM_HI256 | - XCR0_BIT_HI16_ZMM); - } - - if (os_avx_support && IS_SET(features_2, 28)) - features |= X86_CPU_FEATURE_AVX; - - if (max_function < 7) - goto out; - - /* Extended feature flags */ - cpuid(7, 0, &dummy1, &features_3, &features_4, &dummy4); - - if (os_avx_support && IS_SET(features_3, 5)) - features |= X86_CPU_FEATURE_AVX2; - - if (IS_SET(features_3, 8)) - features |= X86_CPU_FEATURE_BMI2; - - if (os_avx512_support && IS_SET(features_3, 30)) - features |= X86_CPU_FEATURE_AVX512BW; - -out: - disable_cpu_features_for_testing(&features, x86_cpu_feature_table, - ARRAY_LEN(x86_cpu_feature_table)); - - _cpu_features = features | X86_CPU_FEATURES_KNOWN; -} - -#endif /* X86_CPU_FEATURES_ENABLED */ diff --git a/util/compress/libdeflate/lib/x86/cpu_features.h b/util/compress/libdeflate/lib/x86/cpu_features.h deleted file mode 100644 index 4c023539e4..0000000000 --- a/util/compress/libdeflate/lib/x86/cpu_features.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * x86/cpu_features.h - feature detection for x86 processors - */ - -#ifndef LIB_X86_CPU_FEATURES_H -#define LIB_X86_CPU_FEATURES_H - -#include "../lib_common.h" - -#if (defined(__i386__) || defined(__x86_64__)) && \ - COMPILER_SUPPORTS_TARGET_FUNCTION_ATTRIBUTE -# define X86_CPU_FEATURES_ENABLED 1 -#else -# define X86_CPU_FEATURES_ENABLED 0 -#endif - -#if X86_CPU_FEATURES_ENABLED - -#define X86_CPU_FEATURE_SSE2 0x00000001 -#define X86_CPU_FEATURE_PCLMUL 0x00000002 -#define X86_CPU_FEATURE_AVX 0x00000004 -#define X86_CPU_FEATURE_AVX2 0x00000008 -#define X86_CPU_FEATURE_BMI2 0x00000010 -#define X86_CPU_FEATURE_AVX512BW 0x00000020 - -#define X86_CPU_FEATURES_KNOWN 0x80000000 - -extern volatile u32 _cpu_features; - -void setup_cpu_features(void); - -static inline u32 get_cpu_features(void) -{ - if (_cpu_features == 0) - setup_cpu_features(); - return _cpu_features; -} - -#endif /* X86_CPU_FEATURES_ENABLED */ - -#endif /* LIB_X86_CPU_FEATURES_H */ diff --git a/util/compress/libdeflate/lib/x86/crc32_impl.h b/util/compress/libdeflate/lib/x86/crc32_impl.h deleted file mode 100644 index 14a6867923..0000000000 --- a/util/compress/libdeflate/lib/x86/crc32_impl.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * x86/crc32_impl.h - x86 implementations of CRC-32 checksum algorithm - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_X86_CRC32_IMPL_H -#define LIB_X86_CRC32_IMPL_H - -#include "cpu_features.h" - -/* - * Include the PCLMUL/AVX implementation? Although our PCLMUL-optimized CRC-32 - * function doesn't use any AVX intrinsics specifically, it can benefit a lot - * from being compiled for an AVX target: on Skylake, ~16700 MB/s vs. ~10100 - * MB/s. I expect this is related to the PCLMULQDQ instructions being assembled - * in the newer three-operand form rather than the older two-operand form. - * - * Note: this is only needed if __AVX__ is *not* defined, since otherwise the - * "regular" PCLMUL implementation would already be AVX enabled. - */ -#undef DISPATCH_PCLMUL_AVX -#if !defined(DEFAULT_IMPL) && !defined(__AVX__) && \ - X86_CPU_FEATURES_ENABLED && COMPILER_SUPPORTS_AVX_TARGET && \ - (defined(__PCLMUL__) || COMPILER_SUPPORTS_PCLMUL_TARGET_INTRINSICS) -# define FUNCNAME crc32_pclmul_avx -# define FUNCNAME_ALIGNED crc32_pclmul_avx_aligned -# define ATTRIBUTES __attribute__((target("pclmul,avx"))) -# define DISPATCH 1 -# define DISPATCH_PCLMUL_AVX 1 -# include "crc32_pclmul_template.h" -#endif - -/* PCLMUL implementation */ -#undef DISPATCH_PCLMUL -#if !defined(DEFAULT_IMPL) && \ - (defined(__PCLMUL__) || (X86_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_PCLMUL_TARGET_INTRINSICS)) -# define FUNCNAME crc32_pclmul -# define FUNCNAME_ALIGNED crc32_pclmul_aligned -# ifdef __PCLMUL__ -# define ATTRIBUTES -# define DEFAULT_IMPL crc32_pclmul -# else -# define ATTRIBUTES __attribute__((target("pclmul"))) -# define DISPATCH 1 -# define DISPATCH_PCLMUL 1 -# endif -# include "crc32_pclmul_template.h" -#endif - -#ifdef DISPATCH -static inline crc32_func_t -arch_select_crc32_func(void) -{ - u32 features = get_cpu_features(); - -#ifdef DISPATCH_PCLMUL_AVX - if ((features & X86_CPU_FEATURE_PCLMUL) && - (features & X86_CPU_FEATURE_AVX)) - return crc32_pclmul_avx; -#endif -#ifdef DISPATCH_PCLMUL - if (features & X86_CPU_FEATURE_PCLMUL) - return crc32_pclmul; -#endif - return NULL; -} -#endif /* DISPATCH */ - -#endif /* LIB_X86_CRC32_IMPL_H */ diff --git a/util/compress/libdeflate/lib/x86/crc32_pclmul_template.h b/util/compress/libdeflate/lib/x86/crc32_pclmul_template.h deleted file mode 100644 index a5eda9b876..0000000000 --- a/util/compress/libdeflate/lib/x86/crc32_pclmul_template.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * x86/crc32_pclmul_template.h - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include - -/* - * CRC-32 folding with PCLMULQDQ. - * - * The basic idea is to repeatedly "fold" each 512 bits into the next 512 bits, - * producing an abbreviated message which is congruent the original message - * modulo the generator polynomial G(x). - * - * Folding each 512 bits is implemented as eight 64-bit folds, each of which - * uses one carryless multiplication instruction. It's expected that CPUs may - * be able to execute some of these multiplications in parallel. - * - * Explanation of "folding": let A(x) be 64 bits from the message, and let B(x) - * be 95 bits from a constant distance D later in the message. The relevant - * portion of the message can be written as: - * - * M(x) = A(x)*x^D + B(x) - * - * ... where + and * represent addition and multiplication, respectively, of - * polynomials over GF(2). Note that when implemented on a computer, these - * operations are equivalent to XOR and carryless multiplication, respectively. - * - * For the purpose of CRC calculation, only the remainder modulo the generator - * polynomial G(x) matters: - * - * M(x) mod G(x) = (A(x)*x^D + B(x)) mod G(x) - * - * Since the modulo operation can be applied anywhere in a sequence of additions - * and multiplications without affecting the result, this is equivalent to: - * - * M(x) mod G(x) = (A(x)*(x^D mod G(x)) + B(x)) mod G(x) - * - * For any D, 'x^D mod G(x)' will be a polynomial with maximum degree 31, i.e. - * a 32-bit quantity. So 'A(x) * (x^D mod G(x))' is equivalent to a carryless - * multiplication of a 64-bit quantity by a 32-bit quantity, producing a 95-bit - * product. Then, adding (XOR-ing) the product to B(x) produces a polynomial - * with the same length as B(x) but with the same remainder as 'A(x)*x^D + - * B(x)'. This is the basic fold operation with 64 bits. - * - * Note that the carryless multiplication instruction PCLMULQDQ actually takes - * two 64-bit inputs and produces a 127-bit product in the low-order bits of a - * 128-bit XMM register. This works fine, but care must be taken to account for - * "bit endianness". With the CRC version implemented here, bits are always - * ordered such that the lowest-order bit represents the coefficient of highest - * power of x and the highest-order bit represents the coefficient of the lowest - * power of x. This is backwards from the more intuitive order. Still, - * carryless multiplication works essentially the same either way. It just must - * be accounted for that when we XOR the 95-bit product in the low-order 95 bits - * of a 128-bit XMM register into 128-bits of later data held in another XMM - * register, we'll really be XOR-ing the product into the mathematically higher - * degree end of those later bits, not the lower degree end as may be expected. - * - * So given that caveat and the fact that we process 512 bits per iteration, the - * 'D' values we need for the two 64-bit halves of each 128 bits of data are: - * - * D = (512 + 95) - 64 for the higher-degree half of each 128 bits, - * i.e. the lower order bits in the XMM register - * - * D = (512 + 95) - 128 for the lower-degree half of each 128 bits, - * i.e. the higher order bits in the XMM register - * - * The required 'x^D mod G(x)' values were precomputed. - * - * When <= 512 bits remain in the message, we finish up by folding across - * smaller distances. This works similarly; the distance D is just different, - * so different constant multipliers must be used. Finally, once the remaining - * message is just 64 bits, it is reduced to the CRC-32 using Barrett reduction - * (explained later). - * - * For more information see the original paper from Intel: - * "Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction" - * December 2009 - * http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf - */ -static u32 ATTRIBUTES -FUNCNAME_ALIGNED(u32 remainder, const __m128i *p, size_t nr_segs) -{ - /* Constants precomputed by gen_crc32_multipliers.c. Do not edit! */ - const __v2di multipliers_4 = (__v2di){ 0x8F352D95, 0x1D9513D7 }; - const __v2di multipliers_2 = (__v2di){ 0xF1DA05AA, 0x81256527 }; - const __v2di multipliers_1 = (__v2di){ 0xAE689191, 0xCCAA009E }; - const __v2di final_multiplier = (__v2di){ 0xB8BC6765 }; - const __m128i mask32 = (__m128i)(__v4si){ 0xFFFFFFFF }; - const __v2di barrett_reduction_constants = - (__v2di){ 0x00000001F7011641, 0x00000001DB710641 }; - - const __m128i * const end = p + nr_segs; - const __m128i * const end512 = p + (nr_segs & ~3); - __m128i x0, x1, x2, x3; - - /* - * Account for the current 'remainder', i.e. the CRC of the part of the - * message already processed. Explanation: rewrite the message - * polynomial M(x) in terms of the first part A(x), the second part - * B(x), and the length of the second part in bits |B(x)| >= 32: - * - * M(x) = A(x)*x^|B(x)| + B(x) - * - * Then the CRC of M(x) is: - * - * CRC(M(x)) = CRC(A(x)*x^|B(x)| + B(x)) - * = CRC(A(x)*x^32*x^(|B(x)| - 32) + B(x)) - * = CRC(CRC(A(x))*x^(|B(x)| - 32) + B(x)) - * - * Note: all arithmetic is modulo G(x), the generator polynomial; that's - * why A(x)*x^32 can be replaced with CRC(A(x)) = A(x)*x^32 mod G(x). - * - * So the CRC of the full message is the CRC of the second part of the - * message where the first 32 bits of the second part of the message - * have been XOR'ed with the CRC of the first part of the message. - */ - x0 = *p++; - x0 ^= (__m128i)(__v4si){ remainder }; - - if (p > end512) /* only 128, 256, or 384 bits of input? */ - goto _128_bits_at_a_time; - x1 = *p++; - x2 = *p++; - x3 = *p++; - - /* Fold 512 bits at a time */ - for (; p != end512; p += 4) { - __m128i y0, y1, y2, y3; - - y0 = p[0]; - y1 = p[1]; - y2 = p[2]; - y3 = p[3]; - - /* - * Note: the immediate constant for PCLMULQDQ specifies which - * 64-bit halves of the 128-bit vectors to multiply: - * - * 0x00 means low halves (higher degree polynomial terms for us) - * 0x11 means high halves (lower degree polynomial terms for us) - */ - y0 ^= _mm_clmulepi64_si128(x0, multipliers_4, 0x00); - y1 ^= _mm_clmulepi64_si128(x1, multipliers_4, 0x00); - y2 ^= _mm_clmulepi64_si128(x2, multipliers_4, 0x00); - y3 ^= _mm_clmulepi64_si128(x3, multipliers_4, 0x00); - y0 ^= _mm_clmulepi64_si128(x0, multipliers_4, 0x11); - y1 ^= _mm_clmulepi64_si128(x1, multipliers_4, 0x11); - y2 ^= _mm_clmulepi64_si128(x2, multipliers_4, 0x11); - y3 ^= _mm_clmulepi64_si128(x3, multipliers_4, 0x11); - - x0 = y0; - x1 = y1; - x2 = y2; - x3 = y3; - } - - /* Fold 512 bits => 128 bits */ - x2 ^= _mm_clmulepi64_si128(x0, multipliers_2, 0x00); - x3 ^= _mm_clmulepi64_si128(x1, multipliers_2, 0x00); - x2 ^= _mm_clmulepi64_si128(x0, multipliers_2, 0x11); - x3 ^= _mm_clmulepi64_si128(x1, multipliers_2, 0x11); - x3 ^= _mm_clmulepi64_si128(x2, multipliers_1, 0x00); - x3 ^= _mm_clmulepi64_si128(x2, multipliers_1, 0x11); - x0 = x3; - -_128_bits_at_a_time: - while (p != end) { - /* Fold 128 bits into next 128 bits */ - x1 = *p++; - x1 ^= _mm_clmulepi64_si128(x0, multipliers_1, 0x00); - x1 ^= _mm_clmulepi64_si128(x0, multipliers_1, 0x11); - x0 = x1; - } - - /* Now there are just 128 bits left, stored in 'x0'. */ - - /* - * Fold 128 => 96 bits. This also implicitly appends 32 zero bits, - * which is equivalent to multiplying by x^32. This is needed because - * the CRC is defined as M(x)*x^32 mod G(x), not just M(x) mod G(x). - */ - x0 = _mm_srli_si128(x0, 8) ^ - _mm_clmulepi64_si128(x0, multipliers_1, 0x10); - - /* Fold 96 => 64 bits */ - x0 = _mm_srli_si128(x0, 4) ^ - _mm_clmulepi64_si128(x0 & mask32, final_multiplier, 0x00); - - /* - * Finally, reduce 64 => 32 bits using Barrett reduction. - * - * Let M(x) = A(x)*x^32 + B(x) be the remaining message. The goal is to - * compute R(x) = M(x) mod G(x). Since degree(B(x)) < degree(G(x)): - * - * R(x) = (A(x)*x^32 + B(x)) mod G(x) - * = (A(x)*x^32) mod G(x) + B(x) - * - * Then, by the Division Algorithm there exists a unique q(x) such that: - * - * A(x)*x^32 mod G(x) = A(x)*x^32 - q(x)*G(x) - * - * Since the left-hand side is of maximum degree 31, the right-hand side - * must be too. This implies that we can apply 'mod x^32' to the - * right-hand side without changing its value: - * - * (A(x)*x^32 - q(x)*G(x)) mod x^32 = q(x)*G(x) mod x^32 - * - * Note that '+' is equivalent to '-' in polynomials over GF(2). - * - * We also know that: - * - * / A(x)*x^32 \ - * q(x) = floor ( --------- ) - * \ G(x) / - * - * To compute this efficiently, we can multiply the top and bottom by - * x^32 and move the division by G(x) to the top: - * - * / A(x) * floor(x^64 / G(x)) \ - * q(x) = floor ( ------------------------- ) - * \ x^32 / - * - * Note that floor(x^64 / G(x)) is a constant. - * - * So finally we have: - * - * / A(x) * floor(x^64 / G(x)) \ - * R(x) = B(x) + G(x)*floor ( ------------------------- ) - * \ x^32 / - */ - x1 = x0; - x0 = _mm_clmulepi64_si128(x0 & mask32, barrett_reduction_constants, 0x00); - x0 = _mm_clmulepi64_si128(x0 & mask32, barrett_reduction_constants, 0x10); - return _mm_cvtsi128_si32(_mm_srli_si128(x0 ^ x1, 4)); -} - -#define IMPL_ALIGNMENT 16 -#define IMPL_SEGMENT_SIZE 16 -#include "../crc32_vec_template.h" diff --git a/util/compress/libdeflate/lib/x86/decompress_impl.h b/util/compress/libdeflate/lib/x86/decompress_impl.h deleted file mode 100644 index de6d236314..0000000000 --- a/util/compress/libdeflate/lib/x86/decompress_impl.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef LIB_X86_DECOMPRESS_IMPL_H -#define LIB_X86_DECOMPRESS_IMPL_H - -#include "cpu_features.h" - -/* Include the BMI2-optimized version? */ -#undef DISPATCH_BMI2 -#if !defined(__BMI2__) && X86_CPU_FEATURES_ENABLED && \ - COMPILER_SUPPORTS_BMI2_TARGET -# define FUNCNAME deflate_decompress_bmi2 -# define ATTRIBUTES __attribute__((target("bmi2"))) -# define DISPATCH 1 -# define DISPATCH_BMI2 1 -# include "../decompress_template.h" -#endif - -#ifdef DISPATCH -static inline decompress_func_t -arch_select_decompress_func(void) -{ - u32 features = get_cpu_features(); - -#ifdef DISPATCH_BMI2 - if (features & X86_CPU_FEATURE_BMI2) - return deflate_decompress_bmi2; -#endif - return NULL; -} -#endif /* DISPATCH */ - -#endif /* LIB_X86_DECOMPRESS_IMPL_H */ diff --git a/util/compress/libdeflate/lib/x86/matchfinder_impl.h b/util/compress/libdeflate/lib/x86/matchfinder_impl.h deleted file mode 100644 index 99fbebe8df..0000000000 --- a/util/compress/libdeflate/lib/x86/matchfinder_impl.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * x86/matchfinder_impl.h - x86 implementations of matchfinder functions - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef LIB_X86_MATCHFINDER_IMPL_H -#define LIB_X86_MATCHFINDER_IMPL_H - -#ifdef __AVX2__ -# include -static forceinline void -matchfinder_init_avx2(mf_pos_t *data, size_t size) -{ - __m256i *p = (__m256i *)data; - __m256i v = _mm256_set1_epi16(MATCHFINDER_INITVAL); - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - p[0] = v; - p[1] = v; - p[2] = v; - p[3] = v; - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_init matchfinder_init_avx2 - -static forceinline void -matchfinder_rebase_avx2(mf_pos_t *data, size_t size) -{ - __m256i *p = (__m256i *)data; - __m256i v = _mm256_set1_epi16((u16)-MATCHFINDER_WINDOW_SIZE); - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - /* PADDSW: Add Packed Signed Integers With Signed Saturation */ - p[0] = _mm256_adds_epi16(p[0], v); - p[1] = _mm256_adds_epi16(p[1], v); - p[2] = _mm256_adds_epi16(p[2], v); - p[3] = _mm256_adds_epi16(p[3], v); - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_rebase matchfinder_rebase_avx2 - -#elif defined(__SSE2__) -# include -static forceinline void -matchfinder_init_sse2(mf_pos_t *data, size_t size) -{ - __m128i *p = (__m128i *)data; - __m128i v = _mm_set1_epi16(MATCHFINDER_INITVAL); - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - p[0] = v; - p[1] = v; - p[2] = v; - p[3] = v; - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_init matchfinder_init_sse2 - -static forceinline void -matchfinder_rebase_sse2(mf_pos_t *data, size_t size) -{ - __m128i *p = (__m128i *)data; - __m128i v = _mm_set1_epi16((u16)-MATCHFINDER_WINDOW_SIZE); - - STATIC_ASSERT(MATCHFINDER_MEM_ALIGNMENT % sizeof(*p) == 0); - STATIC_ASSERT(MATCHFINDER_SIZE_ALIGNMENT % (4 * sizeof(*p)) == 0); - STATIC_ASSERT(sizeof(mf_pos_t) == 2); - - do { - /* PADDSW: Add Packed Signed Integers With Signed Saturation */ - p[0] = _mm_adds_epi16(p[0], v); - p[1] = _mm_adds_epi16(p[1], v); - p[2] = _mm_adds_epi16(p[2], v); - p[3] = _mm_adds_epi16(p[3], v); - p += 4; - size -= 4 * sizeof(*p); - } while (size != 0); -} -#define matchfinder_rebase matchfinder_rebase_sse2 -#endif /* __SSE2__ */ - -#endif /* LIB_X86_MATCHFINDER_IMPL_H */ diff --git a/util/compress/libdeflate/lib/zlib_compress.c b/util/compress/libdeflate/lib/zlib_compress.c deleted file mode 100644 index ab0075136c..0000000000 --- a/util/compress/libdeflate/lib/zlib_compress.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * zlib_compress.c - compress with a zlib wrapper - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "deflate_compress.h" -#include "unaligned.h" -#include "zlib_constants.h" - -#include "libdeflate.h" - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_zlib_compress(struct libdeflate_compressor *c, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail) -{ - u8 *out_next = out; - u16 hdr; - unsigned compression_level; - unsigned level_hint; - size_t deflate_size; - - if (out_nbytes_avail <= ZLIB_MIN_OVERHEAD) - return 0; - - /* 2 byte header: CMF and FLG */ - hdr = (ZLIB_CM_DEFLATE << 8) | (ZLIB_CINFO_32K_WINDOW << 12); - compression_level = deflate_get_compression_level(c); - if (compression_level < 2) - level_hint = ZLIB_FASTEST_COMPRESSION; - else if (compression_level < 6) - level_hint = ZLIB_FAST_COMPRESSION; - else if (compression_level < 8) - level_hint = ZLIB_DEFAULT_COMPRESSION; - else - level_hint = ZLIB_SLOWEST_COMPRESSION; - hdr |= level_hint << 6; - hdr |= 31 - (hdr % 31); - - put_unaligned_be16(hdr, out_next); - out_next += 2; - - /* Compressed data */ - deflate_size = libdeflate_deflate_compress(c, in, in_nbytes, out_next, - out_nbytes_avail - ZLIB_MIN_OVERHEAD); - if (deflate_size == 0) - return 0; - out_next += deflate_size; - - /* ADLER32 */ - put_unaligned_be32(libdeflate_adler32(1, in, in_nbytes), out_next); - out_next += 4; - - return out_next - (u8 *)out; -} - -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_zlib_compress_bound(struct libdeflate_compressor *c, - size_t in_nbytes) -{ - return ZLIB_MIN_OVERHEAD + - libdeflate_deflate_compress_bound(c, in_nbytes); -} diff --git a/util/compress/libdeflate/lib/zlib_constants.h b/util/compress/libdeflate/lib/zlib_constants.h deleted file mode 100644 index f304310c73..0000000000 --- a/util/compress/libdeflate/lib/zlib_constants.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * zlib_constants.h - constants for the zlib wrapper format - */ - -#ifndef LIB_ZLIB_CONSTANTS_H -#define LIB_ZLIB_CONSTANTS_H - -#define ZLIB_MIN_HEADER_SIZE 2 -#define ZLIB_FOOTER_SIZE 4 -#define ZLIB_MIN_OVERHEAD (ZLIB_MIN_HEADER_SIZE + ZLIB_FOOTER_SIZE) - -#define ZLIB_CM_DEFLATE 8 - -#define ZLIB_CINFO_32K_WINDOW 7 - -#define ZLIB_FASTEST_COMPRESSION 0 -#define ZLIB_FAST_COMPRESSION 1 -#define ZLIB_DEFAULT_COMPRESSION 2 -#define ZLIB_SLOWEST_COMPRESSION 3 - -#endif /* LIB_ZLIB_CONSTANTS_H */ diff --git a/util/compress/libdeflate/lib/zlib_decompress.c b/util/compress/libdeflate/lib/zlib_decompress.c deleted file mode 100644 index 0f6c714898..0000000000 --- a/util/compress/libdeflate/lib/zlib_decompress.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * zlib_decompress.c - decompress with a zlib wrapper - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "unaligned.h" -#include "zlib_constants.h" - -#include "libdeflate.h" - -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_zlib_decompress_ex(struct libdeflate_decompressor *d, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret) -{ - const u8 *in_next = in; - const u8 * const in_end = in_next + in_nbytes; - u16 hdr; - size_t actual_in_nbytes; - size_t actual_out_nbytes; - enum libdeflate_result result; - - if (in_nbytes < ZLIB_MIN_OVERHEAD) - return LIBDEFLATE_BAD_DATA; - - /* 2 byte header: CMF and FLG */ - hdr = get_unaligned_be16(in_next); - in_next += 2; - - /* FCHECK */ - if ((hdr % 31) != 0) - return LIBDEFLATE_BAD_DATA; - - /* CM */ - if (((hdr >> 8) & 0xF) != ZLIB_CM_DEFLATE) - return LIBDEFLATE_BAD_DATA; - - /* CINFO */ - if ((hdr >> 12) > ZLIB_CINFO_32K_WINDOW) - return LIBDEFLATE_BAD_DATA; - - /* FDICT */ - if ((hdr >> 5) & 1) - return LIBDEFLATE_BAD_DATA; - - /* Compressed data */ - result = libdeflate_deflate_decompress_ex(d, in_next, - in_end - ZLIB_FOOTER_SIZE - in_next, - out, out_nbytes_avail, - &actual_in_nbytes, actual_out_nbytes_ret); - if (result != LIBDEFLATE_SUCCESS) - return result; - - if (actual_out_nbytes_ret) - actual_out_nbytes = *actual_out_nbytes_ret; - else - actual_out_nbytes = out_nbytes_avail; - - in_next += actual_in_nbytes; - - /* ADLER32 */ - if (libdeflate_adler32(1, out, actual_out_nbytes) != - get_unaligned_be32(in_next)) - return LIBDEFLATE_BAD_DATA; - in_next += 4; - - if (actual_in_nbytes_ret) - *actual_in_nbytes_ret = in_next - (u8 *)in; - - return LIBDEFLATE_SUCCESS; -} - -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_zlib_decompress(struct libdeflate_decompressor *d, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret) -{ - return libdeflate_zlib_decompress_ex(d, in, in_nbytes, - out, out_nbytes_avail, - NULL, actual_out_nbytes_ret); -} diff --git a/util/compress/libdeflate/libdeflate.h b/util/compress/libdeflate/libdeflate.h deleted file mode 100644 index cbcda04202..0000000000 --- a/util/compress/libdeflate/libdeflate.h +++ /dev/null @@ -1,366 +0,0 @@ -/* - * libdeflate.h - public header for libdeflate - */ - -#ifndef LIBDEFLATE_H -#define LIBDEFLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define LIBDEFLATE_VERSION_MAJOR 1 -#define LIBDEFLATE_VERSION_MINOR 7 -#define LIBDEFLATE_VERSION_STRING "1.7" - -#include -#include - -/* - * On Windows, if you want to link to the DLL version of libdeflate, then - * #define LIBDEFLATE_DLL. Note that the calling convention is "stdcall". - */ -#ifdef LIBDEFLATE_DLL -# ifdef BUILDING_LIBDEFLATE -# define LIBDEFLATEEXPORT LIBEXPORT -# elif defined(_WIN32) || defined(__CYGWIN__) -# define LIBDEFLATEEXPORT __declspec(dllimport) -# endif -#endif -#ifndef LIBDEFLATEEXPORT -# define LIBDEFLATEEXPORT -#endif - -#if defined(_WIN32) && !defined(_WIN64) -# define LIBDEFLATEAPI_ABI __stdcall -#else -# define LIBDEFLATEAPI_ABI -#endif - -#if defined(BUILDING_LIBDEFLATE) && defined(__GNUC__) && \ - defined(_WIN32) && !defined(_WIN64) - /* - * On 32-bit Windows, gcc assumes 16-byte stack alignment but MSVC only 4. - * Realign the stack when entering libdeflate to avoid crashing in SSE/AVX - * code when called from an MSVC-compiled application. - */ -# define LIBDEFLATEAPI_STACKALIGN __attribute__((force_align_arg_pointer)) -#else -# define LIBDEFLATEAPI_STACKALIGN -#endif - -#define LIBDEFLATEAPI LIBDEFLATEAPI_ABI LIBDEFLATEAPI_STACKALIGN - -/* ========================================================================== */ -/* Compression */ -/* ========================================================================== */ - -struct libdeflate_compressor; - -/* - * libdeflate_alloc_compressor() allocates a new compressor that supports - * DEFLATE, zlib, and gzip compression. 'compression_level' is the compression - * level on a zlib-like scale but with a higher maximum value (1 = fastest, 6 = - * medium/default, 9 = slow, 12 = slowest). Level 0 is also supported and means - * "no compression", specifically "create a valid stream, but only emit - * uncompressed blocks" (this will expand the data slightly). - * - * The return value is a pointer to the new compressor, or NULL if out of memory - * or if the compression level is invalid (i.e. outside the range [0, 12]). - * - * Note: for compression, the sliding window size is defined at compilation time - * to 32768, the largest size permissible in the DEFLATE format. It cannot be - * changed at runtime. - * - * A single compressor is not safe to use by multiple threads concurrently. - * However, different threads may use different compressors concurrently. - */ -LIBDEFLATEEXPORT struct libdeflate_compressor * LIBDEFLATEAPI -libdeflate_alloc_compressor(int compression_level); - -/* - * libdeflate_deflate_compress() performs raw DEFLATE compression on a buffer of - * data. The function attempts to compress 'in_nbytes' bytes of data located at - * 'in' and write the results to 'out', which has space for 'out_nbytes_avail' - * bytes. The return value is the compressed size in bytes, or 0 if the data - * could not be compressed to 'out_nbytes_avail' bytes or fewer. - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_deflate_compress(struct libdeflate_compressor *compressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail); - -/* - * libdeflate_deflate_compress_bound() returns a worst-case upper bound on the - * number of bytes of compressed data that may be produced by compressing any - * buffer of length less than or equal to 'in_nbytes' using - * libdeflate_deflate_compress() with the specified compressor. Mathematically, - * this bound will necessarily be a number greater than or equal to 'in_nbytes'. - * It may be an overestimate of the true upper bound. The return value is - * guaranteed to be the same for all invocations with the same compressor and - * same 'in_nbytes'. - * - * As a special case, 'compressor' may be NULL. This causes the bound to be - * taken across *any* libdeflate_compressor that could ever be allocated with - * this build of the library, with any options. - * - * Note that this function is not necessary in many applications. With - * block-based compression, it is usually preferable to separately store the - * uncompressed size of each block and to store any blocks that did not compress - * to less than their original size uncompressed. In that scenario, there is no - * need to know the worst-case compressed size, since the maximum number of - * bytes of compressed data that may be used would always be one less than the - * input length. You can just pass a buffer of that size to - * libdeflate_deflate_compress() and store the data uncompressed if - * libdeflate_deflate_compress() returns 0, indicating that the compressed data - * did not fit into the provided output buffer. - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_deflate_compress_bound(struct libdeflate_compressor *compressor, - size_t in_nbytes); - -/* - * Like libdeflate_deflate_compress(), but stores the data in the zlib wrapper - * format. - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_zlib_compress(struct libdeflate_compressor *compressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail); - -/* - * Like libdeflate_deflate_compress_bound(), but assumes the data will be - * compressed with libdeflate_zlib_compress() rather than with - * libdeflate_deflate_compress(). - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_zlib_compress_bound(struct libdeflate_compressor *compressor, - size_t in_nbytes); - -/* - * Like libdeflate_deflate_compress(), but stores the data in the gzip wrapper - * format. - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_gzip_compress(struct libdeflate_compressor *compressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail); - -/* - * Like libdeflate_deflate_compress_bound(), but assumes the data will be - * compressed with libdeflate_gzip_compress() rather than with - * libdeflate_deflate_compress(). - */ -LIBDEFLATEEXPORT size_t LIBDEFLATEAPI -libdeflate_gzip_compress_bound(struct libdeflate_compressor *compressor, - size_t in_nbytes); - -/* - * libdeflate_free_compressor() frees a compressor that was allocated with - * libdeflate_alloc_compressor(). If a NULL pointer is passed in, no action is - * taken. - */ -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_free_compressor(struct libdeflate_compressor *compressor); - -/* ========================================================================== */ -/* Decompression */ -/* ========================================================================== */ - -struct libdeflate_decompressor; - -/* - * libdeflate_alloc_decompressor() allocates a new decompressor that can be used - * for DEFLATE, zlib, and gzip decompression. The return value is a pointer to - * the new decompressor, or NULL if out of memory. - * - * This function takes no parameters, and the returned decompressor is valid for - * decompressing data that was compressed at any compression level and with any - * sliding window size. - * - * A single decompressor is not safe to use by multiple threads concurrently. - * However, different threads may use different decompressors concurrently. - */ -LIBDEFLATEEXPORT struct libdeflate_decompressor * LIBDEFLATEAPI -libdeflate_alloc_decompressor(void); - -/* - * Result of a call to libdeflate_deflate_decompress(), - * libdeflate_zlib_decompress(), or libdeflate_gzip_decompress(). - */ -enum libdeflate_result { - /* Decompression was successful. */ - LIBDEFLATE_SUCCESS = 0, - - /* Decompressed failed because the compressed data was invalid, corrupt, - * or otherwise unsupported. */ - LIBDEFLATE_BAD_DATA = 1, - - /* A NULL 'actual_out_nbytes_ret' was provided, but the data would have - * decompressed to fewer than 'out_nbytes_avail' bytes. */ - LIBDEFLATE_SHORT_OUTPUT = 2, - - /* The data would have decompressed to more than 'out_nbytes_avail' - * bytes. */ - LIBDEFLATE_INSUFFICIENT_SPACE = 3, -}; - -/* - * libdeflate_deflate_decompress() decompresses the DEFLATE-compressed stream - * from the buffer 'in' with compressed size up to 'in_nbytes' bytes. The - * uncompressed data is written to 'out', a buffer with size 'out_nbytes_avail' - * bytes. If decompression succeeds, then 0 (LIBDEFLATE_SUCCESS) is returned. - * Otherwise, a nonzero result code such as LIBDEFLATE_BAD_DATA is returned. If - * a nonzero result code is returned, then the contents of the output buffer are - * undefined. - * - * Decompression stops at the end of the DEFLATE stream (as indicated by the - * BFINAL flag), even if it is actually shorter than 'in_nbytes' bytes. - * - * libdeflate_deflate_decompress() can be used in cases where the actual - * uncompressed size is known (recommended) or unknown (not recommended): - * - * - If the actual uncompressed size is known, then pass the actual - * uncompressed size as 'out_nbytes_avail' and pass NULL for - * 'actual_out_nbytes_ret'. This makes libdeflate_deflate_decompress() fail - * with LIBDEFLATE_SHORT_OUTPUT if the data decompressed to fewer than the - * specified number of bytes. - * - * - If the actual uncompressed size is unknown, then provide a non-NULL - * 'actual_out_nbytes_ret' and provide a buffer with some size - * 'out_nbytes_avail' that you think is large enough to hold all the - * uncompressed data. In this case, if the data decompresses to less than - * or equal to 'out_nbytes_avail' bytes, then - * libdeflate_deflate_decompress() will write the actual uncompressed size - * to *actual_out_nbytes_ret and return 0 (LIBDEFLATE_SUCCESS). Otherwise, - * it will return LIBDEFLATE_INSUFFICIENT_SPACE if the provided buffer was - * not large enough but no other problems were encountered, or another - * nonzero result code if decompression failed for another reason. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_deflate_decompress(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret); - -/* - * Like libdeflate_deflate_decompress(), but adds the 'actual_in_nbytes_ret' - * argument. If decompression succeeds and 'actual_in_nbytes_ret' is not NULL, - * then the actual compressed size of the DEFLATE stream (aligned to the next - * byte boundary) is written to *actual_in_nbytes_ret. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_deflate_decompress_ex(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret); - -/* - * Like libdeflate_deflate_decompress(), but assumes the zlib wrapper format - * instead of raw DEFLATE. - * - * Decompression will stop at the end of the zlib stream, even if it is shorter - * than 'in_nbytes'. If you need to know exactly where the zlib stream ended, - * use libdeflate_zlib_decompress_ex(). - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_zlib_decompress(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret); - -/* - * Like libdeflate_zlib_decompress(), but adds the 'actual_in_nbytes_ret' - * argument. If 'actual_in_nbytes_ret' is not NULL and the decompression - * succeeds (indicating that the first zlib-compressed stream in the input - * buffer was decompressed), then the actual number of input bytes consumed is - * written to *actual_in_nbytes_ret. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_zlib_decompress_ex(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret); - -/* - * Like libdeflate_deflate_decompress(), but assumes the gzip wrapper format - * instead of raw DEFLATE. - * - * If multiple gzip-compressed members are concatenated, then only the first - * will be decompressed. Use libdeflate_gzip_decompress_ex() if you need - * multi-member support. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_gzip_decompress(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret); - -/* - * Like libdeflate_gzip_decompress(), but adds the 'actual_in_nbytes_ret' - * argument. If 'actual_in_nbytes_ret' is not NULL and the decompression - * succeeds (indicating that the first gzip-compressed member in the input - * buffer was decompressed), then the actual number of input bytes consumed is - * written to *actual_in_nbytes_ret. - */ -LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI -libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret); - -/* - * libdeflate_free_decompressor() frees a decompressor that was allocated with - * libdeflate_alloc_decompressor(). If a NULL pointer is passed in, no action - * is taken. - */ -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_free_decompressor(struct libdeflate_decompressor *decompressor); - -/* ========================================================================== */ -/* Checksums */ -/* ========================================================================== */ - -/* - * libdeflate_adler32() updates a running Adler-32 checksum with 'len' bytes of - * data and returns the updated checksum. When starting a new checksum, the - * required initial value for 'adler' is 1. This value is also returned when - * 'buffer' is specified as NULL. - */ -LIBDEFLATEEXPORT uint32_t LIBDEFLATEAPI -libdeflate_adler32(uint32_t adler, const void *buffer, size_t len); - - -/* - * libdeflate_crc32() updates a running CRC-32 checksum with 'len' bytes of data - * and returns the updated checksum. When starting a new checksum, the required - * initial value for 'crc' is 0. This value is also returned when 'buffer' is - * specified as NULL. - */ -LIBDEFLATEEXPORT uint32_t LIBDEFLATEAPI -libdeflate_crc32(uint32_t crc, const void *buffer, size_t len); - -/* ========================================================================== */ -/* Custom memory allocator */ -/* ========================================================================== */ - -/* - * Install a custom memory allocator which libdeflate will use for all memory - * allocations. 'malloc_func' is a function that must behave like malloc(), and - * 'free_func' is a function that must behave like free(). - * - * There must not be any libdeflate_compressor or libdeflate_decompressor - * structures in existence when calling this function. - */ -LIBDEFLATEEXPORT void LIBDEFLATEAPI -libdeflate_set_memory_allocator(void *(*malloc_func)(size_t), - void (*free_func)(void *)); - -#ifdef __cplusplus -} -#endif - -#endif /* LIBDEFLATE_H */ diff --git a/util/compress/libdeflate/programs/benchmark.c b/util/compress/libdeflate/programs/benchmark.c deleted file mode 100644 index 52af8dafc8..0000000000 --- a/util/compress/libdeflate/programs/benchmark.c +++ /dev/null @@ -1,696 +0,0 @@ -/* - * benchmark.c - a compression testing and benchmark program - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "test_util.h" - -static const tchar *const optstring = T("0::1::2::3::4::5::6::7::8::9::C:D:eghs:VYZz"); - -enum format { - DEFLATE_FORMAT, - ZLIB_FORMAT, - GZIP_FORMAT, -}; - -struct compressor { - int level; - enum format format; - const struct engine *engine; - void *private; -}; - -struct decompressor { - enum format format; - const struct engine *engine; - void *private; -}; - -struct engine { - const tchar *name; - - bool (*init_compressor)(struct compressor *); - size_t (*compress_bound)(struct compressor *, size_t); - size_t (*compress)(struct compressor *, const void *, size_t, - void *, size_t); - void (*destroy_compressor)(struct compressor *); - - bool (*init_decompressor)(struct decompressor *); - bool (*decompress)(struct decompressor *, const void *, size_t, - void *, size_t); - void (*destroy_decompressor)(struct decompressor *); -}; - -/******************************************************************************/ - -static bool -libdeflate_engine_init_compressor(struct compressor *c) -{ - c->private = alloc_compressor(c->level); - return c->private != NULL; -} - -static size_t -libdeflate_engine_compress_bound(struct compressor *c, size_t in_nbytes) -{ - switch (c->format) { - case ZLIB_FORMAT: - return libdeflate_zlib_compress_bound(c->private, in_nbytes); - case GZIP_FORMAT: - return libdeflate_gzip_compress_bound(c->private, in_nbytes); - default: - return libdeflate_deflate_compress_bound(c->private, in_nbytes); - } -} - -static size_t -libdeflate_engine_compress(struct compressor *c, const void *in, - size_t in_nbytes, void *out, size_t out_nbytes_avail) -{ - switch (c->format) { - case ZLIB_FORMAT: - return libdeflate_zlib_compress(c->private, in, in_nbytes, - out, out_nbytes_avail); - case GZIP_FORMAT: - return libdeflate_gzip_compress(c->private, in, in_nbytes, - out, out_nbytes_avail); - default: - return libdeflate_deflate_compress(c->private, in, in_nbytes, - out, out_nbytes_avail); - } -} - -static void -libdeflate_engine_destroy_compressor(struct compressor *c) -{ - libdeflate_free_compressor(c->private); -} - -static bool -libdeflate_engine_init_decompressor(struct decompressor *d) -{ - d->private = alloc_decompressor(); - return d->private != NULL; -} - -static bool -libdeflate_engine_decompress(struct decompressor *d, const void *in, - size_t in_nbytes, void *out, size_t out_nbytes) -{ - switch (d->format) { - case ZLIB_FORMAT: - return !libdeflate_zlib_decompress(d->private, in, in_nbytes, - out, out_nbytes, NULL); - case GZIP_FORMAT: - return !libdeflate_gzip_decompress(d->private, in, in_nbytes, - out, out_nbytes, NULL); - default: - return !libdeflate_deflate_decompress(d->private, in, in_nbytes, - out, out_nbytes, NULL); - } -} - -static void -libdeflate_engine_destroy_decompressor(struct decompressor *d) -{ - libdeflate_free_decompressor(d->private); -} - -static const struct engine libdeflate_engine = { - .name = T("libdeflate"), - - .init_compressor = libdeflate_engine_init_compressor, - .compress_bound = libdeflate_engine_compress_bound, - .compress = libdeflate_engine_compress, - .destroy_compressor = libdeflate_engine_destroy_compressor, - - .init_decompressor = libdeflate_engine_init_decompressor, - .decompress = libdeflate_engine_decompress, - .destroy_decompressor = libdeflate_engine_destroy_decompressor, -}; - -/******************************************************************************/ - -static int -get_libz_window_bits(enum format format) -{ - const int windowBits = 15; - switch (format) { - case ZLIB_FORMAT: - return windowBits; - case GZIP_FORMAT: - return windowBits + 16; - default: - return -windowBits; - } -} - -static bool -libz_engine_init_compressor(struct compressor *c) -{ - z_stream *z; - - if (c->level > 9) { - msg("libz only supports up to compression level 9"); - return false; - } - - z = xmalloc(sizeof(*z)); - if (z == NULL) - return false; - - z->next_in = NULL; - z->avail_in = 0; - z->zalloc = NULL; - z->zfree = NULL; - z->opaque = NULL; - if (deflateInit2(z, c->level, Z_DEFLATED, - get_libz_window_bits(c->format), - 8, Z_DEFAULT_STRATEGY) != Z_OK) - { - msg("unable to initialize deflater"); - free(z); - return false; - } - - c->private = z; - return true; -} - -static size_t -libz_engine_compress_bound(struct compressor *c, size_t in_nbytes) -{ - return deflateBound(c->private, in_nbytes); -} - -static size_t -libz_engine_compress(struct compressor *c, const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail) -{ - z_stream *z = c->private; - - deflateReset(z); - - z->next_in = (void *)in; - z->avail_in = in_nbytes; - z->next_out = out; - z->avail_out = out_nbytes_avail; - - if (deflate(z, Z_FINISH) != Z_STREAM_END) - return 0; - - return out_nbytes_avail - z->avail_out; -} - -static void -libz_engine_destroy_compressor(struct compressor *c) -{ - z_stream *z = c->private; - - deflateEnd(z); - free(z); -} - -static bool -libz_engine_init_decompressor(struct decompressor *d) -{ - z_stream *z; - - z = xmalloc(sizeof(*z)); - if (z == NULL) - return false; - - z->next_in = NULL; - z->avail_in = 0; - z->zalloc = NULL; - z->zfree = NULL; - z->opaque = NULL; - if (inflateInit2(z, get_libz_window_bits(d->format)) != Z_OK) { - msg("unable to initialize inflater"); - free(z); - return false; - } - - d->private = z; - return true; -} - -static bool -libz_engine_decompress(struct decompressor *d, const void *in, size_t in_nbytes, - void *out, size_t out_nbytes) -{ - z_stream *z = d->private; - - inflateReset(z); - - z->next_in = (void *)in; - z->avail_in = in_nbytes; - z->next_out = out; - z->avail_out = out_nbytes; - - return inflate(z, Z_FINISH) == Z_STREAM_END && z->avail_out == 0; -} - -static void -libz_engine_destroy_decompressor(struct decompressor *d) -{ - z_stream *z = d->private; - - inflateEnd(z); - free(z); -} - -static const struct engine libz_engine = { - .name = T("libz"), - - .init_compressor = libz_engine_init_compressor, - .compress_bound = libz_engine_compress_bound, - .compress = libz_engine_compress, - .destroy_compressor = libz_engine_destroy_compressor, - - .init_decompressor = libz_engine_init_decompressor, - .decompress = libz_engine_decompress, - .destroy_decompressor = libz_engine_destroy_decompressor, -}; - -/******************************************************************************/ - -static const struct engine * const all_engines[] = { - &libdeflate_engine, - &libz_engine, -}; - -#define DEFAULT_ENGINE libdeflate_engine - -static const struct engine * -name_to_engine(const tchar *name) -{ - size_t i; - - for (i = 0; i < ARRAY_LEN(all_engines); i++) - if (tstrcmp(all_engines[i]->name, name) == 0) - return all_engines[i]; - return NULL; -} - -/******************************************************************************/ - -static bool -compressor_init(struct compressor *c, int level, enum format format, - const struct engine *engine) -{ - c->level = level; - c->format = format; - c->engine = engine; - return engine->init_compressor(c); -} - -static size_t -compress_bound(struct compressor *c, size_t in_nbytes) -{ - return c->engine->compress_bound(c, in_nbytes); -} - -static size_t -do_compress(struct compressor *c, const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail) -{ - return c->engine->compress(c, in, in_nbytes, out, out_nbytes_avail); -} - -static void -compressor_destroy(struct compressor *c) -{ - if (c->engine != NULL) - c->engine->destroy_compressor(c); -} - -static bool -decompressor_init(struct decompressor *d, enum format format, - const struct engine *engine) -{ - d->format = format; - d->engine = engine; - return engine->init_decompressor(d); -} - -static bool -do_decompress(struct decompressor *d, const void *in, size_t in_nbytes, - void *out, size_t out_nbytes) -{ - return d->engine->decompress(d, in, in_nbytes, out, out_nbytes); -} - -static void -decompressor_destroy(struct decompressor *d) -{ - if (d->engine != NULL) - d->engine->destroy_decompressor(d); -} - -/******************************************************************************/ - -static void -show_available_engines(FILE *fp) -{ - size_t i; - - fprintf(fp, "Available ENGINEs are: "); - for (i = 0; i < ARRAY_LEN(all_engines); i++) { - fprintf(fp, "%"TS, all_engines[i]->name); - if (i < ARRAY_LEN(all_engines) - 1) - fprintf(fp, ", "); - } - fprintf(fp, ". Default is %"TS"\n", DEFAULT_ENGINE.name); -} - -static void -show_usage(FILE *fp) -{ - fprintf(fp, -"Usage: %"TS" [-LVL] [-C ENGINE] [-D ENGINE] [-ghVz] [-s SIZE] [FILE]...\n" -"Benchmark DEFLATE compression and decompression on the specified FILEs.\n" -"\n" -"Options:\n" -" -0 no compression\n" -" -1 fastest (worst) compression\n" -" -6 medium compression (default)\n" -" -12 slowest (best) compression\n" -" -C ENGINE compression engine\n" -" -D ENGINE decompression engine\n" -" -e allow chunks to be expanded (implied by -0)\n" -" -g use gzip format instead of raw DEFLATE\n" -" -h print this help\n" -" -s SIZE chunk size\n" -" -V show version and legal information\n" -" -z use zlib format instead of raw DEFLATE\n" -"\n", prog_invocation_name); - - show_available_engines(fp); -} - -static void -show_version(void) -{ - printf( -"libdeflate compression benchmark program v" LIBDEFLATE_VERSION_STRING "\n" -"Copyright 2016 Eric Biggers\n" -"\n" -"This program is free software which may be modified and/or redistributed\n" -"under the terms of the MIT license. There is NO WARRANTY, to the extent\n" -"permitted by law. See the COPYING file for details.\n" - ); -} - - -/******************************************************************************/ - -static int -do_benchmark(struct file_stream *in, void *original_buf, void *compressed_buf, - void *decompressed_buf, u32 chunk_size, - bool allow_expansion, size_t compressed_buf_size, - struct compressor *compressor, - struct decompressor *decompressor) -{ - u64 total_uncompressed_size = 0; - u64 total_compressed_size = 0; - u64 total_compress_time = 0; - u64 total_decompress_time = 0; - ssize_t ret; - - while ((ret = xread(in, original_buf, chunk_size)) > 0) { - u32 original_size = ret; - size_t out_nbytes_avail; - u32 compressed_size; - u64 start_time; - bool ok; - - total_uncompressed_size += original_size; - - if (allow_expansion) { - out_nbytes_avail = compress_bound(compressor, - original_size); - if (out_nbytes_avail > compressed_buf_size) { - msg("%"TS": bug in compress_bound()", in->name); - return -1; - } - } else { - out_nbytes_avail = original_size - 1; - } - - /* Compress the chunk of data. */ - start_time = timer_ticks(); - compressed_size = do_compress(compressor, - original_buf, - original_size, - compressed_buf, - out_nbytes_avail); - total_compress_time += timer_ticks() - start_time; - - if (compressed_size) { - /* Successfully compressed the chunk of data. */ - - /* Decompress the data we just compressed and compare - * the result with the original. */ - start_time = timer_ticks(); - ok = do_decompress(decompressor, - compressed_buf, compressed_size, - decompressed_buf, original_size); - total_decompress_time += timer_ticks() - start_time; - - if (!ok) { - msg("%"TS": failed to decompress data", - in->name); - return -1; - } - - if (memcmp(original_buf, decompressed_buf, - original_size) != 0) - { - msg("%"TS": data did not decompress to " - "original", in->name); - return -1; - } - - total_compressed_size += compressed_size; - } else { - /* - * The chunk would have compressed to more than - * out_nbytes_avail bytes. - */ - if (allow_expansion) { - msg("%"TS": bug in compress_bound()", in->name); - return -1; - } - total_compressed_size += original_size; - } - } - - if (ret < 0) - return ret; - - if (total_uncompressed_size == 0) { - printf("\tFile was empty.\n"); - return 0; - } - - if (total_compress_time == 0) - total_compress_time = 1; - if (total_decompress_time == 0) - total_decompress_time = 1; - - printf("\tCompressed %"PRIu64 " => %"PRIu64" bytes (%u.%03u%%)\n", - total_uncompressed_size, total_compressed_size, - (unsigned int)(total_compressed_size * 100 / - total_uncompressed_size), - (unsigned int)(total_compressed_size * 100000 / - total_uncompressed_size % 1000)); - printf("\tCompression time: %"PRIu64" ms (%"PRIu64" MB/s)\n", - timer_ticks_to_ms(total_compress_time), - timer_MB_per_s(total_uncompressed_size, total_compress_time)); - printf("\tDecompression time: %"PRIu64" ms (%"PRIu64" MB/s)\n", - timer_ticks_to_ms(total_decompress_time), - timer_MB_per_s(total_uncompressed_size, total_decompress_time)); - - return 0; -} - -int -tmain(int argc, tchar *argv[]) -{ - u32 chunk_size = 1048576; - int level = 6; - enum format format = DEFLATE_FORMAT; - const struct engine *compress_engine = &DEFAULT_ENGINE; - const struct engine *decompress_engine = &DEFAULT_ENGINE; - bool allow_expansion = false; - struct compressor compressor = { 0 }; - struct decompressor decompressor = { 0 }; - size_t compressed_buf_size; - void *original_buf = NULL; - void *compressed_buf = NULL; - void *decompressed_buf = NULL; - tchar *default_file_list[] = { NULL }; - int opt_char; - int i; - int ret; - - begin_program(argv); - - while ((opt_char = tgetopt(argc, argv, optstring)) != -1) { - switch (opt_char) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - level = parse_compression_level(opt_char, toptarg); - if (level < 0) - return 1; - break; - case 'C': - compress_engine = name_to_engine(toptarg); - if (compress_engine == NULL) { - msg("invalid compression engine: \"%"TS"\"", toptarg); - show_available_engines(stderr); - return 1; - } - break; - case 'D': - decompress_engine = name_to_engine(toptarg); - if (decompress_engine == NULL) { - msg("invalid decompression engine: \"%"TS"\"", toptarg); - show_available_engines(stderr); - return 1; - } - break; - case 'e': - allow_expansion = true; - break; - case 'g': - format = GZIP_FORMAT; - break; - case 'h': - show_usage(stdout); - return 0; - case 's': - chunk_size = tstrtoul(toptarg, NULL, 10); - if (chunk_size == 0) { - msg("invalid chunk size: \"%"TS"\"", toptarg); - return 1; - } - break; - case 'V': - show_version(); - return 0; - case 'Y': /* deprecated, use '-C libz' instead */ - compress_engine = &libz_engine; - break; - case 'Z': /* deprecated, use '-D libz' instead */ - decompress_engine = &libz_engine; - break; - case 'z': - format = ZLIB_FORMAT; - break; - default: - show_usage(stderr); - return 1; - } - } - - argc -= toptind; - argv += toptind; - - if (level == 0) - allow_expansion = true; - - ret = -1; - if (!compressor_init(&compressor, level, format, compress_engine)) - goto out; - if (!decompressor_init(&decompressor, format, decompress_engine)) - goto out; - - if (allow_expansion) - compressed_buf_size = compress_bound(&compressor, chunk_size); - else - compressed_buf_size = chunk_size - 1; - - original_buf = xmalloc(chunk_size); - compressed_buf = xmalloc(compressed_buf_size); - decompressed_buf = xmalloc(chunk_size); - - ret = -1; - if (original_buf == NULL || compressed_buf == NULL || - decompressed_buf == NULL) - goto out; - - if (argc == 0) { - argv = default_file_list; - argc = ARRAY_LEN(default_file_list); - } else { - for (i = 0; i < argc; i++) - if (argv[i][0] == '-' && argv[i][1] == '\0') - argv[i] = NULL; - } - - printf("Benchmarking %s compression:\n", - format == DEFLATE_FORMAT ? "DEFLATE" : - format == ZLIB_FORMAT ? "zlib" : "gzip"); - printf("\tCompression level: %d\n", level); - printf("\tChunk size: %"PRIu32"\n", chunk_size); - printf("\tCompression engine: %"TS"\n", compress_engine->name); - printf("\tDecompression engine: %"TS"\n", decompress_engine->name); - - for (i = 0; i < argc; i++) { - struct file_stream in; - - ret = xopen_for_read(argv[i], true, &in); - if (ret != 0) - goto out; - - printf("Processing %"TS"...\n", in.name); - - ret = do_benchmark(&in, original_buf, compressed_buf, - decompressed_buf, chunk_size, - allow_expansion, compressed_buf_size, - &compressor, &decompressor); - xclose(&in); - if (ret != 0) - goto out; - } - ret = 0; -out: - free(decompressed_buf); - free(compressed_buf); - free(original_buf); - decompressor_destroy(&decompressor); - compressor_destroy(&compressor); - return -ret; -} diff --git a/util/compress/libdeflate/programs/checksum.c b/util/compress/libdeflate/programs/checksum.c deleted file mode 100644 index 0d394723be..0000000000 --- a/util/compress/libdeflate/programs/checksum.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * checksum.c - Adler-32 and CRC-32 checksumming program - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "test_util.h" - -static const tchar *const optstring = T("Ahs:tZ"); - -static void -show_usage(FILE *fp) -{ - fprintf(fp, -"Usage: %"TS" [-A] [-h] [-s SIZE] [-t] [-Z] [FILE]...\n" -"Calculate Adler-32 or CRC-32 checksums of the specified FILEs.\n" -"\n" -"Options:\n" -" -A use Adler-32 (default is CRC-32)\n" -" -h print this help\n" -" -s SIZE chunk size\n" -" -t show checksum speed, excluding I/O\n" -" -Z use zlib implementation instead of libdeflate\n", - prog_invocation_name); -} - -typedef u32 (*cksum_fn_t)(u32, const void *, size_t); - -static u32 -adler32_libdeflate(u32 adler, const void *buf, size_t len) -{ - return libdeflate_adler32(adler, buf, len); -} - -static u32 -crc32_libdeflate(u32 crc, const void *buf, size_t len) -{ - return libdeflate_crc32(crc, buf, len); -} - -static u32 -adler32_zlib(u32 adler, const void *buf, size_t len) -{ - return adler32(adler, buf, len); -} - -static u32 -crc32_zlib(u32 crc, const void *buf, size_t len) -{ - return crc32(crc, buf, len); -} - -static int -checksum_stream(struct file_stream *in, cksum_fn_t cksum, u32 *sum, - void *buf, size_t bufsize, u64 *size_ret, u64 *elapsed_ret) -{ - u64 size = 0; - u64 elapsed = 0; - - for (;;) { - ssize_t ret; - u64 start_time; - - ret = xread(in, buf, bufsize); - if (ret < 0) - return ret; - if (ret == 0) - break; - - size += ret; - start_time = timer_ticks(); - *sum = cksum(*sum, buf, ret); - elapsed += timer_ticks() - start_time; - } - - if (elapsed == 0) - elapsed = 1; - *size_ret = size; - *elapsed_ret = elapsed; - return 0; -} - -int -tmain(int argc, tchar *argv[]) -{ - bool use_adler32 = false; - bool use_zlib_impl = false; - bool do_timing = false; - void *buf; - size_t bufsize = 131072; - tchar *default_file_list[] = { NULL }; - cksum_fn_t cksum; - int opt_char; - int i; - int ret; - - begin_program(argv); - - while ((opt_char = tgetopt(argc, argv, optstring)) != -1) { - switch (opt_char) { - case 'A': - use_adler32 = true; - break; - case 'h': - show_usage(stdout); - return 0; - case 's': - bufsize = tstrtoul(toptarg, NULL, 10); - if (bufsize == 0) { - msg("invalid chunk size: \"%"TS"\"", toptarg); - return 1; - } - break; - case 't': - do_timing = true; - break; - case 'Z': - use_zlib_impl = true; - break; - default: - show_usage(stderr); - return 1; - } - } - - argc -= toptind; - argv += toptind; - - if (use_adler32) { - if (use_zlib_impl) - cksum = adler32_zlib; - else - cksum = adler32_libdeflate; - } else { - if (use_zlib_impl) - cksum = crc32_zlib; - else - cksum = crc32_libdeflate; - } - - buf = xmalloc(bufsize); - if (buf == NULL) - return 1; - - if (argc == 0) { - argv = default_file_list; - argc = ARRAY_LEN(default_file_list); - } else { - for (i = 0; i < argc; i++) - if (argv[i][0] == '-' && argv[i][1] == '\0') - argv[i] = NULL; - } - - for (i = 0; i < argc; i++) { - struct file_stream in; - u32 sum = cksum(0, NULL, 0); - u64 size = 0; - u64 elapsed = 0; - - ret = xopen_for_read(argv[i], true, &in); - if (ret != 0) - goto out; - - ret = checksum_stream(&in, cksum, &sum, buf, bufsize, - &size, &elapsed); - if (ret == 0) { - if (do_timing) { - printf("%08"PRIx32"\t%"TS"\t" - "%"PRIu64" ms\t%"PRIu64" MB/s\n", - sum, in.name, timer_ticks_to_ms(elapsed), - timer_MB_per_s(size, elapsed)); - } else { - printf("%08"PRIx32"\t%"TS"\t\n", sum, in.name); - } - } - - xclose(&in); - - if (ret != 0) - goto out; - } - ret = 0; -out: - free(buf); - return -ret; -} diff --git a/util/compress/libdeflate/programs/gzip.c b/util/compress/libdeflate/programs/gzip.c deleted file mode 100644 index a1d6d2a0de..0000000000 --- a/util/compress/libdeflate/programs/gzip.c +++ /dev/null @@ -1,658 +0,0 @@ -/* - * gzip.c - a file compression and decompression program - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "prog_util.h" - -#include -#include -#include -#ifdef _WIN32 -# include -#else -# include -# include -# include -#endif - -struct options { - bool to_stdout; - bool decompress; - bool force; - bool keep; - bool test; - int compression_level; - const tchar *suffix; -}; - -static const tchar *const optstring = T("1::2::3::4::5::6::7::8::9::cdfhknS:tV"); - -static void -show_usage(FILE *fp) -{ - fprintf(fp, -"Usage: %"TS" [-LEVEL] [-cdfhkV] [-S SUF] FILE...\n" -"Compress or decompress the specified FILEs.\n" -"\n" -"Options:\n" -" -1 fastest (worst) compression\n" -" -6 medium compression (default)\n" -" -12 slowest (best) compression\n" -" -c write to standard output\n" -" -d decompress\n" -" -f overwrite existing output files\n" -" -h print this help\n" -" -k don't delete input files\n" -" -S SUF use suffix SUF instead of .gz\n" -" -t test file integrity\n" -" -V show version and legal information\n", - prog_invocation_name); -} - -static void -show_version(void) -{ - printf( -"gzip compression program v" LIBDEFLATE_VERSION_STRING "\n" -"Copyright 2016 Eric Biggers\n" -"\n" -"This program is free software which may be modified and/or redistributed\n" -"under the terms of the MIT license. There is NO WARRANTY, to the extent\n" -"permitted by law. See the COPYING file for details.\n" - ); -} - -/* Was the program invoked in decompression mode? */ -static bool -is_gunzip(void) -{ - if (tstrxcmp(prog_invocation_name, T("gunzip")) == 0) - return true; - if (tstrxcmp(prog_invocation_name, T("libdeflate-gunzip")) == 0) - return true; -#ifdef _WIN32 - if (tstrxcmp(prog_invocation_name, T("gunzip.exe")) == 0) - return true; - if (tstrxcmp(prog_invocation_name, T("libdeflate-gunzip.exe")) == 0) - return true; -#endif - return false; -} - -static const tchar * -get_suffix(const tchar *path, const tchar *suffix) -{ - size_t path_len = tstrlen(path); - size_t suffix_len = tstrlen(suffix); - const tchar *p; - - if (path_len <= suffix_len) - return NULL; - p = &path[path_len - suffix_len]; - if (tstrxcmp(p, suffix) == 0) - return p; - return NULL; -} - -static bool -has_suffix(const tchar *path, const tchar *suffix) -{ - return get_suffix(path, suffix) != NULL; -} - -static tchar * -append_suffix(const tchar *path, const tchar *suffix) -{ - size_t path_len = tstrlen(path); - size_t suffix_len = tstrlen(suffix); - tchar *suffixed_path; - - suffixed_path = xmalloc((path_len + suffix_len + 1) * sizeof(tchar)); - if (suffixed_path == NULL) - return NULL; - tmemcpy(suffixed_path, path, path_len); - tmemcpy(&suffixed_path[path_len], suffix, suffix_len + 1); - return suffixed_path; -} - -static int -do_compress(struct libdeflate_compressor *compressor, - struct file_stream *in, struct file_stream *out) -{ - const void *uncompressed_data = in->mmap_mem; - size_t uncompressed_size = in->mmap_size; - void *compressed_data; - size_t actual_compressed_size; - size_t max_compressed_size; - int ret; - - max_compressed_size = libdeflate_gzip_compress_bound(compressor, - uncompressed_size); - compressed_data = xmalloc(max_compressed_size); - if (compressed_data == NULL) { - msg("%"TS": file is probably too large to be processed by this " - "program", in->name); - ret = -1; - goto out; - } - - actual_compressed_size = libdeflate_gzip_compress(compressor, - uncompressed_data, - uncompressed_size, - compressed_data, - max_compressed_size); - if (actual_compressed_size == 0) { - msg("Bug in libdeflate_gzip_compress_bound()!"); - ret = -1; - goto out; - } - - ret = full_write(out, compressed_data, actual_compressed_size); -out: - free(compressed_data); - return ret; -} - -static u32 -load_u32_gzip(const u8 *p) -{ - return ((u32)p[0] << 0) | ((u32)p[1] << 8) | - ((u32)p[2] << 16) | ((u32)p[3] << 24); -} - -static int -do_decompress(struct libdeflate_decompressor *decompressor, - struct file_stream *in, struct file_stream *out, - const struct options *options) -{ - const u8 *compressed_data = in->mmap_mem; - size_t compressed_size = in->mmap_size; - void *uncompressed_data = NULL; - size_t uncompressed_size; - size_t actual_in_nbytes; - size_t actual_out_nbytes; - enum libdeflate_result result; - int ret = 0; - - if (compressed_size < sizeof(u32)) { - msg("%"TS": not in gzip format", in->name); - ret = -1; - goto out; - } - - /* - * Use the ISIZE field as a hint for the decompressed data size. It may - * need to be increased later, however, because the file may contain - * multiple gzip members and the particular ISIZE we happen to use may - * not be the largest; or the real size may be >= 4 GiB, causing ISIZE - * to overflow. In any case, make sure to allocate at least one byte. - */ - uncompressed_size = load_u32_gzip(&compressed_data[compressed_size - 4]); - if (uncompressed_size == 0) - uncompressed_size = 1; - - do { - if (uncompressed_data == NULL) { - uncompressed_data = xmalloc(uncompressed_size); - if (uncompressed_data == NULL) { - msg("%"TS": file is probably too large to be " - "processed by this program", in->name); - ret = -1; - goto out; - } - } - - result = libdeflate_gzip_decompress_ex(decompressor, - compressed_data, - compressed_size, - uncompressed_data, - uncompressed_size, - &actual_in_nbytes, - &actual_out_nbytes); - - if (result == LIBDEFLATE_INSUFFICIENT_SPACE) { - if (uncompressed_size * 2 <= uncompressed_size) { - msg("%"TS": file corrupt or too large to be " - "processed by this program", in->name); - ret = -1; - goto out; - } - uncompressed_size *= 2; - free(uncompressed_data); - uncompressed_data = NULL; - continue; - } - - if (result != LIBDEFLATE_SUCCESS) { - msg("%"TS": file corrupt or not in gzip format", - in->name); - ret = -1; - goto out; - } - - if (actual_in_nbytes == 0 || - actual_in_nbytes > compressed_size || - actual_out_nbytes > uncompressed_size) { - msg("Bug in libdeflate_gzip_decompress_ex()!"); - ret = -1; - goto out; - } - - if (!options->test) { - ret = full_write(out, uncompressed_data, actual_out_nbytes); - if (ret != 0) - goto out; - } - - compressed_data += actual_in_nbytes; - compressed_size -= actual_in_nbytes; - - } while (compressed_size != 0); -out: - free(uncompressed_data); - return ret; -} - -static int -stat_file(struct file_stream *in, stat_t *stbuf, bool allow_hard_links) -{ - if (tfstat(in->fd, stbuf) != 0) { - msg("%"TS": unable to stat file", in->name); - return -1; - } - - if (!S_ISREG(stbuf->st_mode) && !in->is_standard_stream) { - msg("%"TS" is %s -- skipping", - in->name, S_ISDIR(stbuf->st_mode) ? "a directory" : - "not a regular file"); - return -2; - } - - if (stbuf->st_nlink > 1 && !allow_hard_links) { - msg("%"TS" has multiple hard links -- skipping " - "(use -f to process anyway)", in->name); - return -2; - } - - return 0; -} - -static void -restore_mode(struct file_stream *out, const stat_t *stbuf) -{ -#ifndef _WIN32 - if (fchmod(out->fd, stbuf->st_mode) != 0) - msg_errno("%"TS": unable to preserve mode", out->name); -#endif -} - -static void -restore_owner_and_group(struct file_stream *out, const stat_t *stbuf) -{ -#ifndef _WIN32 - if (fchown(out->fd, stbuf->st_uid, stbuf->st_gid) != 0) { - msg_errno("%"TS": unable to preserve owner and group", - out->name); - } -#endif -} - -static void -restore_timestamps(struct file_stream *out, const tchar *newpath, - const stat_t *stbuf) -{ - int ret; -#if defined(HAVE_FUTIMENS) && defined(HAVE_STAT_NANOSECOND_PRECISION) - struct timespec times[2] = { - stbuf->st_atim, stbuf->st_mtim, - }; - ret = futimens(out->fd, times); -#elif defined(HAVE_FUTIMES) && defined(HAVE_STAT_NANOSECOND_PRECISION) - struct timeval times[2] = { - { stbuf->st_atim.tv_sec, stbuf->st_atim.tv_nsec / 1000, }, - { stbuf->st_mtim.tv_sec, stbuf->st_mtim.tv_nsec / 1000, }, - }; - ret = futimes(out->fd, times); -#else - struct tutimbuf times = { - stbuf->st_atime, stbuf->st_mtime, - }; - ret = tutime(newpath, ×); -#endif - if (ret != 0) - msg_errno("%"TS": unable to preserve timestamps", out->name); -} - -static void -restore_metadata(struct file_stream *out, const tchar *newpath, - const stat_t *stbuf) -{ - restore_mode(out, stbuf); - restore_owner_and_group(out, stbuf); - restore_timestamps(out, newpath, stbuf); -} - -static int -decompress_file(struct libdeflate_decompressor *decompressor, const tchar *path, - const struct options *options) -{ - tchar *oldpath = (tchar *)path; - tchar *newpath = NULL; - struct file_stream in; - struct file_stream out; - stat_t stbuf; - int ret; - int ret2; - - if (path != NULL) { - const tchar *suffix = get_suffix(path, options->suffix); - if (suffix == NULL) { - /* - * Input file is unsuffixed. If the file doesn't exist, - * then try it suffixed. Otherwise, if we're not - * writing to stdout, skip the file with warning status. - * Otherwise, go ahead and try to open the file anyway - * (which will very likely fail). - */ - if (tstat(path, &stbuf) != 0 && errno == ENOENT) { - oldpath = append_suffix(path, options->suffix); - if (oldpath == NULL) - return -1; - if (!options->to_stdout) - newpath = (tchar *)path; - } else if (!options->to_stdout) { - msg("\"%"TS"\" does not end with the %"TS" " - "suffix -- skipping", - path, options->suffix); - return -2; - } - } else if (!options->to_stdout) { - /* - * Input file is suffixed, and we're not writing to - * stdout. Strip the suffix to get the path to the - * output file. - */ - newpath = xmalloc((suffix - oldpath + 1) * - sizeof(tchar)); - if (newpath == NULL) - return -1; - tmemcpy(newpath, oldpath, suffix - oldpath); - newpath[suffix - oldpath] = '\0'; - } - } - - ret = xopen_for_read(oldpath, options->force || options->to_stdout, - &in); - if (ret != 0) - goto out_free_paths; - - if (!options->force && isatty(in.fd)) { - msg("Refusing to read compressed data from terminal. " - "Use -f to override.\nFor help, use -h."); - ret = -1; - goto out_close_in; - } - - ret = stat_file(&in, &stbuf, options->force || options->keep || - oldpath == NULL || newpath == NULL); - if (ret != 0) - goto out_close_in; - - ret = xopen_for_write(newpath, options->force, &out); - if (ret != 0) - goto out_close_in; - - /* TODO: need a streaming-friendly solution */ - ret = map_file_contents(&in, stbuf.st_size); - if (ret != 0) - goto out_close_out; - - ret = do_decompress(decompressor, &in, &out, options); - if (ret != 0) - goto out_close_out; - - if (oldpath != NULL && newpath != NULL) - restore_metadata(&out, newpath, &stbuf); - ret = 0; -out_close_out: - ret2 = xclose(&out); - if (ret == 0) - ret = ret2; - if (ret != 0 && newpath != NULL) - tunlink(newpath); -out_close_in: - xclose(&in); - if (ret == 0 && oldpath != NULL && newpath != NULL && !options->keep) - tunlink(oldpath); -out_free_paths: - if (newpath != path) - free(newpath); - if (oldpath != path) - free(oldpath); - return ret; -} - -static int -compress_file(struct libdeflate_compressor *compressor, const tchar *path, - const struct options *options) -{ - tchar *newpath = NULL; - struct file_stream in; - struct file_stream out; - stat_t stbuf; - int ret; - int ret2; - - if (path != NULL && !options->to_stdout) { - if (!options->force && has_suffix(path, options->suffix)) { - msg("%"TS": already has %"TS" suffix -- skipping", - path, options->suffix); - return 0; - } - newpath = append_suffix(path, options->suffix); - if (newpath == NULL) - return -1; - } - - ret = xopen_for_read(path, options->force || options->to_stdout, &in); - if (ret != 0) - goto out_free_newpath; - - ret = stat_file(&in, &stbuf, options->force || options->keep || - path == NULL || newpath == NULL); - if (ret != 0) - goto out_close_in; - - ret = xopen_for_write(newpath, options->force, &out); - if (ret != 0) - goto out_close_in; - - if (!options->force && isatty(out.fd)) { - msg("Refusing to write compressed data to terminal. " - "Use -f to override.\nFor help, use -h."); - ret = -1; - goto out_close_out; - } - - /* TODO: need a streaming-friendly solution */ - ret = map_file_contents(&in, stbuf.st_size); - if (ret != 0) - goto out_close_out; - - ret = do_compress(compressor, &in, &out); - if (ret != 0) - goto out_close_out; - - if (path != NULL && newpath != NULL) - restore_metadata(&out, newpath, &stbuf); - ret = 0; -out_close_out: - ret2 = xclose(&out); - if (ret == 0) - ret = ret2; - if (ret != 0 && newpath != NULL) - tunlink(newpath); -out_close_in: - xclose(&in); - if (ret == 0 && path != NULL && newpath != NULL && !options->keep) - tunlink(path); -out_free_newpath: - free(newpath); - return ret; -} - -int -tmain(int argc, tchar *argv[]) -{ - tchar *default_file_list[] = { NULL }; - struct options options; - int opt_char; - int i; - int ret; - - begin_program(argv); - - options.to_stdout = false; - options.decompress = is_gunzip(); - options.force = false; - options.keep = false; - options.test = false; - options.compression_level = 6; - options.suffix = T(".gz"); - - while ((opt_char = tgetopt(argc, argv, optstring)) != -1) { - switch (opt_char) { - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - options.compression_level = - parse_compression_level(opt_char, toptarg); - if (options.compression_level < 0) - return 1; - break; - case 'c': - options.to_stdout = true; - break; - case 'd': - options.decompress = true; - break; - case 'f': - options.force = true; - break; - case 'h': - show_usage(stdout); - return 0; - case 'k': - options.keep = true; - break; - case 'n': - /* - * -n means don't save or restore the original filename - * in the gzip header. Currently this implementation - * already behaves this way by default, so accept the - * option as a no-op. - */ - break; - case 'S': - options.suffix = toptarg; - if (options.suffix[0] == T('\0')) { - msg("invalid suffix"); - return 1; - } - break; - case 't': - options.test = true; - options.decompress = true; - options.to_stdout = true; - /* - * -t behaves just like the more commonly used -c - * option, except that -t doesn't actually write - * anything. For ease of implementation, just pretend - * that -c was specified too. - */ - break; - case 'V': - show_version(); - return 0; - default: - show_usage(stderr); - return 1; - } - } - - argv += toptind; - argc -= toptind; - - if (argc == 0) { - argv = default_file_list; - argc = ARRAY_LEN(default_file_list); - } else { - for (i = 0; i < argc; i++) - if (argv[i][0] == '-' && argv[i][1] == '\0') - argv[i] = NULL; - } - - ret = 0; - if (options.decompress) { - struct libdeflate_decompressor *d; - - d = alloc_decompressor(); - if (d == NULL) - return 1; - - for (i = 0; i < argc; i++) - ret |= -decompress_file(d, argv[i], &options); - - libdeflate_free_decompressor(d); - } else { - struct libdeflate_compressor *c; - - c = alloc_compressor(options.compression_level); - if (c == NULL) - return 1; - - for (i = 0; i < argc; i++) - ret |= -compress_file(c, argv[i], &options); - - libdeflate_free_compressor(c); - } - - /* - * If ret=0, there were no warnings or errors. Exit with status 0. - * If ret=2, there was at least one warning. Exit with status 2. - * Else, there was at least one error. Exit with status 1. - */ - if (ret != 0 && ret != 2) - ret = 1; - - return ret; -} diff --git a/util/compress/libdeflate/programs/prog_util.c b/util/compress/libdeflate/programs/prog_util.c deleted file mode 100644 index 3438281438..0000000000 --- a/util/compress/libdeflate/programs/prog_util.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - * prog_util.c - utility functions for programs - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "prog_util.h" - -#include -#include -#include -#ifdef _WIN32 -# include -#else -# include -# include -#endif - -#ifndef O_BINARY -# define O_BINARY 0 -#endif -#ifndef O_SEQUENTIAL -# define O_SEQUENTIAL 0 -#endif -#ifndef O_NOFOLLOW -# define O_NOFOLLOW 0 -#endif -#ifndef O_NONBLOCK -# define O_NONBLOCK 0 -#endif -#ifndef O_NOCTTY -# define O_NOCTTY 0 -#endif - -/* The invocation name of the program (filename component only) */ -const tchar *prog_invocation_name; - -static void -do_msg(const char *format, bool with_errno, va_list va) -{ - int saved_errno = errno; - - fprintf(stderr, "%"TS": ", prog_invocation_name); - vfprintf(stderr, format, va); - if (with_errno) - fprintf(stderr, ": %s\n", strerror(saved_errno)); - else - fprintf(stderr, "\n"); - - errno = saved_errno; -} - -/* Print a message to standard error */ -void -msg(const char *format, ...) -{ - va_list va; - - va_start(va, format); - do_msg(format, false, va); - va_end(va); -} - -/* Print a message to standard error, including a description of errno */ -void -msg_errno(const char *format, ...) -{ - va_list va; - - va_start(va, format); - do_msg(format, true, va); - va_end(va); -} - -/* malloc() wrapper */ -void * -xmalloc(size_t size) -{ - void *p = malloc(size); - if (p == NULL && size == 0) - p = malloc(1); - if (p == NULL) - msg("Out of memory"); - return p; -} - -/* - * Retrieve a pointer to the filename component of the specified path. - * - * Note: this does not modify the path. Therefore, it is not guaranteed to work - * properly for directories, since a path to a directory might have trailing - * slashes. - */ -static const tchar * -get_filename(const tchar *path) -{ - const tchar *slash = tstrrchr(path, '/'); -#ifdef _WIN32 - const tchar *backslash = tstrrchr(path, '\\'); - if (backslash != NULL && (slash == NULL || backslash > slash)) - slash = backslash; -#endif - if (slash != NULL) - return slash + 1; - return path; -} - -void -begin_program(tchar *argv[]) -{ - prog_invocation_name = get_filename(argv[0]); - -#ifdef FREESTANDING - /* This allows testing freestanding library builds. */ - libdeflate_set_memory_allocator(malloc, free); -#endif -} - -/* Create a copy of 'path' surrounded by double quotes */ -static tchar * -quote_path(const tchar *path) -{ - size_t len = tstrlen(path); - tchar *result; - - result = xmalloc((1 + len + 1 + 1) * sizeof(tchar)); - if (result == NULL) - return NULL; - result[0] = '"'; - tmemcpy(&result[1], path, len); - result[1 + len] = '"'; - result[1 + len + 1] = '\0'; - return result; -} - -/* Open a file for reading, or set up standard input for reading */ -int -xopen_for_read(const tchar *path, bool symlink_ok, struct file_stream *strm) -{ - strm->mmap_token = NULL; - strm->mmap_mem = NULL; - - if (path == NULL) { - strm->is_standard_stream = true; - strm->name = T("standard input"); - strm->fd = STDIN_FILENO; - #ifdef _WIN32 - _setmode(strm->fd, O_BINARY); - #endif - return 0; - } - - strm->is_standard_stream = false; - - strm->name = quote_path(path); - if (strm->name == NULL) - return -1; - - strm->fd = topen(path, O_RDONLY | O_BINARY | O_NONBLOCK | O_NOCTTY | - (symlink_ok ? 0 : O_NOFOLLOW) | O_SEQUENTIAL); - if (strm->fd < 0) { - msg_errno("Can't open %"TS" for reading", strm->name); - free(strm->name); - return -1; - } - -#if defined(HAVE_POSIX_FADVISE) && (O_SEQUENTIAL == 0) - (void)posix_fadvise(strm->fd, 0, 0, POSIX_FADV_SEQUENTIAL); -#endif - - return 0; -} - -/* Open a file for writing, or set up standard output for writing */ -int -xopen_for_write(const tchar *path, bool overwrite, struct file_stream *strm) -{ - int ret = -1; - - strm->mmap_token = NULL; - strm->mmap_mem = NULL; - - if (path == NULL) { - strm->is_standard_stream = true; - strm->name = T("standard output"); - strm->fd = STDOUT_FILENO; - #ifdef _WIN32 - _setmode(strm->fd, O_BINARY); - #endif - return 0; - } - - strm->is_standard_stream = false; - - strm->name = quote_path(path); - if (strm->name == NULL) - goto err; -retry: - strm->fd = topen(path, O_WRONLY | O_BINARY | O_NOFOLLOW | - O_CREAT | O_EXCL, 0644); - if (strm->fd < 0) { - if (errno != EEXIST) { - msg_errno("Can't open %"TS" for writing", strm->name); - goto err; - } - if (!overwrite) { - if (!isatty(STDERR_FILENO) || !isatty(STDIN_FILENO)) { - msg("%"TS" already exists; use -f to overwrite", - strm->name); - ret = -2; /* warning only */ - goto err; - } - fprintf(stderr, "%"TS": %"TS" already exists; " - "overwrite? (y/n) ", - prog_invocation_name, strm->name); - if (getchar() != 'y') { - msg("Not overwriting."); - goto err; - } - } - if (tunlink(path) != 0) { - msg_errno("Unable to delete %"TS, strm->name); - goto err; - } - goto retry; - } - - return 0; - -err: - free(strm->name); - return ret; -} - -/* Read the full contents of a file into memory */ -static int -read_full_contents(struct file_stream *strm) -{ - size_t filled = 0; - size_t capacity = 4096; - char *buf; - int ret; - - buf = xmalloc(capacity); - if (buf == NULL) - return -1; - do { - if (filled == capacity) { - char *newbuf; - - if (capacity == SIZE_MAX) - goto oom; - capacity += MIN(SIZE_MAX - capacity, capacity); - newbuf = realloc(buf, capacity); - if (newbuf == NULL) - goto oom; - buf = newbuf; - } - ret = xread(strm, &buf[filled], capacity - filled); - if (ret < 0) - goto err; - filled += ret; - } while (ret != 0); - - strm->mmap_mem = buf; - strm->mmap_size = filled; - return 0; - -err: - free(buf); - return ret; -oom: - msg("Out of memory! %"TS" is too large to be processed by " - "this program as currently implemented.", strm->name); - ret = -1; - goto err; -} - -/* Map the contents of a file into memory */ -int -map_file_contents(struct file_stream *strm, u64 size) -{ - if (size == 0) /* mmap isn't supported on empty files */ - return read_full_contents(strm); - - if (size > SIZE_MAX) { - msg("%"TS" is too large to be processed by this program", - strm->name); - return -1; - } -#ifdef _WIN32 - strm->mmap_token = CreateFileMapping( - (HANDLE)(intptr_t)_get_osfhandle(strm->fd), - NULL, PAGE_READONLY, 0, 0, NULL); - if (strm->mmap_token == NULL) { - DWORD err = GetLastError(); - if (err == ERROR_BAD_EXE_FORMAT) /* mmap unsupported */ - return read_full_contents(strm); - msg("Unable create file mapping for %"TS": Windows error %u", - strm->name, (unsigned int)err); - return -1; - } - - strm->mmap_mem = MapViewOfFile((HANDLE)strm->mmap_token, - FILE_MAP_READ, 0, 0, size); - if (strm->mmap_mem == NULL) { - msg("Unable to map %"TS" into memory: Windows error %u", - strm->name, (unsigned int)GetLastError()); - CloseHandle((HANDLE)strm->mmap_token); - return -1; - } -#else /* _WIN32 */ - strm->mmap_mem = mmap(NULL, size, PROT_READ, MAP_SHARED, strm->fd, 0); - if (strm->mmap_mem == MAP_FAILED) { - strm->mmap_mem = NULL; - if (errno == ENODEV) /* mmap isn't supported on this file */ - return read_full_contents(strm); - if (errno == ENOMEM) { - msg("%"TS" is too large to be processed by this " - "program", strm->name); - } else { - msg_errno("Unable to map %"TS" into memory", - strm->name); - } - return -1; - } - -#ifdef HAVE_POSIX_MADVISE - (void)posix_madvise(strm->mmap_mem, size, POSIX_MADV_SEQUENTIAL); -#endif - strm->mmap_token = strm; /* anything that's not NULL */ - -#endif /* !_WIN32 */ - strm->mmap_size = size; - return 0; -} - -/* - * Read from a file, returning the full count to indicate all bytes were read, a - * short count (possibly 0) to indicate EOF, or -1 to indicate error. - */ -ssize_t -xread(struct file_stream *strm, void *buf, size_t count) -{ - char *p = buf; - size_t orig_count = count; - - while (count != 0) { - ssize_t res = read(strm->fd, p, MIN(count, INT_MAX)); - if (res == 0) - break; - if (res < 0) { - if (errno == EAGAIN || errno == EINTR) - continue; - msg_errno("Error reading from %"TS, strm->name); - return -1; - } - p += res; - count -= res; - } - return orig_count - count; -} - -/* Write to a file, returning 0 if all bytes were written or -1 on error */ -int -full_write(struct file_stream *strm, const void *buf, size_t count) -{ - const char *p = buf; - - while (count != 0) { - ssize_t res = write(strm->fd, p, MIN(count, INT_MAX)); - if (res <= 0) { - msg_errno("Error writing to %"TS, strm->name); - return -1; - } - p += res; - count -= res; - } - return 0; -} - -/* Close a file, returning 0 on success or -1 on error */ -int -xclose(struct file_stream *strm) -{ - int ret = 0; - - if (!strm->is_standard_stream) { - if (close(strm->fd) != 0) { - msg_errno("Error closing %"TS, strm->name); - ret = -1; - } - free(strm->name); - } - - if (strm->mmap_token != NULL) { -#ifdef _WIN32 - UnmapViewOfFile(strm->mmap_mem); - CloseHandle((HANDLE)strm->mmap_token); -#else - munmap(strm->mmap_mem, strm->mmap_size); -#endif - strm->mmap_token = NULL; - } else { - free(strm->mmap_mem); - } - strm->mmap_mem = NULL; - strm->fd = -1; - strm->name = NULL; - return ret; -} - -/* - * Parse the compression level given on the command line, returning the - * compression level on success or -1 on error - */ -int -parse_compression_level(tchar opt_char, const tchar *arg) -{ - int level; - - if (arg == NULL) - arg = T(""); - - if (opt_char < '0' || opt_char > '9') - goto invalid; - level = opt_char - '0'; - - if (arg[0] != '\0') { - if (arg[0] < '0' || arg[0] > '9') - goto invalid; - if (arg[1] != '\0') /* Levels are at most 2 digits */ - goto invalid; - if (level == 0) /* Don't allow arguments like "-01" */ - goto invalid; - level = (level * 10) + (arg[0] - '0'); - } - - if (level < 0 || level > 12) - goto invalid; - - return level; - -invalid: - msg("Invalid compression level: \"%"TC"%"TS"\". " - "Must be an integer in the range [0, 12].", opt_char, arg); - return -1; -} - -/* Allocate a new DEFLATE compressor */ -struct libdeflate_compressor * -alloc_compressor(int level) -{ - struct libdeflate_compressor *c; - - c = libdeflate_alloc_compressor(level); - if (c == NULL) { - msg_errno("Unable to allocate compressor with " - "compression level %d", level); - } - return c; -} - -/* Allocate a new DEFLATE decompressor */ -struct libdeflate_decompressor * -alloc_decompressor(void) -{ - struct libdeflate_decompressor *d; - - d = libdeflate_alloc_decompressor(); - if (d == NULL) - msg_errno("Unable to allocate decompressor"); - - return d; -} diff --git a/util/compress/libdeflate/programs/prog_util.h b/util/compress/libdeflate/programs/prog_util.h deleted file mode 100644 index fa3f7b5192..0000000000 --- a/util/compress/libdeflate/programs/prog_util.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * prog_util.h - utility functions for programs - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PROGRAMS_PROG_UTIL_H -#define PROGRAMS_PROG_UTIL_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "libdeflate.h" - -#include -#include -#include -#include -#ifndef _WIN32 -# include -#endif - -#include "../common/common_defs.h" - -#ifdef __GNUC__ -# define _printf(str_idx, args_idx) \ - __attribute__((format(printf, str_idx, args_idx))) -#else -# define _printf(str_idx, args_idx) -#endif - -#ifdef _MSC_VER -/* - * Old versions (e.g. VS2010) of MSC have stdint.h but not the C99 header - * inttypes.h. Work around this by defining the PRI* macros ourselves. - */ -# define PRIu8 "hhu" -# define PRIu16 "hu" -# define PRIu32 "u" -# define PRIu64 "llu" -# define PRIi8 "hhi" -# define PRIi16 "hi" -# define PRIi32 "i" -# define PRIi64 "lli" -# define PRIx8 "hhx" -# define PRIx16 "hx" -# define PRIx32 "x" -# define PRIx64 "llx" -#else -# include -#endif - -#ifdef _WIN32 - -/* - * Definitions for Windows builds. Mainly, 'tchar' is defined to be the 2-byte - * 'wchar_t' type instead of 'char'. This is the only "easy" way I know of to - * get full Unicode support on Windows... - */ - -#include -int wmain(int argc, wchar_t **argv); -# define tmain wmain -# define tchar wchar_t -# define _T(text) L##text -# define T(text) _T(text) -# define TS "ls" -# define TC "lc" -# define tmemcpy wmemcpy -# define topen _wopen -# define tstrchr wcschr -# define tstrcmp wcscmp -# define tstrlen wcslen -# define tstrrchr wcsrchr -# define tstrtoul wcstoul -# define tstrxcmp wcsicmp -# define tunlink _wunlink -# define tutimbuf __utimbuf64 -# define tutime _wutime64 -# define tstat _wstat64 -# define tfstat _fstat64 -# define stat_t struct _stat64 -# ifdef _MSC_VER -# define STDIN_FILENO 0 -# define STDOUT_FILENO 1 -# define STDERR_FILENO 2 -# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# endif - -#else /* _WIN32 */ - -/* Standard definitions for everyone else */ - -# define tmain main -# define tchar char -# define T(text) text -# define TS "s" -# define TC "c" -# define tmemcpy memcpy -# define topen open -# define tstrchr strchr -# define tstrcmp strcmp -# define tstrlen strlen -# define tstrrchr strrchr -# define tstrtoul strtoul -# define tstrxcmp strcmp -# define tunlink unlink -# define tutimbuf utimbuf -# define tutime utime -# define tstat stat -# define tfstat fstat -# define stat_t struct stat - -#endif /* !_WIN32 */ - -extern const tchar *prog_invocation_name; - -void _printf(1, 2) msg(const char *fmt, ...); -void _printf(1, 2) msg_errno(const char *fmt, ...); - -void *xmalloc(size_t size); - -void begin_program(tchar *argv[]); - -struct file_stream { - int fd; - tchar *name; - bool is_standard_stream; - void *mmap_token; - void *mmap_mem; - size_t mmap_size; -}; - -int xopen_for_read(const tchar *path, bool symlink_ok, - struct file_stream *strm); -int xopen_for_write(const tchar *path, bool force, struct file_stream *strm); -int map_file_contents(struct file_stream *strm, u64 size); - -ssize_t xread(struct file_stream *strm, void *buf, size_t count); -int full_write(struct file_stream *strm, const void *buf, size_t count); - -int xclose(struct file_stream *strm); - -int parse_compression_level(tchar opt_char, const tchar *arg); - -struct libdeflate_compressor *alloc_compressor(int level); -struct libdeflate_decompressor *alloc_decompressor(void); - -/* tgetopt.c */ - -extern tchar *toptarg; -extern int toptind, topterr, toptopt; - -int tgetopt(int argc, tchar *argv[], const tchar *optstring); - -#endif /* PROGRAMS_PROG_UTIL_H */ diff --git a/util/compress/libdeflate/programs/test_checksums.c b/util/compress/libdeflate/programs/test_checksums.c deleted file mode 100644 index 97054182fa..0000000000 --- a/util/compress/libdeflate/programs/test_checksums.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * test_checksums.c - * - * Verify that libdeflate's Adler-32 and CRC-32 functions produce the same - * results as their zlib equivalents. - */ - -#include -#include - -#include "test_util.h" - -static unsigned int rng_seed; - -typedef u32 (*cksum_fn_t)(u32, const void *, size_t); - -static u32 -adler32_libdeflate(u32 adler, const void *buf, size_t len) -{ - return libdeflate_adler32(adler, buf, len); -} - -static u32 -crc32_libdeflate(u32 crc, const void *buf, size_t len) -{ - return libdeflate_crc32(crc, buf, len); -} - -static u32 -adler32_zlib(u32 adler, const void *buf, size_t len) -{ - return adler32(adler, buf, len); -} - -static u32 -crc32_zlib(u32 crc, const void *buf, size_t len) -{ - return crc32(crc, buf, len); -} - -static u32 -select_initial_crc(void) -{ - if (rand() & 1) - return 0; - return ((u32)rand() << 16) | rand(); -} - -static u32 -select_initial_adler(void) -{ - u32 lo, hi; - - if (rand() & 1) - return 1; - - lo = (rand() % 4 == 0 ? 65520 : rand() % 65521); - hi = (rand() % 4 == 0 ? 65520 : rand() % 65521); - return (hi << 16) | lo; -} - -static void -test_initial_values(cksum_fn_t cksum, u32 expected) -{ - ASSERT(cksum(0, NULL, 0) == expected); - if (cksum != adler32_zlib) /* broken */ - ASSERT(cksum(0, NULL, 1) == expected); - ASSERT(cksum(0, NULL, 1234) == expected); - ASSERT(cksum(1234, NULL, 0) == expected); - ASSERT(cksum(1234, NULL, 1234) == expected); -} - -static void -test_multipart(const u8 *buffer, size_t size, const char *name, - cksum_fn_t cksum, u32 v, u32 expected) -{ - size_t division = rand() % (size + 1); - v = cksum(v, buffer, division); - v = cksum(v, buffer + division, size - division); - if (v != expected) { - fprintf(stderr, "%s checksum failed multipart test\n", name); - ASSERT(0); - } -} - -static void -test_checksums(const void *buffer, size_t size, const char *name, - cksum_fn_t cksum1, cksum_fn_t cksum2, u32 initial_value) -{ - u32 v1 = cksum1(initial_value, buffer, size); - u32 v2 = cksum2(initial_value, buffer, size); - - if (v1 != v2) { - fprintf(stderr, "%s checksum mismatch\n", name); - fprintf(stderr, "initial_value=0x%08"PRIx32", buffer=%p, " - "size=%zu, buffer=", initial_value, buffer, size); - for (size_t i = 0; i < MIN(size, 256); i++) - fprintf(stderr, "%02x", ((const u8 *)buffer)[i]); - if (size > 256) - fprintf(stderr, "..."); - fprintf(stderr, "\n"); - ASSERT(0); - } - - if ((rand() & 15) == 0) { - test_multipart(buffer, size, name, cksum1, initial_value, v1); - test_multipart(buffer, size, name, cksum2, initial_value, v1); - } -} - -static void -test_crc32(const void *buffer, size_t size, u32 initial_value) -{ - test_checksums(buffer, size, "CRC-32", - crc32_libdeflate, crc32_zlib, initial_value); -} - -static void -test_adler32(const void *buffer, size_t size, u32 initial_value) -{ - test_checksums(buffer, size, "Adler-32", - adler32_libdeflate, adler32_zlib, initial_value); -} - -static void test_random_buffers(u8 *buffer, u8 *guarded_buf_end, - size_t limit, u32 num_iter) -{ - for (u32 i = 0; i < num_iter; i++) { - size_t start = rand() % limit; - size_t len = rand() % (limit - start); - u32 a0 = select_initial_adler(); - u32 c0 = select_initial_crc(); - - for (size_t j = start; j < start + len; j++) - buffer[j] = rand(); - - /* Test with chosen size and alignment */ - test_adler32(&buffer[start], len, a0); - test_crc32(&buffer[start], len, c0); - - /* Test with chosen size, with guard page after input buffer */ - memcpy(guarded_buf_end - len, &buffer[start], len); - test_adler32(guarded_buf_end - len, len, a0); - test_crc32(guarded_buf_end - len, len, c0); - } -} - -int -tmain(int argc, tchar *argv[]) -{ - u8 *buffer = xmalloc(32768); - u8 *guarded_buf_start, *guarded_buf_end; - - begin_program(argv); - - alloc_guarded_buffer(32768, &guarded_buf_start, &guarded_buf_end); - - rng_seed = time(NULL); - srand(rng_seed); - - test_initial_values(adler32_libdeflate, 1); - test_initial_values(adler32_zlib, 1); - test_initial_values(crc32_libdeflate, 0); - test_initial_values(crc32_zlib, 0); - - /* Test different buffer sizes and alignments */ - test_random_buffers(buffer, guarded_buf_end, 256, 5000); - test_random_buffers(buffer, guarded_buf_end, 1024, 500); - test_random_buffers(buffer, guarded_buf_end, 32768, 50); - - /* - * Test Adler-32 overflow cases. For example, given all 0xFF bytes and - * the highest possible initial (s1, s2) of (65520, 65520), then s2 if - * stored as a 32-bit unsigned integer will overflow if > 5552 bytes are - * processed. Implementations must make sure to reduce s2 modulo 65521 - * before that point. Also, some implementations make use of 16-bit - * counters which can overflow earlier. - */ - memset(buffer, 0xFF, 32768); - for (u32 i = 0; i < 20; i++) { - u32 initial_value; - - if (i == 0) - initial_value = ((u32)65520 << 16) | 65520; - else - initial_value = select_initial_adler(); - - test_adler32(buffer, 5553, initial_value); - test_adler32(buffer, rand() % 32769, initial_value); - buffer[rand() % 32768] = 0xFE; - } - - free(buffer); - free_guarded_buffer(guarded_buf_start, guarded_buf_end); - return 0; -} diff --git a/util/compress/libdeflate/programs/test_custom_malloc.c b/util/compress/libdeflate/programs/test_custom_malloc.c deleted file mode 100644 index 2bbb7f098e..0000000000 --- a/util/compress/libdeflate/programs/test_custom_malloc.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * test_custom_malloc.c - * - * Test libdeflate_set_memory_allocator(). - * Also test injecting allocation failures. - */ - -#include "test_util.h" - -static int malloc_count = 0; -static int free_count = 0; - -static void *do_malloc(size_t size) -{ - malloc_count++; - return malloc(size); -} - -static void *do_fail_malloc(size_t size) -{ - malloc_count++; - return NULL; -} - -static void do_free(void *ptr) -{ - free_count++; - free(ptr); -} - -int -tmain(int argc, tchar *argv[]) -{ - int level; - struct libdeflate_compressor *c; - struct libdeflate_decompressor *d; - - begin_program(argv); - - /* Test that the custom allocator is actually used when requested. */ - - libdeflate_set_memory_allocator(do_malloc, do_free); - ASSERT(malloc_count == 0); - ASSERT(free_count == 0); - - for (level = 0; level <= 12; level++) { - malloc_count = free_count = 0; - c = libdeflate_alloc_compressor(level); - ASSERT(c != NULL); - ASSERT(malloc_count == 1); - ASSERT(free_count == 0); - libdeflate_free_compressor(c); - ASSERT(malloc_count == 1); - ASSERT(free_count == 1); - } - - malloc_count = free_count = 0; - d = libdeflate_alloc_decompressor(); - ASSERT(d != NULL); - ASSERT(malloc_count == 1); - ASSERT(free_count == 0); - libdeflate_free_decompressor(d); - ASSERT(malloc_count == 1); - ASSERT(free_count == 1); - - /* As long as we're here, also test injecting allocation failures. */ - - libdeflate_set_memory_allocator(do_fail_malloc, do_free); - - for (level = 0; level <= 12; level++) { - malloc_count = free_count = 0; - c = libdeflate_alloc_compressor(level); - ASSERT(c == NULL); - ASSERT(malloc_count == 1); - ASSERT(free_count == 0); - } - - malloc_count = free_count = 0; - d = libdeflate_alloc_decompressor(); - ASSERT(d == NULL); - ASSERT(malloc_count == 1); - ASSERT(free_count == 0); - - return 0; -} diff --git a/util/compress/libdeflate/programs/test_incomplete_codes.c b/util/compress/libdeflate/programs/test_incomplete_codes.c deleted file mode 100644 index 4e441bccb4..0000000000 --- a/util/compress/libdeflate/programs/test_incomplete_codes.c +++ /dev/null @@ -1,385 +0,0 @@ -/* - * test_incomplete_codes.c - * - * Test that the decompressor accepts incomplete Huffman codes in certain - * specific cases. - */ - -#include "test_util.h" - -static void -verify_decompression_libdeflate(const u8 *in, size_t in_nbytes, - u8 *out, size_t out_nbytes_avail, - const u8 *expected_out, - size_t expected_out_nbytes) -{ - struct libdeflate_decompressor *d; - enum libdeflate_result res; - size_t actual_out_nbytes; - - d = libdeflate_alloc_decompressor(); - ASSERT(d != NULL); - - res = libdeflate_deflate_decompress(d, in, in_nbytes, - out, out_nbytes_avail, - &actual_out_nbytes); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(actual_out_nbytes == expected_out_nbytes); - ASSERT(memcmp(out, expected_out, actual_out_nbytes) == 0); - - libdeflate_free_decompressor(d); -} - -static void -verify_decompression_zlib(const u8 *in, size_t in_nbytes, - u8 *out, size_t out_nbytes_avail, - const u8 *expected_out, size_t expected_out_nbytes) -{ - z_stream z; - int res; - size_t actual_out_nbytes; - - memset(&z, 0, sizeof(z)); - res = inflateInit2(&z, -15); - ASSERT(res == Z_OK); - - z.next_in = (void *)in; - z.avail_in = in_nbytes; - z.next_out = (void *)out; - z.avail_out = out_nbytes_avail; - res = inflate(&z, Z_FINISH); - ASSERT(res == Z_STREAM_END); - actual_out_nbytes = out_nbytes_avail - z.avail_out; - ASSERT(actual_out_nbytes == expected_out_nbytes); - ASSERT(memcmp(out, expected_out, actual_out_nbytes) == 0); - - inflateEnd(&z); -} - -static void -verify_decompression(const u8 *in, size_t in_nbytes, - u8 *out, size_t out_nbytes_avail, - const u8 *expected_out, size_t expected_out_nbytes) -{ - verify_decompression_libdeflate(in, in_nbytes, out, out_nbytes_avail, - expected_out, expected_out_nbytes); - verify_decompression_zlib(in, in_nbytes, out, out_nbytes_avail, - expected_out, expected_out_nbytes); - -} - -/* Test that an empty offset code is accepted. */ -static void -test_empty_offset_code(void) -{ - static const u8 expected_out[] = { 'A', 'B', 'A', 'A' }; - u8 in[128]; - u8 out[128]; - struct output_bitstream os = { .next = in, .end = in + sizeof(in) }; - int i; - - /* - * Generate a DEFLATE stream containing a "dynamic Huffman" block - * containing literals, but no offsets; and having an empty offset code - * (all codeword lengths set to 0). - * - * Litlen code: - * litlensym_A freq=3 len=1 codeword= 0 - * litlensym_B freq=1 len=2 codeword=01 - * litlensym_256 (end-of-block) freq=1 len=2 codeword=11 - * Offset code: - * (empty) - * - * Litlen and offset codeword lengths: - * [0..'A'-1] = 0 presym_18 - * ['A'] = 1 presym_1 - * ['B'] = 2 presym_2 - * ['B'+1..255] = 0 presym_18 presym_18 - * [256] = 2 presym_2 - * [257] = 0 presym_0 - * - * Precode: - * presym_0 freq=1 len=3 codeword=011 - * presym_1 freq=1 len=3 codeword=111 - * presym_2 freq=2 len=2 codeword= 01 - * presym_18 freq=3 len=1 codeword= 0 - */ - - ASSERT(put_bits(&os, 1, 1)); /* BFINAL: 1 */ - ASSERT(put_bits(&os, 2, 2)); /* BTYPE: DYNAMIC_HUFFMAN */ - ASSERT(put_bits(&os, 0, 5)); /* num_litlen_syms: 0 + 257 */ - ASSERT(put_bits(&os, 0, 5)); /* num_offset_syms: 0 + 1 */ - ASSERT(put_bits(&os, 14, 4)); /* num_explicit_precode_lens: 14 + 4 */ - - /* - * Precode codeword lengths: order is - * [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] - */ - for (i = 0; i < 2; i++) /* presym_{16,17}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 1, 3)); /* presym_18: len=1 */ - ASSERT(put_bits(&os, 3, 3)); /* presym_0: len=3 */ - for (i = 0; i < 11; i++) /* presym_{8,...,13}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 2, 3)); /* presym_2: len=2 */ - ASSERT(put_bits(&os, 0, 3)); /* presym_14: len=0 */ - ASSERT(put_bits(&os, 3, 3)); /* presym_1: len=3 */ - - /* Litlen and offset codeword lengths */ - ASSERT(put_bits(&os, 0x0, 1) && - put_bits(&os, 54, 7)); /* presym_18, 65 zeroes */ - ASSERT(put_bits(&os, 0x7, 3)); /* presym_1 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x0, 1) && - put_bits(&os, 89, 7)); /* presym_18, 100 zeroes */ - ASSERT(put_bits(&os, 0x0, 1) && - put_bits(&os, 78, 7)); /* presym_18, 89 zeroes */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x3, 3)); /* presym_0 */ - - /* Litlen symbols */ - ASSERT(put_bits(&os, 0x0, 1)); /* litlensym_A */ - ASSERT(put_bits(&os, 0x1, 2)); /* litlensym_B */ - ASSERT(put_bits(&os, 0x0, 1)); /* litlensym_A */ - ASSERT(put_bits(&os, 0x0, 1)); /* litlensym_A */ - ASSERT(put_bits(&os, 0x3, 2)); /* litlensym_256 (end-of-block) */ - - ASSERT(flush_bits(&os)); - - verify_decompression(in, os.next - in, out, sizeof(out), - expected_out, sizeof(expected_out)); -} - -/* Test that a litrunlen code containing only one symbol is accepted. */ -static void -test_singleton_litrunlen_code(void) -{ - u8 in[128]; - u8 out[128]; - struct output_bitstream os = { .next = in, .end = in + sizeof(in) }; - int i; - - /* - * Litlen code: - * litlensym_256 (end-of-block) freq=1 len=1 codeword=0 - * Offset code: - * (empty) - * - * Litlen and offset codeword lengths: - * [0..256] = 0 presym_18 presym_18 - * [256] = 1 presym_1 - * [257] = 0 presym_0 - * - * Precode: - * presym_0 freq=1 len=2 codeword=01 - * presym_1 freq=1 len=2 codeword=11 - * presym_18 freq=2 len=1 codeword= 0 - */ - - ASSERT(put_bits(&os, 1, 1)); /* BFINAL: 1 */ - ASSERT(put_bits(&os, 2, 2)); /* BTYPE: DYNAMIC_HUFFMAN */ - ASSERT(put_bits(&os, 0, 5)); /* num_litlen_syms: 0 + 257 */ - ASSERT(put_bits(&os, 0, 5)); /* num_offset_syms: 0 + 1 */ - ASSERT(put_bits(&os, 14, 4)); /* num_explicit_precode_lens: 14 + 4 */ - - /* - * Precode codeword lengths: order is - * [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] - */ - for (i = 0; i < 2; i++) /* presym_{16,17}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 1, 3)); /* presym_18: len=1 */ - ASSERT(put_bits(&os, 2, 3)); /* presym_0: len=2 */ - for (i = 0; i < 13; i++) /* presym_{8,...,14}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 2, 3)); /* presym_1: len=2 */ - - /* Litlen and offset codeword lengths */ - for (i = 0; i < 2; i++) { - ASSERT(put_bits(&os, 0, 1) && /* presym_18, 128 zeroes */ - put_bits(&os, 117, 7)); - } - ASSERT(put_bits(&os, 0x3, 2)); /* presym_1 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_0 */ - - /* Litlen symbols */ - ASSERT(put_bits(&os, 0x0, 1)); /* litlensym_256 (end-of-block) */ - - ASSERT(flush_bits(&os)); - - verify_decompression(in, os.next - in, out, sizeof(out), in, 0); -} - -/* Test that an offset code containing only one symbol is accepted. */ -static void -test_singleton_offset_code(void) -{ - static const u8 expected_out[] = { 255, 255, 255, 255 }; - u8 in[128]; - u8 out[128]; - struct output_bitstream os = { .next = in, .end = in + sizeof(in) }; - int i; - - ASSERT(put_bits(&os, 1, 1)); /* BFINAL: 1 */ - ASSERT(put_bits(&os, 2, 2)); /* BTYPE: DYNAMIC_HUFFMAN */ - - /* - * Litlen code: - * litlensym_255 freq=1 len=1 codeword= 0 - * litlensym_256 (end-of-block) freq=1 len=2 codeword=01 - * litlensym_257 (len 3) freq=1 len=2 codeword=11 - * Offset code: - * offsetsym_0 (offset 0) freq=1 len=1 codeword=0 - * - * Litlen and offset codeword lengths: - * [0..254] = 0 presym_{18,18} - * [255] = 1 presym_1 - * [256] = 1 presym_2 - * [257] = 1 presym_2 - * [258] = 1 presym_1 - * - * Precode: - * presym_1 freq=2 len=2 codeword=01 - * presym_2 freq=2 len=2 codeword=11 - * presym_18 freq=2 len=1 codeword= 0 - */ - - ASSERT(put_bits(&os, 1, 5)); /* num_litlen_syms: 1 + 257 */ - ASSERT(put_bits(&os, 0, 5)); /* num_offset_syms: 0 + 1 */ - ASSERT(put_bits(&os, 14, 4)); /* num_explicit_precode_lens: 14 + 4 */ - /* - * Precode codeword lengths: order is - * [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] - */ - for (i = 0; i < 2; i++) /* presym_{16,17}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 1, 3)); /* presym_18: len=1 */ - for (i = 0; i < 12; i++) /* presym_{0,...,13}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 2, 3)); /* presym_2: len=2 */ - ASSERT(put_bits(&os, 0, 3)); /* presym_14: len=0 */ - ASSERT(put_bits(&os, 2, 3)); /* presym_1: len=2 */ - - /* Litlen and offset codeword lengths */ - ASSERT(put_bits(&os, 0x0, 1) && /* presym_18, 128 zeroes */ - put_bits(&os, 117, 7)); - ASSERT(put_bits(&os, 0x0, 1) && /* presym_18, 127 zeroes */ - put_bits(&os, 116, 7)); - ASSERT(put_bits(&os, 0x1, 2)); /* presym_1 */ - ASSERT(put_bits(&os, 0x3, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x3, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_1 */ - - /* Literal */ - ASSERT(put_bits(&os, 0x0, 1)); /* litlensym_255 */ - - /* Match */ - ASSERT(put_bits(&os, 0x3, 2)); /* litlensym_257 */ - ASSERT(put_bits(&os, 0x0, 1)); /* offsetsym_0 */ - - /* End of block */ - ASSERT(put_bits(&os, 0x1, 2)); /* litlensym_256 */ - - ASSERT(flush_bits(&os)); - - verify_decompression(in, os.next - in, out, sizeof(out), - expected_out, sizeof(expected_out)); -} - -/* Test that an offset code containing only one symbol is accepted, even if that - * symbol is not symbol 0. The codeword should be '0' in either case. */ -static void -test_singleton_offset_code_notsymzero(void) -{ - static const u8 expected_out[] = { 254, 255, 254, 255, 254 }; - u8 in[128]; - u8 out[128]; - struct output_bitstream os = { .next = in, .end = in + sizeof(in) }; - int i; - - ASSERT(put_bits(&os, 1, 1)); /* BFINAL: 1 */ - ASSERT(put_bits(&os, 2, 2)); /* BTYPE: DYNAMIC_HUFFMAN */ - - /* - * Litlen code: - * litlensym_254 len=2 codeword=00 - * litlensym_255 len=2 codeword=10 - * litlensym_256 (end-of-block) len=2 codeword=01 - * litlensym_257 (len 3) len=2 codeword=11 - * Offset code: - * offsetsym_1 (offset 2) len=1 codeword=0 - * - * Litlen and offset codeword lengths: - * [0..253] = 0 presym_{18,18} - * [254] = 2 presym_2 - * [255] = 2 presym_2 - * [256] = 2 presym_2 - * [257] = 2 presym_2 - * [258] = 0 presym_0 - * [259] = 1 presym_1 - * - * Precode: - * presym_0 len=2 codeword=00 - * presym_1 len=2 codeword=10 - * presym_2 len=2 codeword=01 - * presym_18 len=2 codeword=11 - */ - - ASSERT(put_bits(&os, 1, 5)); /* num_litlen_syms: 1 + 257 */ - ASSERT(put_bits(&os, 1, 5)); /* num_offset_syms: 1 + 1 */ - ASSERT(put_bits(&os, 14, 4)); /* num_explicit_precode_lens: 14 + 4 */ - /* - * Precode codeword lengths: order is - * [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] - */ - for (i = 0; i < 2; i++) /* presym_{16,17}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 2, 3)); /* presym_18: len=2 */ - ASSERT(put_bits(&os, 2, 3)); /* presym_0: len=2 */ - for (i = 0; i < 11; i++) /* presym_{8,...,13}: len=0 */ - ASSERT(put_bits(&os, 0, 3)); - ASSERT(put_bits(&os, 2, 3)); /* presym_2: len=2 */ - ASSERT(put_bits(&os, 0, 3)); /* presym_14: len=0 */ - ASSERT(put_bits(&os, 2, 3)); /* presym_1: len=2 */ - - /* Litlen and offset codeword lengths */ - ASSERT(put_bits(&os, 0x3, 2) && /* presym_18, 128 zeroes */ - put_bits(&os, 117, 7)); - ASSERT(put_bits(&os, 0x3, 2) && /* presym_18, 126 zeroes */ - put_bits(&os, 115, 7)); - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x1, 2)); /* presym_2 */ - ASSERT(put_bits(&os, 0x0, 2)); /* presym_0 */ - ASSERT(put_bits(&os, 0x2, 2)); /* presym_1 */ - - /* Literals */ - ASSERT(put_bits(&os, 0x0, 2)); /* litlensym_254 */ - ASSERT(put_bits(&os, 0x2, 2)); /* litlensym_255 */ - - /* Match */ - ASSERT(put_bits(&os, 0x3, 2)); /* litlensym_257 */ - ASSERT(put_bits(&os, 0x0, 1)); /* offsetsym_1 */ - - /* End of block */ - ASSERT(put_bits(&os, 0x1, 2)); /* litlensym_256 */ - - ASSERT(flush_bits(&os)); - - verify_decompression(in, os.next - in, out, sizeof(out), - expected_out, sizeof(expected_out)); -} - -int -tmain(int argc, tchar *argv[]) -{ - begin_program(argv); - - test_empty_offset_code(); - test_singleton_litrunlen_code(); - test_singleton_offset_code(); - test_singleton_offset_code_notsymzero(); - - return 0; -} diff --git a/util/compress/libdeflate/programs/test_litrunlen_overflow.c b/util/compress/libdeflate/programs/test_litrunlen_overflow.c deleted file mode 100644 index 7a9d5b1fee..0000000000 --- a/util/compress/libdeflate/programs/test_litrunlen_overflow.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * test_litrunlen_overflow.c - * - * Regression test for commit f2f0df727444 ("deflate_compress: fix corruption - * with long literal run"). Try to compress a file longer than 65535 bytes - * where no 2-byte sequence (3 would be sufficient) is repeated <= 32768 bytes - * apart, and the distribution of bytes remains constant throughout, and yet not - * all bytes are used so the data is still slightly compressible. There will be - * no matches in this data, but the compressor should still output a compressed - * block, and this block should contain more than 65535 consecutive literals, - * which triggered the bug. - * - * Note: on random data, this situation is extremely unlikely if the compressor - * uses all matches it finds, since random data will on average have a 3-byte - * match every (256**3)/32768 = 512 bytes. - */ - -#include "test_util.h" - -int -tmain(int argc, tchar *argv[]) -{ - const size_t data_size = 2 * 250 * 251; - u8 *orig_data, *compressed_data, *decompressed_data; - int i, stride, multiple, j = 0; - struct libdeflate_decompressor *d; - static const int levels[] = { 3, 6, 12 }; - - begin_program(argv); - - orig_data = xmalloc(data_size); - compressed_data = xmalloc(data_size); - decompressed_data = xmalloc(data_size); - - for (i = 0; i < 2; i++) { - for (stride = 1; stride < 251; stride++) { - for (multiple = 0; multiple < 251; multiple++) - orig_data[j++] = (stride * multiple) % 251; - } - } - ASSERT(j == data_size); - - d = libdeflate_alloc_decompressor(); - ASSERT(d != NULL); - - for (i = 0; i < ARRAY_LEN(levels); i++) { - struct libdeflate_compressor *c; - size_t csize; - enum libdeflate_result res; - - c = libdeflate_alloc_compressor(levels[i]); - ASSERT(c != NULL); - - csize = libdeflate_deflate_compress(c, orig_data, data_size, - compressed_data, data_size); - ASSERT(csize > 0 && csize < data_size); - - res = libdeflate_deflate_decompress(d, compressed_data, csize, - decompressed_data, - data_size, NULL); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(memcmp(orig_data, decompressed_data, data_size) == 0); - - libdeflate_free_compressor(c); - } - - libdeflate_free_decompressor(d); - free(orig_data); - free(compressed_data); - free(decompressed_data); - return 0; -} diff --git a/util/compress/libdeflate/programs/test_slow_decompression.c b/util/compress/libdeflate/programs/test_slow_decompression.c deleted file mode 100644 index d5ac26245b..0000000000 --- a/util/compress/libdeflate/programs/test_slow_decompression.c +++ /dev/null @@ -1,472 +0,0 @@ -/* - * test_slow_decompression.c - * - * Test how quickly libdeflate decompresses degenerate/malicious compressed data - * streams that start new Huffman blocks extremely frequently. - */ - -#include "test_util.h" - -/* - * Generate a DEFLATE stream containing all empty "static Huffman" blocks. - * - * libdeflate used to decompress this very slowly (~1000x slower than typical - * data), but now it's much faster (only ~2x slower than typical data) because - * now it skips rebuilding the decode tables for the static Huffman codes when - * they're already loaded into the decompressor. - */ -static void -generate_empty_static_huffman_blocks(u8 *p, size_t len) -{ - struct output_bitstream os = { .next = p, .end = p + len }; - - while (put_bits(&os, 0, 1) && /* BFINAL: 0 */ - put_bits(&os, 1, 2) && /* BTYPE: STATIC_HUFFMAN */ - put_bits(&os, 0, 7)) /* litlensym_256 (end-of-block) */ - ; -} - -static bool -generate_empty_dynamic_huffman_block(struct output_bitstream *os) -{ - int i; - - if (!put_bits(os, 0, 1)) /* BFINAL: 0 */ - return false; - if (!put_bits(os, 2, 2)) /* BTYPE: DYNAMIC_HUFFMAN */ - return false; - - /* - * Write a minimal Huffman code, then the end-of-block symbol. - * - * Litlen code: - * litlensym_256 (end-of-block) freq=1 len=1 codeword=0 - * Offset code: - * offsetsym_0 (unused) freq=0 len=1 codeword=0 - * - * Litlen and offset codeword lengths: - * [0..255] = 0 presym_{18,18} - * [256] = 1 presym_1 - * [257] = 1 presym_1 - * - * Precode: - * presym_1 freq=2 len=1 codeword=0 - * presym_18 freq=2 len=1 codeword=1 - */ - - if (!put_bits(os, 0, 5)) /* num_litlen_syms: 0 + 257 */ - return false; - if (!put_bits(os, 0, 5)) /* num_offset_syms: 0 + 1 */ - return false; - if (!put_bits(os, 14, 4)) /* num_explicit_precode_lens: 14 + 4 */ - return false; - /* - * Precode codeword lengths: order is - * [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] - */ - for (i = 0; i < 2; i++) { /* presym_{16,17}: len=0 */ - if (!put_bits(os, 0, 3)) - return false; - } - if (!put_bits(os, 1, 3)) /* presym_18: len=1 */ - return false; - for (i = 0; i < 14; i++) { /* presym_{0,...,14}: len=0 */ - if (!put_bits(os, 0, 3)) - return false; - } - if (!put_bits(os, 1, 3)) /* presym_1: len=1 */ - return false; - - /* Litlen and offset codeword lengths */ - for (i = 0; i < 2; i++) { - if (!put_bits(os, 1, 1) || /* presym_18, 128 zeroes */ - !put_bits(os, 117, 7)) - return false; - } - if (!put_bits(os, 0, 1)) /* presym_1 */ - return false; - if (!put_bits(os, 0, 1)) /* presym_1 */ - return false; - /* Done writing the Huffman codes */ - - return put_bits(os, 0, 1); /* litlensym_256 (end-of-block) */ -} - -/* - * Generate a DEFLATE stream containing all empty "dynamic Huffman" blocks. - * - * This is the worst known case currently, being ~100x slower to decompress than - * typical data. - */ -static void -generate_empty_dynamic_huffman_blocks(u8 *p, size_t len) -{ - struct output_bitstream os = { .next = p, .end = p + len }; - - while (generate_empty_dynamic_huffman_block(&os)) - ; -} - -#define NUM_ITERATIONS 100 - -static u64 -do_test_libdeflate(const char *input_type, const u8 *in, size_t in_nbytes, - u8 *out, size_t out_nbytes_avail) -{ - struct libdeflate_decompressor *d; - enum libdeflate_result res; - u64 t; - int i; - - d = libdeflate_alloc_decompressor(); - ASSERT(d != NULL); - - t = timer_ticks(); - for (i = 0; i < NUM_ITERATIONS; i++) { - res = libdeflate_deflate_decompress(d, in, in_nbytes, out, - out_nbytes_avail, NULL); - ASSERT(res == LIBDEFLATE_BAD_DATA || - res == LIBDEFLATE_INSUFFICIENT_SPACE); - } - t = timer_ticks() - t; - - printf("[%s, libdeflate]: %"PRIu64" KB/s\n", input_type, - timer_KB_per_s((u64)in_nbytes * NUM_ITERATIONS, t)); - - libdeflate_free_decompressor(d); - return t; -} - -static u64 -do_test_zlib(const char *input_type, const u8 *in, size_t in_nbytes, - u8 *out, size_t out_nbytes_avail) -{ - z_stream z; - int res; - u64 t; - int i; - - memset(&z, 0, sizeof(z)); - res = inflateInit2(&z, -15); - ASSERT(res == Z_OK); - - t = timer_ticks(); - for (i = 0; i < NUM_ITERATIONS; i++) { - inflateReset(&z); - z.next_in = (void *)in; - z.avail_in = in_nbytes; - z.next_out = out; - z.avail_out = out_nbytes_avail; - res = inflate(&z, Z_FINISH); - ASSERT(res == Z_BUF_ERROR || res == Z_DATA_ERROR); - } - t = timer_ticks() - t; - - printf("[%s, zlib ]: %"PRIu64" KB/s\n", input_type, - timer_KB_per_s((u64)in_nbytes * NUM_ITERATIONS, t)); - - inflateEnd(&z); - return t; -} - -/* - * Test case from https://github.com/ebiggers/libdeflate/issues/33 - * with the gzip header and footer removed to leave just the DEFLATE stream - */ -static const u8 orig_repro[3962] = - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a" - "\x6a\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20" - "\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11" - "\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48" - "\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80" - "\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea" - "\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea" - "\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48" - "\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20" - "\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11" - "\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x63" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92" - "\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48" - "\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20" - "\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea" - "\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48" - "\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11" - "\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11" - "\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63" - "\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea" - "\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x92\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a" - "\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80" - "\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00" - "\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x92\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a\x6a" - "\x6a\x6a\x6a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00" - "\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80" - "\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00" - "\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04" - "\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20" - "\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04" - "\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00" - "\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00" - "\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04" - "\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00" - "\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04" - "\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00" - "\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x92\x63\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00" - "\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92" - "\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x63\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00" - "\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80" - "\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00" - "\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92" - "\x63\x00\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04" - "\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00\x20" - "\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x00\xea\x04\x48\x00\x20\x80\x28" - "\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1a\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00" - "\xea\x04\x48\x00\x20\x80\x28\x00\x00\x11\x00\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b" - "\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x1b\x92\x63\x00\x04\xea\x48\x00\x20" - "\x80\x28\x00\x00\x11\x1b\x1b\x1b\x1b\x92\x63\x00\xea\x04\x48\x00" - "\x20\x80\x28\x00\x00\x11\x00\x00\x01\x04\x00\x3f\x00\x00\x00\x00" - "\x28\xf7\xff\x00\xff\xff\xff\xff\x00\x00"; - -int -tmain(int argc, tchar *argv[]) -{ - u8 in[4096]; - u8 out[10000]; - u64 t, tz; - - begin_program(argv); - - begin_performance_test(); - - /* static huffman case */ - generate_empty_static_huffman_blocks(in, sizeof(in)); - t = do_test_libdeflate("static huffman", in, sizeof(in), - out, sizeof(out)); - tz = do_test_zlib("static huffman", in, sizeof(in), out, sizeof(out)); - /* - * libdeflate is faster than zlib in this case, e.g. - * [static huffman, libdeflate]: 215861 KB/s - * [static huffman, zlib ]: 73651 KB/s - */ - putchar('\n'); - ASSERT(t < tz); - - /* dynamic huffman case */ - generate_empty_dynamic_huffman_blocks(in, sizeof(in)); - t = do_test_libdeflate("dynamic huffman", in, sizeof(in), - out, sizeof(out)); - tz = do_test_zlib("dynamic huffman", in, sizeof(in), out, sizeof(out)); - /* - * libdeflate is slower than zlib in this case, though not super bad. - * [dynamic huffman, libdeflate]: 6277 KB/s - * [dynamic huffman, zlib ]: 10419 KB/s - * FIXME: make it faster. - */ - putchar('\n'); - ASSERT(t < 4 * tz); - - /* original reproducer */ - t = do_test_libdeflate("original repro", orig_repro, sizeof(orig_repro), - out, sizeof(out)); - tz = do_test_zlib("original repro", orig_repro, sizeof(orig_repro), - out, sizeof(out)); - ASSERT(t < tz); - - return 0; -} diff --git a/util/compress/libdeflate/programs/test_trailing_bytes.c b/util/compress/libdeflate/programs/test_trailing_bytes.c deleted file mode 100644 index 92609ff466..0000000000 --- a/util/compress/libdeflate/programs/test_trailing_bytes.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * test_trailing_bytes.c - * - * Test that decompression correctly stops at the end of the first DEFLATE, - * zlib, or gzip stream, and doesn't process any additional trailing bytes. - */ - -#include "test_util.h" - -static const struct { - size_t (LIBDEFLATEAPI *compress)( - struct libdeflate_compressor *compressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail); - enum libdeflate_result (LIBDEFLATEAPI *decompress)( - struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_out_nbytes_ret); - enum libdeflate_result (LIBDEFLATEAPI *decompress_ex)( - struct libdeflate_decompressor *decompressor, - const void *in, size_t in_nbytes, - void *out, size_t out_nbytes_avail, - size_t *actual_in_nbytes_ret, - size_t *actual_out_nbytes_ret); -} codecs[] = { - { - .compress = libdeflate_deflate_compress, - .decompress = libdeflate_deflate_decompress, - .decompress_ex = libdeflate_deflate_decompress_ex, - }, { - .compress = libdeflate_zlib_compress, - .decompress = libdeflate_zlib_decompress, - .decompress_ex = libdeflate_zlib_decompress_ex, - }, { - .compress = libdeflate_gzip_compress, - .decompress = libdeflate_gzip_decompress, - .decompress_ex = libdeflate_gzip_decompress_ex, - } -}; - -int -tmain(int argc, tchar *argv[]) -{ - const size_t original_nbytes = 32768; - const size_t compressed_nbytes_total = 32768; - /* - * Don't use the full buffer for compressed data, because we want to - * test whether decompression can deal with additional trailing bytes. - * - * Note: we can't use a guarded buffer (i.e. a buffer where the byte - * after compressed_nbytes is unmapped) because the decompressor may - * read a few bytes beyond the end of the stream (but ultimately not - * actually use those bytes) as long as they are within the buffer. - */ - const size_t compressed_nbytes_avail = 30000; - size_t i; - u8 *original; - u8 *compressed; - u8 *decompressed; - struct libdeflate_compressor *c; - struct libdeflate_decompressor *d; - size_t compressed_nbytes; - enum libdeflate_result res; - size_t actual_compressed_nbytes; - size_t actual_decompressed_nbytes; - - begin_program(argv); - - ASSERT(compressed_nbytes_avail < compressed_nbytes_total); - - /* Prepare some dummy data to compress */ - original = xmalloc(original_nbytes); - ASSERT(original != NULL); - for (i = 0; i < original_nbytes; i++) - original[i] = (i % 123) + (i % 1023); - - compressed = xmalloc(compressed_nbytes_total); - ASSERT(compressed != NULL); - memset(compressed, 0, compressed_nbytes_total); - - decompressed = xmalloc(original_nbytes); - ASSERT(decompressed != NULL); - - c = libdeflate_alloc_compressor(6); - ASSERT(c != NULL); - - d = libdeflate_alloc_decompressor(); - ASSERT(d != NULL); - - for (i = 0; i < ARRAY_LEN(codecs); i++) { - compressed_nbytes = codecs[i].compress(c, original, - original_nbytes, - compressed, - compressed_nbytes_avail); - ASSERT(compressed_nbytes > 0); - ASSERT(compressed_nbytes <= compressed_nbytes_avail); - - /* Test decompress() of stream that fills the whole buffer */ - actual_decompressed_nbytes = 0; - memset(decompressed, 0, original_nbytes); - res = codecs[i].decompress(d, compressed, compressed_nbytes, - decompressed, original_nbytes, - &actual_decompressed_nbytes); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(actual_decompressed_nbytes == original_nbytes); - ASSERT(memcmp(decompressed, original, original_nbytes) == 0); - - /* Test decompress_ex() of stream that fills the whole buffer */ - actual_compressed_nbytes = actual_decompressed_nbytes = 0; - memset(decompressed, 0, original_nbytes); - res = codecs[i].decompress_ex(d, compressed, compressed_nbytes, - decompressed, original_nbytes, - &actual_compressed_nbytes, - &actual_decompressed_nbytes); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(actual_compressed_nbytes == compressed_nbytes); - ASSERT(actual_decompressed_nbytes == original_nbytes); - ASSERT(memcmp(decompressed, original, original_nbytes) == 0); - - /* Test decompress() of stream with trailing bytes */ - actual_decompressed_nbytes = 0; - memset(decompressed, 0, original_nbytes); - res = codecs[i].decompress(d, compressed, - compressed_nbytes_total, - decompressed, original_nbytes, - &actual_decompressed_nbytes); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(actual_decompressed_nbytes == original_nbytes); - ASSERT(memcmp(decompressed, original, original_nbytes) == 0); - - /* Test decompress_ex() of stream with trailing bytes */ - actual_compressed_nbytes = actual_decompressed_nbytes = 0; - memset(decompressed, 0, original_nbytes); - res = codecs[i].decompress_ex(d, compressed, - compressed_nbytes_total, - decompressed, original_nbytes, - &actual_compressed_nbytes, - &actual_decompressed_nbytes); - ASSERT(res == LIBDEFLATE_SUCCESS); - ASSERT(actual_compressed_nbytes == compressed_nbytes); - ASSERT(actual_decompressed_nbytes == original_nbytes); - ASSERT(memcmp(decompressed, original, original_nbytes) == 0); - } - - free(original); - free(compressed); - free(decompressed); - libdeflate_free_compressor(c); - libdeflate_free_decompressor(d); - return 0; -} diff --git a/util/compress/libdeflate/programs/test_util.c b/util/compress/libdeflate/programs/test_util.c deleted file mode 100644 index 20e7c217f6..0000000000 --- a/util/compress/libdeflate/programs/test_util.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * test_util.c - utility functions for test programs - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef _WIN32 -/* for MAP_ANONYMOUS or MAP_ANON, which unfortunately aren't part of POSIX... */ -# undef _POSIX_C_SOURCE -# ifdef __APPLE__ -# define _DARWIN_C_SOURCE -# elif defined(__linux__) -# define _GNU_SOURCE -# endif -#endif - -#include "test_util.h" - -#include -#include -#ifdef _WIN32 -# include -#else -# include -# include -# include -#endif - -#ifndef MAP_ANONYMOUS -# define MAP_ANONYMOUS MAP_ANON -#endif - -/* Abort with an error message */ -_noreturn void -assertion_failed(const char *expr, const char *file, int line) -{ - msg("Assertion failed: %s at %s:%d", expr, file, line); - abort(); -} - -void -begin_performance_test(void) -{ - /* Skip performance tests by default, since they can be flaky. */ - if (getenv("INCLUDE_PERF_TESTS") == NULL) - exit(0); -} - -static size_t -get_page_size(void) -{ -#ifdef _WIN32 - SYSTEM_INFO info; - - GetSystemInfo(&info); - return info.dwPageSize; -#else - return sysconf(_SC_PAGESIZE); -#endif -} - -/* Allocate a buffer with guard pages */ -void -alloc_guarded_buffer(size_t size, u8 **start_ret, u8 **end_ret) -{ - const size_t pagesize = get_page_size(); - const size_t nr_pages = (size + pagesize - 1) / pagesize; - u8 *base_addr; - u8 *start, *end; -#ifdef _WIN32 - DWORD oldProtect; -#endif - - *start_ret = NULL; - *end_ret = NULL; - -#ifdef _WIN32 - /* Allocate buffer and guard pages with no access. */ - base_addr = VirtualAlloc(NULL, (nr_pages + 2) * pagesize, - MEM_COMMIT | MEM_RESERVE, PAGE_NOACCESS); - if (!base_addr) { - msg("Unable to allocate memory (VirtualAlloc): Windows error %u", - (unsigned int)GetLastError()); - ASSERT(0); - } - start = base_addr + pagesize; - end = start + (nr_pages * pagesize); - - /* Grant read+write access to just the buffer. */ - if (!VirtualProtect(start, end - start, PAGE_READWRITE, &oldProtect)) { - msg("Unable to protect memory (VirtualProtect): Windows error %u", - (unsigned int)GetLastError()); - VirtualFree(base_addr, 0, MEM_RELEASE); - ASSERT(0); - } -#else - /* Allocate buffer and guard pages. */ - base_addr = mmap(NULL, (nr_pages + 2) * pagesize, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - if (base_addr == (u8 *)MAP_FAILED) { - msg_errno("Unable to allocate memory (anonymous mmap)"); - ASSERT(0); - } - start = base_addr + pagesize; - end = start + (nr_pages * pagesize); - - /* Unmap the guard pages. */ - munmap(base_addr, pagesize); - munmap(end, pagesize); -#endif - *start_ret = start; - *end_ret = end; -} - -/* Free a buffer that was allocated by alloc_guarded_buffer() */ -void -free_guarded_buffer(u8 *start, u8 *end) -{ - if (!start) - return; -#ifdef _WIN32 - VirtualFree(start - get_page_size(), 0, MEM_RELEASE); -#else - munmap(start, end - start); -#endif -} - -/* - * Return the number of timer ticks that have elapsed since some unspecified - * point fixed at the start of program execution - */ -u64 -timer_ticks(void) -{ -#ifdef _WIN32 - LARGE_INTEGER count; - - QueryPerformanceCounter(&count); - return count.QuadPart; -#elif defined(HAVE_CLOCK_GETTIME) - struct timespec ts; - - clock_gettime(CLOCK_MONOTONIC, &ts); - return (1000000000 * (u64)ts.tv_sec) + ts.tv_nsec; -#else - struct timeval tv; - - gettimeofday(&tv, NULL); - return (1000000 * (u64)tv.tv_sec) + tv.tv_usec; -#endif -} - -/* - * Return the number of timer ticks per second - */ -static u64 -timer_frequency(void) -{ -#ifdef _WIN32 - LARGE_INTEGER freq; - - QueryPerformanceFrequency(&freq); - return freq.QuadPart; -#elif defined(HAVE_CLOCK_GETTIME) - return 1000000000; -#else - return 1000000; -#endif -} - -/* - * Convert a number of elapsed timer ticks to milliseconds - */ -u64 timer_ticks_to_ms(u64 ticks) -{ - return ticks * 1000 / timer_frequency(); -} - -/* - * Convert a byte count and a number of elapsed timer ticks to MB/s - */ -u64 timer_MB_per_s(u64 bytes, u64 ticks) -{ - return bytes * timer_frequency() / ticks / 1000000; -} - -/* - * Convert a byte count and a number of elapsed timer ticks to KB/s - */ -u64 timer_KB_per_s(u64 bytes, u64 ticks) -{ - return bytes * timer_frequency() / ticks / 1000; -} - -bool -put_bits(struct output_bitstream *os, machine_word_t bits, int num_bits) -{ - os->bitbuf |= bits << os->bitcount; - os->bitcount += num_bits; - while (os->bitcount >= 8) { - if (os->next == os->end) - return false; - *os->next++ = os->bitbuf; - os->bitcount -= 8; - os->bitbuf >>= 8; - } - return true; -} - -bool -flush_bits(struct output_bitstream *os) -{ - while (os->bitcount > 0) { - if (os->next == os->end) - return false; - *os->next++ = os->bitbuf; - os->bitcount -= 8; - os->bitbuf >>= 8; - } - os->bitcount = 0; - return true; -} diff --git a/util/compress/libdeflate/programs/test_util.h b/util/compress/libdeflate/programs/test_util.h deleted file mode 100644 index e10c154a26..0000000000 --- a/util/compress/libdeflate/programs/test_util.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * test_util.h - utility functions for test programs - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef PROGRAMS_TEST_UTIL_H -#define PROGRAMS_TEST_UTIL_H - -#include "prog_util.h" - -#include /* for comparison purposes */ - -#ifdef __GNUC__ -# define _noreturn __attribute__((noreturn)) -#else -# define _noreturn -#endif - -void _noreturn -assertion_failed(const char *expr, const char *file, int line); - -#define ASSERT(expr) { if (unlikely(!(expr))) \ - assertion_failed(#expr, __FILE__, __LINE__); } - -void begin_performance_test(void); - -void alloc_guarded_buffer(size_t size, u8 **start_ret, u8 **end_ret); -void free_guarded_buffer(u8 *start, u8 *end); - -u64 timer_ticks(void); -u64 timer_ticks_to_ms(u64 ticks); -u64 timer_MB_per_s(u64 bytes, u64 ticks); -u64 timer_KB_per_s(u64 bytes, u64 ticks); - -struct output_bitstream { - machine_word_t bitbuf; - int bitcount; - u8 *next; - u8 *end; -}; - -bool put_bits(struct output_bitstream *os, machine_word_t bits, int num_bits); -bool flush_bits(struct output_bitstream *os); - -#endif /* PROGRAMS_TEST_UTIL_H */ diff --git a/util/compress/libdeflate/programs/tgetopt.c b/util/compress/libdeflate/programs/tgetopt.c deleted file mode 100644 index 868600d979..0000000000 --- a/util/compress/libdeflate/programs/tgetopt.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * tgetopt.c - portable replacement for GNU getopt() - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "prog_util.h" - -tchar *toptarg; -int toptind = 1, topterr = 1, toptopt; - -/* - * This is a simple implementation of getopt(). It can be compiled with either - * 'char' or 'wchar_t' as the character type. - * - * Do *not* use this implementation if you need any of the following features, - * as they are not supported: - * - Long options - * - Option-related arguments retained in argv, not nulled out - * - '+' and '-' characters in optstring - */ -int -tgetopt(int argc, tchar *argv[], const tchar *optstring) -{ - static tchar empty[1]; - static tchar *nextchar; - static bool done; - - if (toptind == 1) { - /* Starting to scan a new argument vector */ - nextchar = NULL; - done = false; - } - - while (!done && (nextchar != NULL || toptind < argc)) { - if (nextchar == NULL) { - /* Scanning a new argument */ - tchar *arg = argv[toptind++]; - if (arg[0] == '-' && arg[1] != '\0') { - if (arg[1] == '-' && arg[2] == '\0') { - /* All args after "--" are nonoptions */ - argv[toptind - 1] = NULL; - done = true; - } else { - /* Start of short option characters */ - nextchar = &arg[1]; - } - } - } else { - /* More short options in previous arg */ - tchar opt = *nextchar; - tchar *p = tstrchr(optstring, opt); - if (p == NULL) { - if (topterr) - msg("invalid option -- '%"TC"'", opt); - toptopt = opt; - return '?'; - } - /* 'opt' is a valid short option character */ - nextchar++; - toptarg = NULL; - if (*(p + 1) == ':') { - /* 'opt' can take an argument */ - if (*nextchar != '\0') { - /* Optarg is in same argv argument */ - toptarg = nextchar; - nextchar = empty; - } else if (toptind < argc && *(p + 2) != ':') { - /* Optarg is next argv argument */ - argv[toptind - 1] = NULL; - toptarg = argv[toptind++]; - } else if (*(p + 2) != ':') { - if (topterr && *optstring != ':') { - msg("option requires an " - "argument -- '%"TC"'", opt); - } - toptopt = opt; - opt = (*optstring == ':') ? ':' : '?'; - } - } - if (*nextchar == '\0') { - argv[toptind - 1] = NULL; - nextchar = NULL; - } - return opt; - } - } - - /* Done scanning. Move all nonoptions to the end, set optind to the - * index of the first nonoption, and return -1. */ - toptind = argc; - while (--argc > 0) - if (argv[argc] != NULL) - argv[--toptind] = argv[argc]; - done = true; - return -1; -} diff --git a/util/compress/libdeflate/scripts/afl-fuzz/Makefile b/util/compress/libdeflate/scripts/afl-fuzz/Makefile deleted file mode 100644 index c819797ba4..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -SRC := $(wildcard */*.c) -EXE := $(SRC:.c=) - -CFLAGS := -O2 -s -LDLIBS := -ldeflate -LDFLAGS := -L../.. -CPPFLAGS := -I../.. - -all:$(EXE) - -clean: - rm -f $(EXE) diff --git a/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/fuzz.c b/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/fuzz.c deleted file mode 100644 index d65d17e056..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/fuzz.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - struct libdeflate_decompressor *d; - struct libdeflate_compressor *c; - int ret; - int fd = open(argv[1], O_RDONLY); - struct stat stbuf; - assert(fd >= 0); - ret = fstat(fd, &stbuf); - assert(!ret); - - char in[stbuf.st_size]; - ret = read(fd, in, sizeof in); - assert(ret == sizeof in); - - c = libdeflate_alloc_compressor(6); - d = libdeflate_alloc_decompressor(); - - char out[sizeof(in)]; - char checkarray[sizeof(in)]; - - size_t csize = libdeflate_deflate_compress(c, in,sizeof in, out, sizeof out); - if (csize) { - enum libdeflate_result res; - res = libdeflate_deflate_decompress(d, out, csize, checkarray, sizeof in, NULL); - assert(!res); - assert(!memcmp(in, checkarray, sizeof in)); - } - - libdeflate_free_compressor(c); - libdeflate_free_decompressor(d); - return 0; -} diff --git a/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/inputs/0 b/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/inputs/0 deleted file mode 100644 index 875bce73ad..0000000000 Binary files a/util/compress/libdeflate/scripts/afl-fuzz/deflate_compress/inputs/0 and /dev/null differ diff --git a/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/fuzz.c b/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/fuzz.c deleted file mode 100644 index 8cc4ce55cd..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/fuzz.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - struct libdeflate_decompressor *d; - int ret; - int fd = open(argv[1], O_RDONLY); - struct stat stbuf; - assert(fd >= 0); - ret = fstat(fd, &stbuf); - assert(!ret); - - char in[stbuf.st_size]; - ret = read(fd, in, sizeof in); - assert(ret == sizeof in); - - char out[sizeof(in) * 3]; - - d = libdeflate_alloc_decompressor(); - - libdeflate_deflate_decompress(d, in, sizeof in, out, sizeof out, NULL); - libdeflate_free_decompressor(d); - return 0; -} diff --git a/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/inputs/0 b/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/inputs/0 deleted file mode 100644 index 19e3a346e7..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/deflate_decompress/inputs/0 +++ /dev/null @@ -1,3 +0,0 @@ -u1 -@EgBl5 -V6jX{i=l=Οl?tD =G% 2xԇ7eDs[Ukq |R/뮰*FMzv`r1B,lDuYj#0<՞20hE`IW \ No newline at end of file diff --git a/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/fuzz.c b/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/fuzz.c deleted file mode 100644 index aec50804cf..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/fuzz.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - struct libdeflate_decompressor *d; - int ret; - int fd = open(argv[1], O_RDONLY); - struct stat stbuf; - assert(fd >= 0); - ret = fstat(fd, &stbuf); - assert(!ret); - - char in[stbuf.st_size]; - ret = read(fd, in, sizeof in); - assert(ret == sizeof in); - - char out[sizeof(in) * 3]; - - d = libdeflate_alloc_decompressor(); - - libdeflate_gzip_decompress(d, in, sizeof in, out, sizeof out, NULL); - libdeflate_free_decompressor(d); - return 0; -} diff --git a/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/inputs/0 b/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/inputs/0 deleted file mode 100644 index 813c75359a..0000000000 Binary files a/util/compress/libdeflate/scripts/afl-fuzz/gzip_decompress/inputs/0 and /dev/null differ diff --git a/util/compress/libdeflate/scripts/afl-fuzz/prepare_for_fuzz.sh b/util/compress/libdeflate/scripts/afl-fuzz/prepare_for_fuzz.sh deleted file mode 100755 index 06911c18bf..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/prepare_for_fuzz.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -set -e - -make -C ../../ clean -make clean -AFL_HARDEN=1 make CC=afl-gcc -C ../../ -AFL_HARDEN=1 make CC=afl-gcc - -for dir in $(find . -mindepth 1 -maxdepth 1 -type d); do - rm -rf /tmp/$dir - cp -va $dir /tmp/$dir - mkdir -p /tmp/$dir/outputs -done diff --git a/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/fuzz.c b/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/fuzz.c deleted file mode 100644 index 797343bbfb..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/fuzz.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - struct libdeflate_decompressor *d; - int ret; - int fd = open(argv[1], O_RDONLY); - struct stat stbuf; - assert(fd >= 0); - ret = fstat(fd, &stbuf); - assert(!ret); - - char in[stbuf.st_size]; - ret = read(fd, in, sizeof in); - assert(ret == sizeof in); - - char out[sizeof(in) * 3]; - - d = libdeflate_alloc_decompressor(); - - libdeflate_zlib_decompress(d, in, sizeof in, out, sizeof out, NULL); - libdeflate_free_decompressor(d); - return 0; -} diff --git a/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/inputs/0 b/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/inputs/0 deleted file mode 100644 index 292e9726d7..0000000000 --- a/util/compress/libdeflate/scripts/afl-fuzz/zlib_decompress/inputs/0 +++ /dev/null @@ -1,3 +0,0 @@ -xu1 -@EgBl5 -V6jX{i=l=Οl?tD =G% 2xԇ7eDs[Ukq |R/뮰*FMzv`r1B,lDuYj#0<՞20hE`IW- \ No newline at end of file diff --git a/util/compress/libdeflate/scripts/android_build.sh b/util/compress/libdeflate/scripts/android_build.sh deleted file mode 100755 index 204ead2dce..0000000000 --- a/util/compress/libdeflate/scripts/android_build.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail - -API_LEVEL=28 -ARCH=arm64 -CFLAGS= -ENABLE_CRC=false -ENABLE_CRYPTO=false -NDKDIR=$HOME/android-ndk-r21d - -usage() { - cat << EOF -Usage: $0 [OPTION]... -- [MAKE_TARGET]... -Build libdeflate for Android. - - --api-level=LEVEL Android API level to target (default: $API_LEVEL) - --arch=ARCH Architecture: arm32|arm64 (default: $ARCH) - --enable-crc Enable crc instructions - --enable-crypto Enable crypto instructions - --ndkdir=NDKDIR Android NDK directory (default: $NDKDIR) -EOF -} -if ! options=$(getopt -o '' \ - -l 'api-level:,arch:,enable-crc,enable-crypto,help,ndkdir:' -- "$@"); then - usage 1>&2 - exit 1 -fi - -eval set -- "$options" - -while [ $# -gt 0 ]; do - case "$1" in - --api-level) - API_LEVEL="$2" - shift - ;; - --arch) - ARCH="$2" - shift - ;; - --enable-crc) - ENABLE_CRC=true - ;; - --enable-crypto) - ENABLE_CRYPTO=true - ;; - --help) - usage - exit 0 - ;; - --ndkdir) - NDKDIR="$2" - shift - ;; - --) - shift - break - ;; - *) - echo 1>&2 "Unknown option \"$1\"" - usage 1>&2 - exit 1 - esac - shift -done - -BINDIR=$NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin/ - -case "$ARCH" in -arm|arm32|aarch32) - CC=$BINDIR/armv7a-linux-androideabi$API_LEVEL-clang - if $ENABLE_CRC || $ENABLE_CRYPTO; then - CFLAGS="-march=armv8-a" - if $ENABLE_CRC; then - CFLAGS+=" -mcrc" - else - CFLAGS+=" -mnocrc" - fi - if $ENABLE_CRYPTO; then - CFLAGS+=" -mfpu=crypto-neon-fp-armv8" - else - CFLAGS+=" -mfpu=neon" - fi - fi - ;; -arm64|aarch64) - CC=$BINDIR/aarch64-linux-android$API_LEVEL-clang - features="" - if $ENABLE_CRC; then - features+="+crc" - fi - if $ENABLE_CRYPTO; then - features+="+crypto" - fi - if [ -n "$features" ]; then - CFLAGS="-march=armv8-a$features" - fi - ;; -*) - echo 1>&2 "Unknown architecture: \"$ARCH\"" - usage 1>&2 - exit 1 -esac - -cmd=(make "-j$(grep -c processor /proc/cpuinfo)" "CC=$CC" "CFLAGS=$CFLAGS" "$@") -echo "${cmd[*]}" -"${cmd[@]}" diff --git a/util/compress/libdeflate/scripts/android_tests.sh b/util/compress/libdeflate/scripts/android_tests.sh deleted file mode 100755 index fe70ce9063..0000000000 --- a/util/compress/libdeflate/scripts/android_tests.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# -# Test libdeflate on a connected arm64 Android device. -# Requires the Android NDK (release 19 or later) and adb. - -set -eu -o pipefail -cd "$(dirname "$0")/.." - -if [ $# -ne 0 ]; then - echo 1>&2 "Usage: $0" - exit 2 -fi - -# Use NDKDIR if specified in environment, else use default value. -: "${NDKDIR:=$HOME/android-ndk-r21d}" -if [ ! -e "$NDKDIR" ]; then - cat 1>&2 << EOF -Android NDK was not found in NDKDIR=$NDKDIR! Set the -environmental variable NDKDIR to the location of your Android NDK installation. -EOF - exit 1 -fi - -CLEANUP_CMDS=() -cleanup() { - for cmd in "${CLEANUP_CMDS[@]}"; do - eval "$cmd" - done -} -trap cleanup EXIT - -# Use TESTDATA if specified in environment, else generate it. -if [ -z "${TESTDATA:-}" ]; then - # Generate default TESTDATA file. - TESTDATA=$(mktemp -t libdeflate_testdata.XXXXXXXXXX) - export TESTDATA - CLEANUP_CMDS+=("rm -f '$TESTDATA'") - find . '(' -name '*.c' -o -name '*.h' -o -name '*.sh' ')' \ - -exec cat '{}' ';' | head -c 1000000 > "$TESTDATA" -fi - -TMPDIR=$(mktemp -d -t libdeflate_test.XXXXXXXXX) -CLEANUP_CMDS+=("rm -r '$TMPDIR'") - -android_build_and_test() { - echo "Running Android tests with $*" - - ./scripts/android_build.sh --ndkdir="$NDKDIR" "$@" \ - all test_programs > /dev/null - adb push "$TESTDATA" ./scripts/exec_tests.sh benchmark test_* \ - /data/local/tmp/ > /dev/null - - # Note: adb shell always returns 0, even if the shell command fails... - adb shell "cd /data/local/tmp && WRAPPER= TESTDATA=$(basename "$TESTDATA") sh exec_tests.sh" \ - > "$TMPDIR/adb.out" - if ! grep -q "exec_tests finished successfully" "$TMPDIR/adb.out"; then - echo 1>&2 "Android test failure! adb shell output:" - cat "$TMPDIR/adb.out" - exit 1 - fi -} - -for arch in arm32 arm64; do - android_build_and_test --arch=$arch - android_build_and_test --arch=$arch --enable-crc - android_build_and_test --arch=$arch --enable-crypto - android_build_and_test --arch=$arch --enable-crc --enable-crypto -done -echo "Android tests passed" diff --git a/util/compress/libdeflate/scripts/checksum_benchmarks.sh b/util/compress/libdeflate/scripts/checksum_benchmarks.sh deleted file mode 100755 index 23b5984eb0..0000000000 --- a/util/compress/libdeflate/scripts/checksum_benchmarks.sh +++ /dev/null @@ -1,167 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail - -have_cpu_feature() { - local feature="$1" - local tag - case $ARCH in - arm*|aarch*) - tag="Features" - ;; - *) - tag="flags" - ;; - esac - grep -q "^$tag"$'[ \t]'"*:.*\<$feature\>" /proc/cpuinfo -} - -make_and_test() { - # Build the checksum program and tests. Set the special test support - # flag to get support for LIBDEFLATE_DISABLE_CPU_FEATURES. - make "$@" TEST_SUPPORT__DO_NOT_USE=1 checksum test_checksums > /dev/null - - # Run the checksum tests, for good measure. (This isn't actually part - # of the benchmarking.) - ./test_checksums > /dev/null -} - -__do_benchmark() { - local impl="$1" speed - shift - local flags=("$@") - - speed=$(./checksum "${CKSUM_FLAGS[@]}" "${flags[@]}" -t "$FILE" | \ - grep -o '[0-9]\+ MB/s' | grep -o '[0-9]\+') - printf "%-45s%-10s\n" "$CKSUM_NAME ($impl)" "$speed" -} - -do_benchmark() { - local impl="$1" - - if [ "$impl" = zlib ]; then - __do_benchmark "$impl" "-Z" - else - make_and_test CFLAGS="${EXTRA_CFLAGS[*]}" - __do_benchmark "libdeflate, $impl" - if [ "$ARCH" = x86_64 ]; then - make_and_test CFLAGS="-m32 ${EXTRA_CFLAGS[*]}" - __do_benchmark "libdeflate, $impl, 32-bit" - fi - fi -} - -sort_by_speed() { - awk '{print $NF, $0}' | sort -nr | cut -f2- -d' ' -} - -disable_cpu_feature() { - local name="$1" - shift - local extra_cflags=("$@") - - LIBDEFLATE_DISABLE_CPU_FEATURES+=",$name" - EXTRA_CFLAGS+=("${extra_cflags[@]}") -} - -cleanup() { - if $USING_TMPFILE; then - rm "$FILE" - fi -} - -ARCH="$(uname -m)" -USING_TMPFILE=false - -if (( $# > 1 )); then - echo "Usage: $0 [FILE]" 1>&2 - exit 1 -fi - -trap cleanup EXIT - -if (( $# == 0 )); then - # Generate default test data file. - FILE=$(mktemp -t checksum_testdata.XXXXXXXXXX) - USING_TMPFILE=true - echo "Generating 100 MB test file: $FILE" - head -c 100000000 /dev/urandom > "$FILE" -else - FILE="$1" -fi - -cat << EOF -Method Speed (MB/s) ------- ------------ -EOF - -# CRC-32 -CKSUM_NAME="CRC-32" -CKSUM_FLAGS=() -EXTRA_CFLAGS=() -export LIBDEFLATE_DISABLE_CPU_FEATURES="" -{ -case $ARCH in -i386|x86_64) - if have_cpu_feature pclmulqdq && have_cpu_feature avx; then - do_benchmark "PCLMUL/AVX" - disable_cpu_feature "avx" "-mno-avx" - fi - if have_cpu_feature pclmulqdq; then - do_benchmark "PCLMUL" - disable_cpu_feature "pclmul" "-mno-pclmul" - fi - ;; -arm*|aarch*) - if have_cpu_feature crc32; then - do_benchmark "ARM" - disable_cpu_feature "crc32" "-march=armv8-a+nocrc" - fi - if have_cpu_feature pmull; then - do_benchmark "PMULL" - disable_cpu_feature "pmull" "-march=armv8-a+nocrc+nocrypto" - fi - ;; -esac -do_benchmark "generic" -do_benchmark "zlib" -} | sort_by_speed - -# Adler-32 -CKSUM_NAME="Adler-32" -CKSUM_FLAGS=(-A) -EXTRA_CFLAGS=() -export LIBDEFLATE_DISABLE_CPU_FEATURES="" -echo -{ -case $ARCH in -i386|x86_64) - if have_cpu_feature avx512bw; then - do_benchmark "AVX-512BW" - disable_cpu_feature "avx512bw" "-mno-avx512bw" - fi - if have_cpu_feature avx2; then - do_benchmark "AVX2" - disable_cpu_feature "avx2" "-mno-avx2" - fi - if have_cpu_feature sse2; then - do_benchmark "SSE2" - disable_cpu_feature "sse2" "-mno-sse2" - fi - ;; -arm*) - if have_cpu_feature neon; then - do_benchmark "NEON" - disable_cpu_feature "neon" "-mfpu=vfpv3" - fi - ;; -aarch*) - if have_cpu_feature asimd; then - do_benchmark "NEON" - disable_cpu_feature "neon" "-march=armv8-a+nosimd" - fi - ;; -esac -do_benchmark "generic" -do_benchmark "zlib" -} | sort_by_speed diff --git a/util/compress/libdeflate/scripts/detect.sh b/util/compress/libdeflate/scripts/detect.sh deleted file mode 100755 index 93064b8b22..0000000000 --- a/util/compress/libdeflate/scripts/detect.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh - -set -eu - -# Use CC if specified in environment, else default to "cc". -: "${CC:=cc}" - -# Use CFLAGS if specified in environment. -: "${CFLAGS:=}" - -echo "/* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. */" -echo "#ifndef CONFIG_H" -echo "#define CONFIG_H" - -program_compiles() { - echo "$1" | $CC $CFLAGS -Wno-error -x c - -o /dev/null > /dev/null 2>&1 -} - -check_function() { - funcname=$1 - macro="HAVE_$(echo "$funcname" | tr '[:lower:]' '[:upper:]')" - - echo - echo "/* Is the $funcname() function available? */" - if program_compiles "int main() { $funcname(); }"; then - echo "#define $macro 1" - else - echo "/* $macro is not set */" - fi -} - -have_stat_field() { - program_compiles "#include - #include - int main() { struct stat st; st.$1; }" -} - -check_stat_nanosecond_precision() { - echo - echo "/* Does stat() provide nanosecond-precision timestamps? */" - if have_stat_field st_atim; then - echo "#define HAVE_STAT_NANOSECOND_PRECISION 1" - elif have_stat_field st_atimespec; then - # Nonstandard field names used by OS X and older BSDs - echo "#define HAVE_STAT_NANOSECOND_PRECISION 1" - echo "#define st_atim st_atimespec" - echo "#define st_mtim st_mtimespec" - echo "#define st_ctim st_ctimespec" - else - echo "/* HAVE_STAT_NANOSECOND_PRECISION is not set */" - fi -} - -check_function clock_gettime -check_function futimens -check_function futimes -check_function posix_fadvise -check_function posix_madvise - -check_stat_nanosecond_precision - -echo -echo "#endif /* CONFIG_H */" diff --git a/util/compress/libdeflate/scripts/exec_tests.sh b/util/compress/libdeflate/scripts/exec_tests.sh deleted file mode 100644 index c748e423e2..0000000000 --- a/util/compress/libdeflate/scripts/exec_tests.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -# -# Helper script used by run_tests.sh and android_tests.sh, -# not intended to be run directly -# - -set -eu - -run_cmd() { - echo "$WRAPPER $*" - $WRAPPER "$@" > /dev/null -} - -for prog in ./test_*; do - run_cmd "$prog" -done - -for format in '' '-g' '-z'; do - for ref_impl in '' '-Y' '-Z'; do - run_cmd ./benchmark $format $ref_impl "$TESTDATA" - done -done -for level in 0 1 3 7 9; do - for ref_impl in '' '-Y'; do - run_cmd ./benchmark -$level $ref_impl "$TESTDATA" - done -done -for level in 0 1 3 7 9 12; do - for ref_impl in '' '-Z'; do - run_cmd ./benchmark -$level $ref_impl "$TESTDATA" - done -done - -echo "exec_tests finished successfully" # Needed for 'adb shell' diff --git a/util/compress/libdeflate/scripts/gen_crc32_multipliers.c b/util/compress/libdeflate/scripts/gen_crc32_multipliers.c deleted file mode 100644 index c607d73f81..0000000000 --- a/util/compress/libdeflate/scripts/gen_crc32_multipliers.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * gen_crc32_multipliers.c - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include - -/* generator polynomial G(x) */ -#define CRCPOLY 0xEDB88320 /* G(x) without x^32 term */ -#define CRCPOLY_FULL (((uint64_t)CRCPOLY << 1) | 1) /* G(x) */ - -/* Compute x^D mod G(x) */ -static uint32_t -compute_multiplier(int D) -{ - /* Start with x^0 mod G(x) */ - uint32_t remainder = 0x80000000; - - /* Each iteration, 'remainder' becomes x^i mod G(x) */ - for (int i = 1; i <= D; i++) - remainder = (remainder >> 1) ^ ((remainder & 1) ? CRCPOLY : 0); - - /* Now 'remainder' is x^D mod G(x) */ - return remainder; -} - -/* Compute floor(x^64 / G(x)) */ -static uint64_t -compute_barrett_reduction_constant(void) -{ - uint64_t quotient = 0; - uint64_t dividend = 0x1; - - for (int i = 0; i < 64 - 32 + 1; i++) { - if ((dividend >> i) & 1) { - quotient |= (uint64_t)1 << i; - dividend ^= CRCPOLY_FULL << i; - } - } - - return quotient; -} - -/* - * This program computes the constant multipliers needed for carryless - * multiplication accelerated CRC-32. It assumes 128-bit vectors divided into - * two 64-bit halves which are multiplied separately with different 32-bit - * multipliers, producing two 95-bit products. For a given number of 128-bit - * vectors per iteration, the program outputs a pair of multipliers, one for - * each 64-bit half. - * - * Careful: all polynomials are "bit-reversed", meaning that the low-order bits - * have the highest degree and the high-order bits have the lowest degree! - */ -int -main(void) -{ - printf("\t/* Constants precomputed by gen_crc32_multipliers.c. " - "Do not edit! */\n"); - - /* High and low multipliers for each needed vector count */ - for (int order = 2; order >= 0; order--) { - int vecs_per_iteration = 1 << order; - int right = (128 * vecs_per_iteration) + 95; - printf("\tconst __v2di multipliers_%d = (__v2di)" - "{ 0x%08"PRIX32", 0x%08"PRIX32" };\n", - vecs_per_iteration, - compute_multiplier(right - 64) /* higher degree half */, - compute_multiplier(right - 128) /* lower degree half */); - } - - /* Multiplier for final 96 => 64 bit fold */ - printf("\tconst __v2di final_multiplier = (__v2di){ 0x%08"PRIX32" };\n", - compute_multiplier(63)); - - /* 32-bit mask */ - printf("\tconst __m128i mask32 = (__m128i)(__v4si){ 0xFFFFFFFF };\n"); - - /* Constants for final 64 => 32 bit reduction */ - printf("\tconst __v2di barrett_reduction_constants =\n" - "\t\t\t(__v2di){ 0x%016"PRIX64", 0x%016"PRIX64" };\n", - compute_barrett_reduction_constant(), CRCPOLY_FULL); - - return 0; -} diff --git a/util/compress/libdeflate/scripts/gen_crc32_table.c b/util/compress/libdeflate/scripts/gen_crc32_table.c deleted file mode 100644 index ab39376a70..0000000000 --- a/util/compress/libdeflate/scripts/gen_crc32_table.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * gen_crc32_table.c - a program for CRC-32 table generation - * - * Originally public domain; changes after 2016-09-07 are copyrighted. - * - * Copyright 2016 Eric Biggers - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - -#include -#include - -static uint32_t crc32_table[0x800]; - -static uint32_t -crc32_update_bit(uint32_t remainder, uint8_t next_bit) -{ - return (remainder >> 1) ^ - (((remainder ^ next_bit) & 1) ? 0xEDB88320 : 0); -} - -static uint32_t -crc32_update_byte(uint32_t remainder, uint8_t next_byte) -{ - for (int j = 0; j < 8; j++, next_byte >>= 1) - remainder = crc32_update_bit(remainder, next_byte & 1); - return remainder; -} - -static void -print_256_entries(const uint32_t *entries) -{ - for (size_t i = 0; i < 256 / 4; i++) { - printf("\t"); - for (size_t j = 0; j < 4; j++) { - printf("0x%08x,", entries[i * 4 + j]); - if (j != 3) - printf(" "); - } - printf("\n"); - } -} - -int -main(void) -{ - /* crc32_table[i] for 0 <= i < 0x100 is the CRC-32 of byte i. */ - for (int i = 0; i < 0x100; i++) - crc32_table[i] = crc32_update_byte(0, i); - - /* crc32_table[i] for 0x100 <= i < 0x800 is the CRC-32 of byte i % 0x100 - * followed by i / 0x100 zero bytes. */ - for (int i = 0x100; i < 0x800; i++) - crc32_table[i] = crc32_update_byte(crc32_table[i - 0x100], 0); - - printf("/*\n"); - printf(" * crc32_table.h - data table to accelerate CRC-32 computation\n"); - printf(" *\n"); - printf(" * THIS FILE WAS AUTOMATICALLY GENERATED " - "BY gen_crc32_table.c. DO NOT EDIT.\n"); - printf(" */\n"); - printf("\n"); - printf("#include \n"); - printf("\n"); - printf("static const uint32_t crc32_table[] = {\n"); - print_256_entries(&crc32_table[0x000]); - printf("#if defined(CRC32_SLICE4) || defined(CRC32_SLICE8)\n"); - print_256_entries(&crc32_table[0x100]); - print_256_entries(&crc32_table[0x200]); - print_256_entries(&crc32_table[0x300]); - printf("#endif /* CRC32_SLICE4 || CRC32_SLICE8 */\n"); - printf("#if defined(CRC32_SLICE8)\n"); - print_256_entries(&crc32_table[0x400]); - print_256_entries(&crc32_table[0x500]); - print_256_entries(&crc32_table[0x600]); - print_256_entries(&crc32_table[0x700]); - printf("#endif /* CRC32_SLICE8 */\n"); - printf("};\n"); - return 0; -} diff --git a/util/compress/libdeflate/scripts/gzip_tests.sh b/util/compress/libdeflate/scripts/gzip_tests.sh deleted file mode 100755 index 58fe325bb2..0000000000 --- a/util/compress/libdeflate/scripts/gzip_tests.sh +++ /dev/null @@ -1,490 +0,0 @@ -#!/bin/bash -# -# Test script for libdeflate's gzip and gunzip programs. -# -# To run, you must set GZIP and GUNZIP in the environment to the absolute paths -# to the gzip and gunzip programs to test. All tests should pass regardless of -# whether the GNU versions or the libdeflate versions, or a combination, of -# these programs are used. -# -# The environmental variable TESTDATA must also be set to a file containing -# test data. -# - -set -eu -o pipefail - -export -n GZIP GUNZIP TESTDATA - -TMPDIR="$(mktemp -d)" -CURRENT_TEST= - -cleanup() { - if [ -n "$CURRENT_TEST" ]; then - echo "TEST FAILED: \"$CURRENT_TEST\"" - fi - rm -rf -- "$TMPDIR" -} - -trap cleanup EXIT - -TESTDATA="$(readlink -f "$TESTDATA")" -cd "$TMPDIR" - -begin_test() { - CURRENT_TEST="$1" - rm -rf -- "${TMPDIR:?}"/* - cp "$TESTDATA" file -} - -gzip() { - $GZIP "$@" -} - -gunzip() { - $GUNZIP "$@" -} - -assert_status() { - local expected_status="$1" - local expected_msg="$2" - shift 2 - ( - set +e - { eval "$*" > /dev/null; } 2>&1 - local actual_status=$? - if [ "$actual_status" != "$expected_status" ]; then - echo 1>&2 "Command '$*' exited with status" \ - "$actual_status but expected status" \ - "$expected_status" - exit 1 - fi - exit 0 - ) > command_output - if ! grep -E -q "$expected_msg" command_output; then - echo 1>&2 "Expected output of command '$*' to match regex" \ - "'$expected_msg'" - echo 1>&2 "Actual output was:" - echo 1>&2 "---------------------------------------------------" - cat 1>&2 command_output - echo 1>&2 "---------------------------------------------------" - return 1 - fi -} - -assert_error() { - assert_status 1 "$@" -} - -assert_warning() { - assert_status 2 "$@" -} - -assert_skipped() { - assert_warning '\<(ignored|skipping|unchanged)\>' "$@" -} - -assert_equals() { - local expected="$1" - local actual="$2" - - if [ "$expected" != "$actual" ]; then - echo 1>&2 "Expected '$expected', but got '$actual'" - return 1 - fi -} - -# Get the filesystem type. -FSTYPE=$(df -T . | tail -1 | awk '{print $2}') - -# If gzip or gunzip is the GNU version, require that it supports the '-k' -# option. This option was added in v1.6, released in 2013. -check_version_prereq() { - local prog=$1 - - if ! echo | { $prog -k || true; } |& grep -q 'invalid option'; then - return 0 - fi - if ! $prog -V |& grep -q 'Free Software Foundation'; then - echo 1>&2 "Unexpected case: not GNU $prog, but -k option is invalid" - exit 1 - fi - echo "GNU $prog is too old; skipping gzip/gunzip tests" - exit 0 -} -check_version_prereq gzip -check_version_prereq gunzip - -begin_test 'Basic compression and decompression works' -cp file orig -gzip file -[ ! -e file ] && [ -e file.gz ] -gunzip file.gz -[ -e file ] && [ ! -e file.gz ] -cmp file orig - - -begin_test 'gzip -d is gunzip' -cp file orig -gzip file -gzip -d file.gz -cmp file orig - - -begin_test '-k (keep original file) works' -cp file orig -gzip -k file -cmp file orig -rm file -cp file.gz orig.gz -gunzip -k file.gz -cmp file.gz orig.gz - - -begin_test '-c (write to stdout) works' -cp file orig -gzip -k file -gzip -c file > 2.gz -cmp file orig -cmp file.gz 2.gz -gunzip -c 2.gz > file -cmp file.gz 2.gz -cmp file orig - - -# Note: in some of the commands below, we intentionally use 'cat file | gzip' -# rather than 'gzip < file', in order to test the use of a pipe. This produces -# a shellcheck warning about 'cat' being unnecessary. Suppress that warning by -# using { cat file; true; }. -begin_test 'Reading from stdin works' -gzip < file > 1.gz -gzip - < file > 2.gz -{ cat file; true; } | gzip > 3.gz -{ cat file; true; } | gzip - > 4.gz -cmp file <(gunzip < 1.gz) -cmp file <(gunzip - < 2.gz) -cmp file <({ cat 3.gz; true; } | gunzip) -cmp file <({ cat 4.gz; true; } | gunzip -) - - -begin_test '-n option is accepted' -gzip -n file -gunzip -n file.gz - - -begin_test 'can specify multiple options' -gzip -fk1 file -cmp <(gzip -c -1 file) file.gz -gunzip -kfd file.gz - - -begin_test 'Compression levels' -if [ "$GZIP" = /bin/gzip ]; then - assert_error '\' gzip -10 - max_level=9 -else - for level in 13 99999 1a; do - assert_error '\' gzip -$level - done - max_level=12 -fi -for level in $(seq 1 $max_level); do - gzip -c "-$level" file > "file$level" - cmp file <(gunzip -c "file$level") -done -rm file command_output - - -begin_test 'Overwriting output file requires -f' -cp file orig -echo -n > file.gz -gzip -c file > 2.gz -assert_warning 'already exists' gzip file file -assert_warning 'already exists' gunzip file.gz c.gz -gzip file.gz 2>&1 >/dev/null | grep -q 'already has .gz suffix' -[ -e file.gz ] && [ ! -e file.gz.gz ] -gzip -f file.gz -[ ! -e file.gz ] && [ -e file.gz.gz ] -cmp file.gz.gz c.gz - - -begin_test 'Decompressing unsuffixed file only works with -c' -gzip file && mv file.gz file -assert_skipped gunzip file -assert_skipped gunzip -f file -gunzip -c file > orig -mv file file.gz && gunzip file.gz && cmp file orig - - -begin_test '... unless there is a corresponding suffixed file' -cp file orig -gzip file -[ ! -e file ] && [ -e file.gz ] -gunzip -c file > tmp -cmp tmp orig -rm tmp -ln -s NONEXISTENT file -gunzip -c file > tmp -cmp tmp orig -rm tmp file -gunzip file -[ -e file ] && [ ! -e file.gz ] -cmp file orig - - -begin_test 'Directory is skipped, even with -f' -mkdir dir -mkdir dir.gz -for opt in '' '-f' '-c'; do - assert_skipped gzip $opt dir -done -#assert_skipped gzip dir.gz # XXX: GNU gzip warns, libdeflate gzip no-ops -for opt in '' '-f' '-c'; do - for name in dir dir.gz; do - assert_skipped gunzip $opt $name - done -done - - -begin_test '(gzip) symlink is rejected without -f or -c' -ln -s file symlink1 -ln -s file symlink2 -assert_error 'Too many levels of symbolic links' gzip symlink1 -[ -e file ] && [ -e symlink1 ] && [ ! -e symlink1.gz ] -gzip -f symlink1 -[ -e file ] && [ ! -e symlink1 ] && [ -e symlink1.gz ] -gzip -c symlink2 > /dev/null - - -begin_test '(gunzip) symlink is rejected without -f or -c' -gzip file -ln -s file.gz symlink1.gz -ln -s file.gz symlink2.gz -assert_error 'Too many levels of symbolic links' gunzip symlink1 -[ -e file.gz ] && [ -e symlink1.gz ] && [ ! -e symlink1 ] -gunzip -f symlink1.gz -[ -e file.gz ] && [ ! -e symlink1.gz ] && [ -e symlink1 ] -gunzip -c symlink2.gz > /dev/null - - -begin_test 'FIFO is skipped, even with -f' -mkfifo foo -mkfifo foo.gz -assert_skipped gzip foo -assert_skipped gzip -f foo -#assert_skipped gzip -c foo # XXX: works with GNU gzip, not libdeflate's -assert_skipped gunzip foo.gz -assert_skipped gunzip -f foo.gz -#assert_skipped gunzip -c foo.gz # XXX: works with GNU gzip, not libdeflate's - - -begin_test '(gzip) overwriting symlink does not follow symlink' -echo a > a -echo b > b -gzip a -ln -s a.gz b.gz -gzip -f b -gunzip a.gz -cmp <(echo a) a - - -begin_test '(gunzip) overwriting symlink does not follow symlink' -echo a > a -echo b > b -gzip b -ln -s a b -gunzip -f b.gz -cmp <(echo a) a -cmp <(echo b) b - - -begin_test '(gzip) hard linked file skipped without -f or -c' -cp file orig -ln file link -assert_equals 2 "$(stat -c %h file)" -assert_skipped gzip file -gzip -c file > /dev/null -assert_equals 2 "$(stat -c %h file)" -gzip -f file -assert_equals 1 "$(stat -c %h link)" -assert_equals 1 "$(stat -c %h file.gz)" -cmp link orig -# XXX: GNU gzip skips hard linked files with -k, libdeflate's doesn't - - -begin_test '(gunzip) hard linked file skipped without -f or -c' -gzip file -ln file.gz link.gz -cp file.gz orig.gz -assert_equals 2 "$(stat -c %h file.gz)" -assert_skipped gunzip file.gz -gunzip -c file.gz > /dev/null -assert_equals 2 "$(stat -c %h file.gz)" -gunzip -f file -assert_equals 1 "$(stat -c %h link.gz)" -assert_equals 1 "$(stat -c %h file)" -cmp link.gz orig.gz - - -begin_test 'Multiple files' -cp file file2 -gzip file file2 -[ ! -e file ] && [ ! -e file2 ] && [ -e file.gz ] && [ -e file2.gz ] -gunzip file.gz file2.gz -[ -e file ] && [ -e file2 ] && [ ! -e file.gz ] && [ ! -e file2.gz ] - - -begin_test 'Multiple files, continue on warning' -mkdir 1 -cp file 2 -assert_skipped gzip 1 2 -[ ! -e 1.gz ] -cmp file <(gunzip -c 2.gz) -rmdir 1 -mkdir 1.gz -assert_skipped gunzip 1.gz 2.gz -[ ! -e 1 ] -cmp 2 file - - -if (( $(id -u) != 0 )); then - begin_test 'Multiple files, continue on error' - cp file 1 - cp file 2 - chmod a-r 1 - assert_error 'Permission denied' gzip 1 2 - [ ! -e 1.gz ] - cmp file <(gunzip -c 2.gz) - rm -f 1 - cp 2.gz 1.gz - chmod a-r 1.gz - assert_error 'Permission denied' gunzip 1.gz 2.gz - [ ! -e 1 ] - cmp 2 file -fi - - -begin_test 'Compressing empty file' -echo -n > empty -gzip empty -gunzip empty.gz -cmp /dev/null empty - - -begin_test 'Decompressing malformed file' -echo -n > foo.gz -assert_error '\<(not in gzip format|unexpected end of file)\>' \ - gunzip foo.gz -echo 1 > foo.gz -assert_error '\' gunzip foo.gz -echo abcdefgh > foo.gz -assert_error '\' gunzip foo.gz -echo -ne '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4b\x4c\x4a\x4e\x49\x24\x16\x73\x01\x00\x6c\x5b\xa2\x62\x2e\x00\x00\x00' \ - > foo.gz -assert_error '\<(not in gzip format|crc error)\>' gunzip foo.gz - - -for suf in .foo foo .blaaaaaaaaaaaaaaaargh; do - begin_test "Custom suffix: $suf" - gzip -S $suf file - [ ! -e file ] && [ ! -e file.gz ] && [ -e file$suf ] - assert_skipped gunzip file$suf - gunzip -S $suf file$suf - [ -e file ] && [ ! -e file.gz ] && [ ! -e file$suf ] -done -# DIFFERENCE: GNU gzip lower cases suffix, we don't - - -begin_test 'Empty suffix is rejected' -assert_error '\' gzip -S '""' file -assert_error '\' gunzip -S '""' file - - -begin_test 'Timestamps and mode are preserved' -if [ "$FSTYPE" = shiftfs ]; then - # In Travis CI, the filesystem (shiftfs) only supports seconds precision - # timestamps. Nanosecond precision still sometimes seems to work, - # probably due to caching, but it is unreliable. - format='%a;%X;%Y' -else - format='%a;%x;%y' -fi -chmod 777 file -orig_stat="$(stat -c "$format" file)" -gzip file -sleep 1 -gunzip file.gz -assert_equals "$orig_stat" "$(stat -c "$format" file)" - - -begin_test 'Decompressing multi-member gzip file' -cat file file > orig -gzip -c file > file.gz -gzip -c file >> file.gz -gunzip -f file.gz -cmp file orig - - -begin_test 'Decompressing multi-member gzip file (final member smaller)' -echo 'hello world' > hello -cat file hello > orig -gzip -c file > file.gz -gzip -c hello >> file.gz -gunzip -f file.gz -cmp file orig - - -begin_test 'Help option' -gzip -h 2>&1 | grep -q 'Usage' -gunzip -h 2>&1 | grep -q 'Usage' - - -begin_test 'Incorrect usage' -for prog in gzip gunzip; do - for opt in '--invalid-option' '-0'; do - assert_error '\<(unrecognized|invalid) option\>' $prog $opt - done -done - - -begin_test '-t (test) option works' -good_files=( -'H4sIAAAAAAAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+86ehsAAAA=' -'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9LLVIoAUrnJFZVKqTkp+txAQBqzFDrLQAAAA==') -bad_files=( -'H4sIAO1YYmAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+46ehsAAAA=' -'H4sIAO1YYmAAA3PMSVTITVTIzi85VABTIJ5jzpGZelwAX+86ehsAAAA=' -'H4sIAAAAAAAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+86ehsBAAA=' -'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9LLVIogUrnJFZVKqTkp+txAQBqzFDrLQAAAA==' -'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9L') -for contents in "${good_files[@]}"; do - echo "$contents" | base64 -d | gzip -t -done -for contents in "${bad_files[@]}"; do - echo "$contents" | base64 -d > file - assert_error '\' \ - gzip -t file -done - - -begin_test 'Version information' -gzip -V | grep -q Copyright -gunzip -V | grep -q Copyright - -CURRENT_TEST= diff --git a/util/compress/libdeflate/scripts/make-windows-releases.sh b/util/compress/libdeflate/scripts/make-windows-releases.sh deleted file mode 100755 index 1c143e106b..0000000000 --- a/util/compress/libdeflate/scripts/make-windows-releases.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail - -for arch in 'i686' 'x86_64'; do - make clean - make -j CC=${arch}-w64-mingw32-gcc CFLAGS="-Werror" all \ - benchmark.exe checksum.exe - dir=libdeflate-$(git describe --tags | tr -d v)-windows-${arch}-bin - rm -rf "$dir" "$dir.zip" - mkdir "$dir" - cp libdeflate.{dll,lib,def} libdeflatestatic.lib libdeflate.h ./*.exe \ - "$dir" - ${arch}-w64-mingw32-strip "$dir/libdeflate.dll" "$dir"/*.exe - for file in COPYING NEWS; do - sed < $file > "$dir/${file}.txt" -e 's/$/\r/g' - done - sed < README.md > "$dir/README.md" -e 's/$/\r/g' - (cd "$dir" && zip -r "../${dir}.zip" .) -done diff --git a/util/compress/libdeflate/scripts/msc_test.bat b/util/compress/libdeflate/scripts/msc_test.bat deleted file mode 100755 index f5e44bd09b..0000000000 --- a/util/compress/libdeflate/scripts/msc_test.bat +++ /dev/null @@ -1,3 +0,0 @@ -nmake /f Makefile.msc clean -nmake /f Makefile.msc -copy /y *.exe j:\exe\ diff --git a/util/compress/libdeflate/scripts/pgo_build.sh b/util/compress/libdeflate/scripts/pgo_build.sh deleted file mode 100755 index 2eb2b23110..0000000000 --- a/util/compress/libdeflate/scripts/pgo_build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Try gcc profile-guided optimizations - -set -eu - -MAKE="make -j$(grep -c processor /proc/cpuinfo)" -DATAFILE="$HOME/data/silesia" - -$MAKE benchmark > /dev/null -echo "=====================" -echo "Original performance:" -echo "---------------------" -./benchmark "$@" "$DATAFILE" - -$MAKE CFLAGS=-fprofile-generate LDFLAGS=-fprofile-generate benchmark > /dev/null -./benchmark "$@" "$DATAFILE" > /dev/null -$MAKE CFLAGS=-fprofile-use benchmark > /dev/null -rm -f {lib,programs}/*.gcda -echo "==========================" -echo "PGO-optimized performance:" -echo "--------------------------" -./benchmark "$@" "$DATAFILE" diff --git a/util/compress/libdeflate/scripts/produce_gzip_benchmark_table.sh b/util/compress/libdeflate/scripts/produce_gzip_benchmark_table.sh deleted file mode 100755 index 03fc927e5b..0000000000 --- a/util/compress/libdeflate/scripts/produce_gzip_benchmark_table.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -set -eu -o pipefail -topdir="$(dirname "$0")/.." - -do_benchmark() { - "$topdir/benchmark" -g -s "$(stat -c %s "$file")" "$@" "$file" \ - | grep Compressed | cut -f 4 -d ' ' -} - -echo "File | zlib -6 | zlib -9 | libdeflate -6 | libdeflate -9 | libdeflate -12" -echo "-----|---------|---------|---------------|---------------|---------------" - -for file in "$@"; do - echo -n "$(basename "$file")" - results=() - results+=("$(do_benchmark -Y -6)") - results+=("$(do_benchmark -Y -9)") - results+=("$(do_benchmark -6)") - results+=("$(do_benchmark -9)") - results+=("$(do_benchmark -12)") - best=2000000000 - for result in "${results[@]}"; do - if (( result < best)); then - best=$result - fi - done - for result in "${results[@]}"; do - if (( result == best )); then - em="**" - else - em="" - fi - echo -n " | ${em}${result}${em}" - done - echo -done diff --git a/util/compress/libdeflate/scripts/run_tests.sh b/util/compress/libdeflate/scripts/run_tests.sh deleted file mode 100755 index bdfd139b2d..0000000000 --- a/util/compress/libdeflate/scripts/run_tests.sh +++ /dev/null @@ -1,329 +0,0 @@ -#!/bin/bash -# -# Test script for libdeflate - -set -eu -o pipefail -cd "$(dirname "$0")/.." - -if [ $# -ne 0 ]; then - echo 1>&2 "Usage: $0" - exit 2 -fi - -# Use CC if specified in environment, else default to "cc". -: "${CC:=cc}" - -# Use CFLAGS if specified in environment. -: "${CFLAGS:=}" - -CLEANUP_CMDS=() -cleanup() { - for cmd in "${CLEANUP_CMDS[@]}"; do - eval "$cmd" - done -} -trap cleanup EXIT - -# Use TESTDATA if specified in environment, else generate it. -if [ -z "${TESTDATA:-}" ]; then - # Generate default TESTDATA file. - TESTDATA=$(mktemp -t libdeflate_testdata.XXXXXXXXXX) - export TESTDATA - CLEANUP_CMDS+=("rm -f '$TESTDATA'") - find . '(' -name '*.c' -o -name '*.h' -o -name '*.sh' ')' \ - -exec cat '{}' ';' | head -c 1000000 > "$TESTDATA" -fi - -TMPDIR=$(mktemp -d -t libdeflate_test.XXXXXXXXX) -CLEANUP_CMDS+=("rm -r '$TMPDIR'") - -MAKE="make -j$(getconf _NPROCESSORS_ONLN)" - -CC_VERSION=$($CC --version | head -1) - -ARCH=$(uname -m) - -for skip in SKIP_FREESTANDING SKIP_VALGRIND SKIP_UBSAN SKIP_ASAN SKIP_CFI \ - SKIP_SHARED_LIB; do - if [ "${!skip:-}" = "1" ]; then - eval $skip=true - else - eval $skip=false - fi -done - -############################################################################### - -INDENT=0 - -log() { - echo -n "[$(date)] " - head -c $(( INDENT * 4 )) /dev/zero | tr '\0' ' ' - echo "$@" -} - -begin() { - log "$@" - (( INDENT++ )) || true -} - -end() { - (( INDENT-- )) || true -} - -run_cmd() { - log "$@" - "$@" > /dev/null -} - -fail() { - echo 1>&2 "$@" - exit 1 -} - -file_count() { - local dir=$1 - - find "$dir" -type f -o -type l | wc -l -} - -cflags_supported() { - # -Werror is needed here in order for old versions of clang to reject - # invalid options. - echo 'int main(void){ return 0; }' \ - | $CC $CFLAGS "$@" -Werror -x c - -o /dev/null 2>/dev/null -} - -valgrind_version_at_least() { - local want_vers=$1 - local vers - - vers=$(valgrind --version | grep -E -o '[0-9\.]+' | head -1) - - [ "$want_vers" = "$(echo -e "$vers\n$want_vers" | sort -V | head -1)" ] -} - -build_and_run_tests() { - local quick=false - if [ "${1:-}" = "--quick" ]; then - quick=true - shift - fi - - begin "CC=$CC CFLAGS=\"$CFLAGS\" WRAPPER=\"$WRAPPER\" $*" - - # Build libdeflate, including the test programs. Set the special test - # support flag to get support for LIBDEFLATE_DISABLE_CPU_FEATURES. - $MAKE "$@" TEST_SUPPORT__DO_NOT_USE=1 all test_programs > /dev/null - - # When not using -march=native, run the tests multiple times with - # different combinations of CPU features disabled. This is needed to - # test all variants of dynamically-dispatched code. - # - # For now, we aren't super exhausive in which combinations of features - # we test disabling. We just disable the features roughly in order from - # newest to oldest for each architecture, cumulatively. In practice, - # that's good enough to cover all the code. - local features=('') - if ! [[ "$CFLAGS" =~ "-march=native" ]] && ! $quick; then - case "$ARCH" in - i386|x86_64) - features+=(avx512bw avx2 avx bmi2 pclmul sse2) - ;; - arm*|aarch*) - features+=(crc32 pmull neon) - ;; - esac - fi - local disable_str="" - local feature - for feature in "${features[@]}"; do - if [ -n "$feature" ]; then - if [ -n "$disable_str" ]; then - disable_str+="," - fi - disable_str+="$feature" - fi - log "Using LIBDEFLATE_DISABLE_CPU_FEATURES=$disable_str" - LIBDEFLATE_DISABLE_CPU_FEATURES="$disable_str" \ - sh ./scripts/exec_tests.sh > /dev/null - done - end -} - -verify_freestanding_build() { - # It is expected that sanitizer builds link to external functions. - if [[ "$CFLAGS" =~ "-fsanitize" ]]; then - return 0 - fi - log "Verifying that freestanding build is really freestanding" - if nm libdeflate.so | grep -q ' U '; then - echo 1>&2 "Freestanding lib links to external functions!:" - nm libdeflate.so | grep ' U ' - return 1 - fi - if ldd libdeflate.so | grep -q -v '\'; then - echo 1>&2 "Freestanding lib links to external libraries!:" - ldd libdeflate.so - return 1 - fi -} - -gzip_tests() { - local gzips=("$PWD/gzip") - local gunzips=("$PWD/gunzip") - if [ "${1:-}" != "--quick" ]; then - gzips+=(/bin/gzip) - gunzips+=(/bin/gunzip) - fi - local gzip gunzip - - begin "Running gzip program tests with CC=\"$CC\" CFLAGS=\"$CFLAGS\"" - $MAKE gzip gunzip > /dev/null - for gzip in "${gzips[@]}"; do - for gunzip in "${gunzips[@]}"; do - log "GZIP=$gzip, GUNZIP=$gunzip" - GZIP="$gzip" GUNZIP="$gunzip" TESTDATA="$TESTDATA" \ - ./scripts/gzip_tests.sh - done - done - end -} - -do_run_tests() { - build_and_run_tests "$@" - if [ "${1:-}" != "--quick" ]; then - if $SKIP_FREESTANDING; then - log "Skipping freestanding build tests due to SKIP_FREESTANDING=1" - else - build_and_run_tests FREESTANDING=1 - verify_freestanding_build - fi - fi - gzip_tests "$@" -} - -check_symbol_prefixes() { - log "Checking that all global symbols are prefixed with \"libdeflate_\"" - $MAKE libdeflate.a > /dev/null - if nm libdeflate.a | grep ' T ' | grep -E -v " _?libdeflate_"; then - fail "Some global symbols aren't prefixed with \"libdeflate_\"" - fi - log "Checking that all exported symbols are prefixed with \"libdeflate\"" - $MAKE libdeflate.so > /dev/null - if nm libdeflate.so | grep ' T ' \ - | grep -E -v " (libdeflate_|_init\>|_fini\>)"; then - fail "Some exported symbols aren't prefixed with \"libdeflate_\"" - fi -} - -test_use_shared_lib() { - if $SKIP_SHARED_LIB; then - log "Skipping USE_SHARED_LIB=1 tests due to SKIP_SHARED_LIB=1" - return - fi - log "Testing USE_SHARED_LIB=1" - $MAKE gzip > /dev/null - if ldd gzip | grep -q 'libdeflate.so'; then - fail "Binary should be statically linked by default" - fi - $MAKE USE_SHARED_LIB=1 all check > /dev/null - ldd gzip > "$TMPDIR/ldd.out" - if ! grep -q 'libdeflate.so' "$TMPDIR/ldd.out"; then - cat 1>&2 "$TMPDIR/ldd.out" - fail "Binary isn't dynamically linked" - fi - rm "$TMPDIR/ldd.out" -} - -install_uninstall_tests() { - local shell - - begin "Testing 'make install' and 'make uninstall'" - for shell in '/bin/bash' '/bin/dash'; do - log "Trying SHELL=$shell" - $MAKE SHELL=$shell clean > /dev/null - $MAKE SHELL=$shell DESTDIR="$TMPDIR/inst" install > /dev/null - if (( "$(file_count "$TMPDIR/inst")" == 0 )); then - fail "'make install' didn't install any files" - fi - make SHELL=$shell DESTDIR="$TMPDIR/inst" uninstall > /dev/null - if (( "$(file_count "$TMPDIR/inst")" != 0 )); then - fail "'make uninstall' didn't uninstall all files" - fi - rm -r "$TMPDIR/inst" - done - end -} - -run_tests() { - export WRAPPER="" # no wrapper by default; overridden by valgrind tests - local cflags - - begin "Running tests" - do_run_tests - end - - cflags=("-O3") - if cflags_supported "${cflags[@]}" "-march=native"; then - cflags+=("-march=native") - fi - begin "Running tests with ${cflags[*]}" - CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests - end - - # Need valgrind 3.9.0 for '--errors-for-leak-kinds=all' - # Need valgrind 3.12.0 for armv8 crypto and crc instructions - if $SKIP_VALGRIND; then - log "Skipping valgrind tests due to SKIP_VALGRIND=1" - elif valgrind_version_at_least 3.12.0; then - begin "Running tests with Valgrind" - WRAPPER="valgrind --quiet --error-exitcode=100 --leak-check=full --errors-for-leak-kinds=all" \ - do_run_tests --quick - end - fi - - cflags=("-fsanitize=undefined" "-fno-sanitize-recover=undefined") - if $SKIP_UBSAN; then - log "Skipping UBSAN tests due to SKIP_UBSAN=1" - elif cflags_supported "${cflags[@]}"; then - begin "Running tests with UBSAN" - CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests --quick - end - else - log "Skipping UBSAN tests because compiler ($CC_VERSION) doesn't support UBSAN" - fi - - cflags=("-fsanitize=address" "-fno-sanitize-recover=address") - if $SKIP_ASAN; then - log "Skipping ASAN tests due to SKIP_ASAN=1" - elif cflags_supported "${cflags[@]}"; then - begin "Running tests with ASAN" - CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests --quick - end - else - log "Skipping ASAN tests because compiler ($CC_VERSION) doesn't support ASAN" - fi - - cflags=("-fsanitize=cfi" "-fno-sanitize-recover=cfi" "-flto" - "-fvisibility=hidden") - if $SKIP_CFI; then - log "Skipping CFI tests due to SKIP_CFI=1" - elif cflags_supported "${cflags[@]}"; then - begin "Running tests with CFI" - CFLAGS="$CFLAGS ${cflags[*]}" AR=llvm-ar do_run_tests --quick - end - else - log "Skipping CFI tests because compiler ($CC_VERSION) doesn't support CFI" - fi - - install_uninstall_tests - check_symbol_prefixes - test_use_shared_lib -} - -############################################################################### - -log "Starting libdeflate tests" -run_tests -log "All tests passed!" diff --git a/util/timers/deadlineMonitor.go b/util/timers/deadlineMonitor.go deleted file mode 100644 index 823d3d8ccb..0000000000 --- a/util/timers/deadlineMonitor.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -// Package timers provides a Clock abstraction useful for simulating timeouts. -package timers - -import ( - "time" -) - -// MonotonicDeadlineMonitor is a concerete implementation of the DeadlineMonitor interface -type MonotonicDeadlineMonitor struct { - clock WallClock - expiration time.Duration - expired bool -} - -// MakeMonotonicDeadlineMonitor creates an instance of the MonotonicDeadlineMonitor type, implementing DeadlineMonitor -func MakeMonotonicDeadlineMonitor(clock WallClock, expiration time.Duration) *MonotonicDeadlineMonitor { - return &MonotonicDeadlineMonitor{ - clock: clock, - expiration: expiration, - } -} - -// Expired return true if the deadline has passed, or false otherwise. -func (m *MonotonicDeadlineMonitor) Expired() bool { - if m.expired { - return true - } - if m.clock.Since() >= m.expiration { - m.expired = true - } - return m.expired -} diff --git a/util/timers/interface.go b/util/timers/interface.go index 7e4393ab04..aec9a424c5 100644 --- a/util/timers/interface.go +++ b/util/timers/interface.go @@ -41,24 +41,3 @@ type Clock interface { // the same timeouts as the original Clock. Decode([]byte) (Clock, error) } - -// WallClock extends the Clock interface by providing a referencial timing, allowing to create -// timed events that are differential. -type WallClock interface { - Clock - - // Since returns the time spent between the last time the clock was zeroed out and the current - // wall clock time. - Since() time.Duration - - // DeadlineMonitorAt returns a DeadlineMonitor that expires after the provided delta time from zero has passed. - // - // DeadlineMonitorAt must be called after Zero; otherwise, the context's behavior is undefined. - DeadlineMonitorAt(at time.Duration) DeadlineMonitor -} - -// DeadlineMonitor test to see if the deadline it was created for has been reached yet or not. -type DeadlineMonitor interface { - // Expired return true if the deadline has passed, or false otherwise. - Expired() bool -} diff --git a/util/timers/monotonic.go b/util/timers/monotonic.go index afe33ae353..2788a6caa6 100644 --- a/util/timers/monotonic.go +++ b/util/timers/monotonic.go @@ -30,7 +30,7 @@ type Monotonic struct { } // MakeMonotonicClock creates a new monotonic clock with a given zero point. -func MakeMonotonicClock(zero time.Time) WallClock { +func MakeMonotonicClock(zero time.Time) Clock { return &Monotonic{ zero: zero, } @@ -86,14 +86,3 @@ func (m *Monotonic) Decode(data []byte) (Clock, error) { func (m *Monotonic) String() string { return time.Time(m.zero).String() } - -// Since returns the time that has passed between the time the clock was last zeroed out and now -func (m *Monotonic) Since() time.Duration { - return time.Since(m.zero) -} - -// DeadlineMonitorAt returns a DeadlineMonitor that expires after the provided delta time from zero has passed. -// The method must be called after Zero; otherwise, the context's behavior is undefined. -func (m *Monotonic) DeadlineMonitorAt(at time.Duration) DeadlineMonitor { - return MakeMonotonicDeadlineMonitor(m, at) -}