Skip to content

Commit 78ee4c6

Browse files
authored
Merge pull request #1014 from lightninglabs/universe_manual_proof_push
taprpc+tapcli: add universe proof push command
2 parents eeca76c + 9faf03f commit 78ee4c6

10 files changed

+1353
-347
lines changed

cmd/tapcli/universe.go

+94-35
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ var universeProofCommand = cli.Command{
436436
`,
437437
Subcommands: []cli.Command{
438438
universeProofQueryCommand,
439-
universeProofInsertInsert,
439+
universeProofInsertCommand,
440+
universeProofPushCommand,
440441
},
441442
}
442443

@@ -474,24 +475,34 @@ func parseAssetKey(ctx *cli.Context) (*unirpc.AssetKey, error) {
474475
}, nil
475476
}
476477

477-
func universeProofQuery(ctx *cli.Context) error {
478-
ctxc := getContext()
479-
client, cleanUp := getUniverseClient(ctx)
480-
defer cleanUp()
481-
478+
func parseUniverseProofArgs(ctx *cli.Context) (*unirpc.UniverseKey, error) {
482479
assetKey, err := parseAssetKey(ctx)
483480
if err != nil {
484-
return err
481+
return nil, err
485482
}
486483

487484
universeID, err := parseUniverseID(ctx, true)
488485
if err != nil {
489-
return err
486+
return nil, err
490487
}
491-
uProof, err := client.QueryProof(ctxc, &unirpc.UniverseKey{
488+
489+
return &unirpc.UniverseKey{
492490
Id: universeID,
493491
LeafKey: assetKey,
494-
})
492+
}, nil
493+
}
494+
495+
func universeProofQuery(ctx *cli.Context) error {
496+
uKey, err := parseUniverseProofArgs(ctx)
497+
if err != nil {
498+
return err
499+
}
500+
501+
ctxc := getContext()
502+
client, cleanUp := getUniverseClient(ctx)
503+
defer cleanUp()
504+
505+
uProof, err := client.QueryProof(ctxc, uKey)
495506
if err != nil {
496507
return err
497508
}
@@ -500,7 +511,7 @@ func universeProofQuery(ctx *cli.Context) error {
500511
return nil
501512
}
502513

503-
var universeProofInsertInsert = cli.Command{
514+
var universeProofInsertCommand = cli.Command{
504515
Name: "insert",
505516
Usage: "insert a new universe proof",
506517
Description: `
@@ -519,25 +530,17 @@ func universeProofInsert(ctx *cli.Context) error {
519530
return cli.ShowSubcommandHelp(ctx)
520531
}
521532

522-
assetKey, err := parseAssetKey(ctx)
533+
uKey, err := parseUniverseProofArgs(ctx)
523534
if err != nil {
524535
return err
525536
}
526537

527-
universeID, err := parseUniverseID(ctx, true)
528-
if err != nil {
529-
return err
530-
}
531538
filePath := lncfg.CleanAndExpandPath(ctx.String(proofPathName))
532539
rawFile, err := readFile(filePath)
533540
if err != nil {
534541
return fmt.Errorf("unable to read proof file: %w", err)
535542
}
536543

537-
ctxc := getContext()
538-
client, cleanUp := getUniverseClient(ctx)
539-
defer cleanUp()
540-
541544
// The server always expects the raw state transition proof, so
542545
// depending on the input we get, we either need to extract the last
543546
// state transition proof or can use it directly.
@@ -563,11 +566,12 @@ func universeProofInsert(ctx *cli.Context) error {
563566
return fmt.Errorf("invalid proof file format")
564567
}
565568

569+
ctxc := getContext()
570+
client, cleanUp := getUniverseClient(ctx)
571+
defer cleanUp()
572+
566573
req := &unirpc.AssetProof{
567-
Key: &unirpc.UniverseKey{
568-
Id: universeID,
569-
LeafKey: assetKey,
570-
},
574+
Key: uKey,
571575
AssetLeaf: &unirpc.AssetLeaf{
572576
Proof: rawProof,
573577
},
@@ -581,6 +585,59 @@ func universeProofInsert(ctx *cli.Context) error {
581585
return nil
582586
}
583587

588+
var universeProofPushCommand = cli.Command{
589+
Name: "push",
590+
ShortName: "p",
591+
Usage: "push a proof to a remote Universe",
592+
Description: `
593+
Push a proof present in the local Universe to a remote Universe.
594+
`,
595+
Flags: append(universeProofArgs, universeServerArgs...),
596+
Action: universeProofPush,
597+
}
598+
599+
func universeProofPush(ctx *cli.Context) error {
600+
uniServerName := ctx.String(universeHostName)
601+
uniServerID := ctx.Int(universeServerID)
602+
uniAddr := unirpc.UniverseFederationServer{}
603+
604+
switch {
605+
case uniServerName == "" && uniServerID == 0:
606+
return cli.ShowSubcommandHelp(ctx)
607+
608+
case uniServerName != "" && uniServerID != 0:
609+
return fmt.Errorf("cannot specify both universe host name " +
610+
"and ID")
611+
612+
case uniServerName != "":
613+
uniAddr.Host = uniServerName
614+
615+
case uniServerID != 0:
616+
uniAddr.Id = int32(uniServerID)
617+
}
618+
619+
uKey, err := parseUniverseProofArgs(ctx)
620+
if err != nil {
621+
return err
622+
}
623+
624+
ctxc := getContext()
625+
client, cleanUp := getUniverseClient(ctx)
626+
defer cleanUp()
627+
628+
req := unirpc.PushProofRequest{
629+
Key: uKey,
630+
Server: &uniAddr,
631+
}
632+
resp, err := client.PushProof(ctxc, &req)
633+
if err != nil {
634+
return err
635+
}
636+
637+
printRespJSON(resp)
638+
return nil
639+
}
640+
584641
var (
585642
universeHostName = "universe_host"
586643
)
@@ -745,24 +802,26 @@ func universeFederationAdd(ctx *cli.Context) error {
745802

746803
const universeServerID = "server_id"
747804

805+
var universeServerArgs = []cli.Flag{
806+
cli.StringFlag{
807+
Name: universeHostName,
808+
Usage: "the host:port or just host of the remote " +
809+
"universe",
810+
},
811+
cli.IntFlag{
812+
Name: universeServerID,
813+
Usage: "the ID of the universe server in our federation",
814+
},
815+
}
816+
748817
var universeFederationDelCommand = cli.Command{
749818
Name: "del",
750819
ShortName: "d",
751820
Description: `
752821
Remove a server from the Federation. Servers can be identified either
753822
via their ID, or the server host.
754823
`,
755-
Flags: []cli.Flag{
756-
cli.StringFlag{
757-
Name: universeHostName,
758-
Usage: "the host:port or just host of the remote " +
759-
"universe",
760-
},
761-
cli.IntFlag{
762-
Name: universeServerID,
763-
Usage: "the ID of the universe server to delete",
764-
},
765-
},
824+
Flags: universeServerArgs,
766825
Action: universeFederationDel,
767826
}
768827

perms/perms.go

+4
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ var (
200200
Entity: "universe",
201201
Action: "write",
202202
}},
203+
"/universerpc.Universe/PushProof": {{
204+
Entity: "universe",
205+
Action: "read",
206+
}},
203207
"/universerpc.Universe/SyncUniverse": {{
204208
Entity: "universe",
205209
Action: "write",

0 commit comments

Comments
 (0)