Skip to content

Commit c5d1d5b

Browse files
committed
itest: add test for ownership proof
1 parent 568b86b commit c5d1d5b

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

itest/ownership_test.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package itest
2+
3+
import (
4+
"context"
5+
6+
"github.com/lightninglabs/taproot-assets/taprpc"
7+
"github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc"
8+
"github.com/lightninglabs/taproot-assets/taprpc/mintrpc"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
// testOwnershipVerification tests the asset ownership proof verficiation flow
13+
// for owned assets. This test also tests the challenge parameter of the
14+
// ownership verification RPCs.
15+
func testOwnershipVerification(t *harnessTest) {
16+
ctxb := context.Background()
17+
18+
// Create bob tapd.
19+
bobTapd := setupTapdHarness(
20+
t.t, t, t.lndHarness.Bob, t.universeServer,
21+
)
22+
defer func() {
23+
require.NoError(t.t, bobTapd.stop(!*noDelete))
24+
}()
25+
26+
// Mint some assets on alice.
27+
rpcAssets := MintAssetsConfirmBatch(
28+
t.t, t.lndHarness.Miner.Client, t.tapd,
29+
[]*mintrpc.MintAssetRequest{issuableAssets[0]},
30+
)
31+
32+
genInfo := rpcAssets[0].AssetGenesis
33+
34+
currentUnits := issuableAssets[0].Asset.Amount
35+
numUnits := currentUnits / 10
36+
37+
// Bob makes an address in order to receive some of those assets.
38+
bobAddr, err := bobTapd.NewAddr(
39+
ctxb, &taprpc.NewAddrRequest{
40+
AssetId: genInfo.AssetId,
41+
Amt: numUnits,
42+
AssetVersion: rpcAssets[0].Version,
43+
},
44+
)
45+
require.NoError(t.t, err)
46+
47+
AssertAddrCreated(t.t, bobTapd, rpcAssets[0], bobAddr)
48+
49+
sendResp, sendEvents := sendAssetsToAddr(t, t.tapd, bobAddr)
50+
ConfirmAndAssertOutboundTransfer(
51+
t.t, t.lndHarness.Miner.Client, t.tapd, sendResp,
52+
genInfo.AssetId,
53+
[]uint64{currentUnits - numUnits, numUnits}, 0, 1,
54+
)
55+
AssertNonInteractiveRecvComplete(t.t, bobTapd, 1)
56+
AssertSendEventsComplete(t.t, bobAddr.ScriptKey, sendEvents)
57+
58+
// Now bob generates an ownership proof for the received assets. This
59+
// proof does not contain a challenge.
60+
proof, err := bobTapd.ProveAssetOwnership(
61+
ctxb, &assetwalletrpc.ProveAssetOwnershipRequest{
62+
AssetId: rpcAssets[0].AssetGenesis.AssetId,
63+
ScriptKey: bobAddr.ScriptKey,
64+
},
65+
)
66+
require.NoError(t.t, err)
67+
68+
// Alice verifies ownership proof.
69+
res, err := t.tapd.VerifyAssetOwnership(
70+
ctxb, &assetwalletrpc.VerifyAssetOwnershipRequest{
71+
ProofWithWitness: proof.ProofWithWitness,
72+
},
73+
)
74+
require.NoError(t.t, err)
75+
require.True(t.t, res.ValidProof)
76+
77+
// Now let's create a dummy 32 byte challenge.
78+
ownershipChallenge := [32]byte{
79+
1, 2, 3, 4, 5, 6, 7, 8,
80+
1, 2, 3, 4, 5, 6, 7, 8,
81+
1, 2, 3, 4, 5, 6, 7, 8,
82+
1, 2, 3, 4, 5, 6, 7, 8,
83+
}
84+
85+
// Bob creates the proof that includes the above challenge.
86+
proof, err = bobTapd.ProveAssetOwnership(
87+
ctxb, &assetwalletrpc.ProveAssetOwnershipRequest{
88+
AssetId: rpcAssets[0].AssetGenesis.AssetId,
89+
ScriptKey: bobAddr.ScriptKey,
90+
Challenge: ownershipChallenge[:],
91+
},
92+
)
93+
require.NoError(t.t, err)
94+
95+
// Alice verifies ownership proof, providing the challenge.
96+
res, err = t.tapd.VerifyAssetOwnership(
97+
ctxb, &assetwalletrpc.VerifyAssetOwnershipRequest{
98+
ProofWithWitness: proof.ProofWithWitness,
99+
Challenge: ownershipChallenge[:],
100+
},
101+
)
102+
require.NoError(t.t, err)
103+
require.True(t.t, res.ValidProof)
104+
105+
// Now alice edits a byte of the challenge. This challenge should not
106+
// match the ownership proof, therefore a failure is expected.
107+
ownershipChallenge[0] = 8
108+
_, err = t.tapd.VerifyAssetOwnership(
109+
ctxb, &assetwalletrpc.VerifyAssetOwnershipRequest{
110+
ProofWithWitness: proof.ProofWithWitness,
111+
Challenge: ownershipChallenge[:],
112+
},
113+
)
114+
require.ErrorContains(t.t, err, "invalid transfer asset witness")
115+
116+
// Now alice trims the challenge to an 8-byte array. The RPC should
117+
// fail, we only accept 32-byte values.
118+
_, err = t.tapd.VerifyAssetOwnership(
119+
ctxb, &assetwalletrpc.VerifyAssetOwnershipRequest{
120+
ProofWithWitness: proof.ProofWithWitness,
121+
Challenge: ownershipChallenge[:8],
122+
},
123+
)
124+
require.ErrorContains(t.t, err, "challenge must be 32 bytes")
125+
}

itest/test_list_on_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ var testCases = []*testCase{
312312
name: "channel RPCs",
313313
test: testChannelRPCs,
314314
},
315+
{
316+
name: "ownership verification",
317+
test: testOwnershipVerification,
318+
},
315319
}
316320

317321
var optionalTestCases = []*testCase{

0 commit comments

Comments
 (0)