2023-09-25 02:43:35 +00:00
|
|
|
package application
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto"
|
|
|
|
"crypto/rand"
|
2024-01-03 07:31:42 +00:00
|
|
|
"fmt"
|
2023-09-25 02:43:35 +00:00
|
|
|
"testing"
|
2024-01-03 07:31:42 +00:00
|
|
|
"time"
|
2023-09-25 02:43:35 +00:00
|
|
|
|
|
|
|
"github.com/cloudflare/circl/sign/ed448"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
|
|
|
|
bls48581 "source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves/native/bls48581"
|
|
|
|
"source.quilibrium.com/quilibrium/monorepo/node/protobufs"
|
|
|
|
)
|
|
|
|
|
2024-01-03 07:31:42 +00:00
|
|
|
// This does a full test of the 65536 powers, run this if you want to wait a
|
|
|
|
// long time
|
|
|
|
func TestApplyTranscript_Slow(t *testing.T) {
|
|
|
|
old := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
olds := []*curves.ScalarBls48581{
|
|
|
|
curves.BLS48581G1().Scalar.One().(*curves.ScalarBls48581),
|
|
|
|
}
|
|
|
|
tau := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
taus := []*curves.ScalarBls48581{
|
|
|
|
curves.BLS48581G1().Scalar.One().(*curves.ScalarBls48581),
|
|
|
|
}
|
|
|
|
fmt.Println(time.Now().Unix())
|
|
|
|
fmt.Println("generate taus")
|
|
|
|
for i := 0; i < 65536; i++ {
|
|
|
|
olds = append(olds, olds[i].Mul(old).(*curves.ScalarBls48581))
|
|
|
|
taus = append(taus, taus[i].Mul(tau).(*curves.ScalarBls48581))
|
|
|
|
}
|
|
|
|
tauPubG2 := curves.BLS48581G2().Point.Generator().Mul(tau)
|
|
|
|
|
|
|
|
fmt.Println(time.Now().Unix())
|
|
|
|
fmt.Println("taus generated")
|
|
|
|
proverPubKey, proverKey, err := ed448.GenerateKey(rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
proverSig, err := proverKey.Sign(
|
|
|
|
rand.Reader,
|
|
|
|
tauPubG2.ToAffineCompressed(),
|
|
|
|
crypto.Hash(0),
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
fmt.Println(time.Now().Unix())
|
|
|
|
fmt.Println("prover signature generated")
|
|
|
|
blsSignature := make([]byte, int(bls48581.MODBYTES)+1)
|
|
|
|
key := tau.Bytes()
|
|
|
|
|
|
|
|
for i, j := 0, len(key)-1; i < j; i, j = i+1, j-1 {
|
|
|
|
key[i], key[j] = key[j], key[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
if bls48581.Core_Sign(blsSignature, proverKey, key) != bls48581.BLS_OK {
|
|
|
|
require.Fail(t, "could not sign")
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(time.Now().Unix())
|
|
|
|
fmt.Println("bls signature generated")
|
|
|
|
|
|
|
|
blsSig := blsSignature[:]
|
|
|
|
oldTranscript := &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{},
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
olds[256],
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
updatedTranscript := &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{},
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
taus[256],
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
olds[256],
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
olds[256],
|
|
|
|
).Mul(taus[256]).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, o := range olds {
|
|
|
|
oldTranscript.G1Powers = append(
|
|
|
|
oldTranscript.G1Powers,
|
|
|
|
&protobufs.BLS48581G1PublicKey{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
o,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
updatedTranscript.G1Powers = append(
|
|
|
|
updatedTranscript.G1Powers,
|
|
|
|
&protobufs.BLS48581G1PublicKey{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
o,
|
|
|
|
).Mul(taus[i]).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
if i < 257 {
|
|
|
|
oldTranscript.G2Powers = append(
|
|
|
|
oldTranscript.G2Powers,
|
|
|
|
&protobufs.BLS48581G2PublicKey{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
o,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
updatedTranscript.G2Powers = append(
|
|
|
|
updatedTranscript.G2Powers,
|
|
|
|
&protobufs.BLS48581G2PublicKey{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
o,
|
|
|
|
).Mul(taus[i]).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(time.Now().Unix())
|
|
|
|
fmt.Println("transcripts generated")
|
|
|
|
a := &CeremonyApplication{
|
|
|
|
StateCount: 0,
|
|
|
|
RoundCount: 0,
|
|
|
|
LobbyState: CEREMONY_APPLICATION_STATE_VALIDATING,
|
|
|
|
FinalCommits: []*protobufs.CeremonyTranscriptCommit{
|
|
|
|
{
|
|
|
|
ProverSignature: &protobufs.Ed448Signature{
|
|
|
|
Signature: proverSig,
|
|
|
|
PublicKey: &protobufs.Ed448PublicKey{
|
|
|
|
KeyValue: proverPubKey,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ContributionSignature: &protobufs.BLS48581Signature{
|
|
|
|
Signature: blsSig,
|
|
|
|
PublicKey: &protobufs.BLS48581G2PublicKey{
|
|
|
|
KeyValue: tauPubG2.ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
LatestTranscript: oldTranscript,
|
|
|
|
UpdatedTranscript: updatedTranscript,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = a.applyTranscript(updatedTranscript)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
2023-09-25 02:43:35 +00:00
|
|
|
func TestApplyTranscript(t *testing.T) {
|
|
|
|
old := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
old2 := old.Mul(old)
|
|
|
|
old3 := old2.Mul(old)
|
|
|
|
tau := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
tau2 := tau.Mul(tau)
|
|
|
|
tau3 := tau2.Mul(tau)
|
|
|
|
tauPubG2 := curves.BLS48581G2().Point.Generator().Mul(tau)
|
|
|
|
|
|
|
|
proverPubKey, proverKey, err := ed448.GenerateKey(rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
proverSig, err := proverKey.Sign(
|
|
|
|
rand.Reader,
|
|
|
|
tauPubG2.ToAffineCompressed(),
|
|
|
|
crypto.Hash(0),
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
blsSignature := make([]byte, int(bls48581.MODBYTES)+1)
|
|
|
|
key := tau.Bytes()
|
|
|
|
|
|
|
|
for i, j := 0, len(key)-1; i < j; i, j = i+1, j-1 {
|
|
|
|
key[i], key[j] = key[j], key[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
if bls48581.Core_Sign(blsSignature, proverKey, key) != bls48581.BLS_OK {
|
|
|
|
require.Fail(t, "could not sign")
|
|
|
|
}
|
|
|
|
|
|
|
|
blsSig := blsSignature[:]
|
|
|
|
updatedTranscript := &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).Mul(tau).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old2,
|
|
|
|
).Mul(tau2).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old3,
|
|
|
|
).Mul(tau3).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).Mul(tau).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
tau,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).Mul(tau).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
a := &CeremonyApplication{
|
|
|
|
StateCount: 0,
|
|
|
|
RoundCount: 0,
|
|
|
|
LobbyState: CEREMONY_APPLICATION_STATE_VALIDATING,
|
|
|
|
FinalCommits: []*protobufs.CeremonyTranscriptCommit{
|
|
|
|
{
|
|
|
|
ProverSignature: &protobufs.Ed448Signature{
|
|
|
|
Signature: proverSig,
|
|
|
|
PublicKey: &protobufs.Ed448PublicKey{
|
|
|
|
KeyValue: proverPubKey,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ContributionSignature: &protobufs.BLS48581Signature{
|
|
|
|
Signature: blsSig,
|
|
|
|
PublicKey: &protobufs.BLS48581G2PublicKey{
|
|
|
|
KeyValue: tauPubG2.ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
LatestTranscript: &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old2,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old3,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
UpdatedTranscript: updatedTranscript,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = a.applyTranscript(updatedTranscript)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestApplyRewritingTranscriptFails(t *testing.T) {
|
|
|
|
old := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
old2 := old.Mul(old)
|
|
|
|
old3 := old2.Mul(old)
|
|
|
|
tau := curves.BLS48581G1().Scalar.Random(rand.Reader)
|
|
|
|
tau2 := tau.Mul(tau)
|
|
|
|
tau3 := tau2.Mul(tau)
|
|
|
|
tauPubG2 := curves.BLS48581G2().Point.Generator().Mul(tau)
|
|
|
|
|
|
|
|
proverPubKey, proverKey, err := ed448.GenerateKey(rand.Reader)
|
|
|
|
require.NoError(t, err)
|
|
|
|
proverSig, err := proverKey.Sign(
|
|
|
|
rand.Reader,
|
|
|
|
tauPubG2.ToAffineCompressed(),
|
|
|
|
crypto.Hash(0),
|
|
|
|
)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
blsSignature := make([]byte, int(bls48581.MODBYTES)+1)
|
|
|
|
key := tau.Bytes()
|
|
|
|
|
|
|
|
for i, j := 0, len(key)-1; i < j; i, j = i+1, j-1 {
|
|
|
|
key[i], key[j] = key[j], key[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
if bls48581.Core_Sign(blsSignature, proverKey, key) != bls48581.BLS_OK {
|
|
|
|
require.Fail(t, "could not sign")
|
|
|
|
}
|
|
|
|
|
|
|
|
blsSig := blsSignature[:]
|
|
|
|
updatedTranscript := &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
tau,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
tau2,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
tau3,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
tau,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
// Pretend we're accumulating still
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
tau,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).Mul(tau).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
a := &CeremonyApplication{
|
|
|
|
StateCount: 0,
|
|
|
|
RoundCount: 0,
|
|
|
|
LobbyState: CEREMONY_APPLICATION_STATE_VALIDATING,
|
|
|
|
FinalCommits: []*protobufs.CeremonyTranscriptCommit{
|
|
|
|
{
|
|
|
|
ProverSignature: &protobufs.Ed448Signature{
|
|
|
|
Signature: proverSig,
|
|
|
|
PublicKey: &protobufs.Ed448PublicKey{
|
|
|
|
KeyValue: proverPubKey,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ContributionSignature: &protobufs.BLS48581Signature{
|
|
|
|
Signature: blsSig,
|
|
|
|
PublicKey: &protobufs.BLS48581G2PublicKey{
|
|
|
|
KeyValue: tauPubG2.ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
LatestTranscript: &protobufs.CeremonyTranscript{
|
|
|
|
G1Powers: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old2,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().Mul(
|
|
|
|
old3,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
G2Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG1_256Witnesses: []*protobufs.BLS48581G1PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G1().Point.Generator().ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
RunningG2_256Powers: []*protobufs.BLS48581G2PublicKey{
|
|
|
|
{
|
|
|
|
KeyValue: curves.BLS48581G2().Point.Generator().Mul(
|
|
|
|
old,
|
|
|
|
).ToAffineCompressed(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
UpdatedTranscript: updatedTranscript,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = a.applyTranscript(updatedTranscript)
|
2024-01-03 07:31:42 +00:00
|
|
|
require.Error(t, err)
|
2023-09-25 02:43:35 +00:00
|
|
|
}
|