ceremonyclient/node/app/db_console.go
2023-09-27 04:05:39 -05:00

196 lines
4.2 KiB
Go

package app
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/pkg/errors"
"golang.org/x/crypto/sha3"
"google.golang.org/protobuf/proto"
"source.quilibrium.com/quilibrium/monorepo/node/execution/ceremony/application"
"source.quilibrium.com/quilibrium/monorepo/node/store"
)
type DBConsole struct {
clockStore store.ClockStore
dataProofStore store.DataProofStore
}
func newDBConsole(
clockStore store.ClockStore,
dataProofStore store.DataProofStore,
) (*DBConsole, error) {
return &DBConsole{
clockStore,
dataProofStore,
}, nil
}
// Runs the DB console, this is meant for simple debugging, not production use.
func (c *DBConsole) Run() {
for {
fmt.Printf("db> ")
reader := bufio.NewReader(os.Stdin)
s, err := reader.ReadString('\n')
if err != nil {
panic(err)
}
cmd := strings.Trim(s, "\n")
switch cmd {
case "quit":
return
case "show master frames":
earliestFrame, err := c.clockStore.GetEarliestMasterClockFrame([]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
})
if err != nil {
panic(err)
}
latestFrame, err := c.clockStore.GetLatestMasterClockFrame([]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
})
if err != nil {
panic(err)
}
fmt.Printf(
"earliest: %d, latest: %d\n",
earliestFrame.FrameNumber,
latestFrame.FrameNumber,
)
fmt.Printf(
"Genesis Frame:\n\tVDF Proof: %x\n",
earliestFrame.Input[:516],
)
iter, err := c.clockStore.RangeMasterClockFrames(
[]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
},
earliestFrame.FrameNumber,
latestFrame.FrameNumber,
)
if err != nil {
panic(err)
}
for iter.First(); iter.Valid(); iter.Next() {
value, err := iter.Value()
if err != nil {
panic(err)
}
selector, err := value.GetSelector()
if err != nil {
panic(err)
}
fmt.Printf(
"Frame %d (Selector: %x):\n\tParent: %x\n\tVDF Proof: %x\n\n",
value.FrameNumber,
selector.Bytes(),
value.ParentSelector,
value.Input[:516],
)
}
if err := iter.Close(); err != nil {
panic(err)
}
case "show ceremony frames":
earliestFrame, err := c.clockStore.GetEarliestDataClockFrame(
application.CEREMONY_ADDRESS,
)
if err != nil {
panic(errors.Wrap(err, "earliest"))
}
latestFrame, err := c.clockStore.GetLatestDataClockFrame(
application.CEREMONY_ADDRESS,
nil,
)
if err != nil {
panic(errors.Wrap(err, "latest"))
}
fmt.Printf(
"earliest: %d, latest: %d\n",
earliestFrame.FrameNumber,
latestFrame.FrameNumber,
)
fmt.Printf(
"Genesis Frame:\n\tVDF Proof: %x\n",
earliestFrame.Input[:516],
)
iter, err := c.clockStore.RangeDataClockFrames(
application.CEREMONY_ADDRESS,
earliestFrame.FrameNumber+1,
latestFrame.FrameNumber,
)
if err != nil {
panic(err)
}
for iter.First(); iter.Valid(); iter.Next() {
value, err := iter.Value()
if err != nil {
panic(err)
}
selector, err := value.GetSelector()
if err != nil {
panic(err)
}
fmt.Printf(
"Frame %d (Selector: %x):\n\tParent: %x\n\tVDF Proof: %x\n",
value.FrameNumber,
selector.Bytes(),
value.ParentSelector,
value.Input[:516],
)
for i := 0; i < len(value.Input[516:])/74; i++ {
commit := value.Input[516+(i*74) : 516+((i+1)*74)]
fmt.Printf(
"\tCommitment %+x\n",
commit,
)
fmt.Printf(
"\t\tType: %s\n",
value.AggregateProofs[i].InclusionCommitments[0].TypeUrl,
)
b, _ := proto.Marshal(value.AggregateProofs[i])
hash := sha3.Sum256(b)
fmt.Printf("\t\tAP Hash: %+x\n", hash)
}
fmt.Println()
}
if err := iter.Close(); err != nil {
panic(err)
}
default:
fmt.Printf("unknown command %s\n", cmd)
}
}
}