Skip to content

Commit 3b27e1a

Browse files
committed
feat(hashescrow): add separate hash escrow identity flow (#1657)
Signed-off-by: Flamki <9833ayush@gmail.com>
1 parent dfc9221 commit 3b27e1a

31 files changed

Lines changed: 1612 additions & 153 deletions

token/core/fabtoken/v1/driver/deserializer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import (
1313
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1414
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/boolpolicy"
1515
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/deserializer"
16+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/hashescrow"
1617
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
1718
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/multisig"
1819
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/x509"
20+
hashescrow2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
1921
htlc2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2022
)
2123

@@ -29,6 +31,7 @@ func NewDeserializer() *Deserializer {
2931
des := deserializer.NewTypedVerifierDeserializerMultiplex()
3032
des.AddTypedVerifierDeserializer(x509.IdentityType, deserializer.NewTypedIdentityVerifierDeserializer(&x509.IdentityDeserializer{}, &x509.AuditMatcherDeserializer{}))
3133
des.AddTypedVerifierDeserializer(htlc2.ScriptType, htlc.NewTypedIdentityDeserializer(des))
34+
des.AddTypedVerifierDeserializer(hashescrow2.ScriptType, hashescrow.NewTypedIdentityDeserializer(des))
3235
des.AddTypedVerifierDeserializer(multisig.Multisig, multisig.NewTypedIdentityDeserializer(des, des))
3336
des.AddTypedVerifierDeserializer(boolpolicy.Policy, boolpolicy.NewTypedIdentityDeserializer(des, des))
3437

@@ -51,6 +54,7 @@ func NewEIDRHDeserializer() *EIDRHDeserializer {
5154
d := deserializer.NewEIDRHDeserializer()
5255
d.AddDeserializer(x509.IdentityType, &x509.AuditInfoDeserializer{})
5356
d.AddDeserializer(htlc2.ScriptType, htlc.NewAuditDeserializer(d))
57+
d.AddDeserializer(hashescrow2.ScriptType, hashescrow.NewAuditDeserializer(d))
5458
d.AddDeserializer(multisig.Multisig, &multisig.AuditInfoDeserializer{})
5559
d.AddDeserializer(boolpolicy.Policy, &boolpolicy.AuditInfoDeserializer{})
5660

token/core/fabtoken/v1/driver/driver.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
v1setup "github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/setup"
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/validator"
1818
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
19+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
1920
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2021
"github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
2122
"github.com/hyperledger-labs/fabric-token-sdk/token/services/ttx/boolpolicy"
@@ -146,6 +147,7 @@ func (d *Driver) NewTokenService(tmsID driver.TMSID, publicParams []byte) (drive
146147
authorization := common.NewAuthorizationMultiplexer(
147148
common.NewTMSAuthorization(logger, publicParamsManager.PublicParams(), ws),
148149
htlc.NewScriptAuth(ws),
150+
hashescrow.NewScriptAuth(ws),
149151
multisig.NewEscrowAuth(ws),
150152
boolpolicy.NewEscrowAuth(ws),
151153
)

token/core/fabtoken/v1/validator/validator_transfer.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import (
1515
"github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/actions"
1616
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
18+
hashescrow2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/hashescrow"
1819
htlc2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
20+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
1921
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2022
"github.com/hyperledger-labs/fabric-token-sdk/token/token"
2123
)
@@ -183,6 +185,38 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
183185
ctx.CountMetadataKey(metadataKey)
184186
}
185187
}
188+
if owner.Type == hashescrow.ScriptType {
189+
if len(ctx.TransferAction.GetOutputs()) != 1 {
190+
return errors.New("invalid transfer action: a hash escrow script only transfers the ownership of a token")
191+
}
192+
193+
// check type and quantity
194+
output := ctx.TransferAction.GetOutputs()[0].(*actions.Output)
195+
tok := output
196+
if ctx.InputTokens[0].Type != tok.Type {
197+
return errors.New("invalid transfer action: type of input does not match type of output")
198+
}
199+
if ctx.InputTokens[0].Quantity != tok.Quantity {
200+
return errors.New("invalid transfer action: quantity of input does not match quantity of output")
201+
}
202+
if output.IsRedeem() {
203+
return errors.New("invalid transfer action: the output corresponding to a hash escrow spending should not be a redeem")
204+
}
205+
206+
// check owner field
207+
script, err := hashescrow2.VerifyOwner(ctx.InputTokens[0].GetOwner(), tok.Owner)
208+
if err != nil {
209+
return errors.Wrap(err, "failed to verify transfer from hash escrow script")
210+
}
211+
212+
// check metadata
213+
sigma := ctx.Signatures[i]
214+
metadataKey, err := hashescrow2.MetadataClaimKeyCheck(ctx.TransferAction, script, sigma)
215+
if err != nil {
216+
return errors.WithMessagef(err, "failed to check hash escrow metadata")
217+
}
218+
ctx.CountMetadataKey(metadataKey)
219+
}
186220
}
187221

188222
for _, o := range ctx.TransferAction.GetOutputs() {
@@ -214,6 +248,23 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
214248
}
215249
ctx.CountMetadataKey(metadataKey)
216250

251+
continue
252+
}
253+
if owner.Type == hashescrow.ScriptType {
254+
script := &hashescrow.Script{}
255+
err = json.Unmarshal(owner.Identity, script)
256+
if err != nil {
257+
return err
258+
}
259+
if err := script.Validate(); err != nil {
260+
return errors.WithMessagef(err, "hash escrow script invalid")
261+
}
262+
metadataKey, err := hashescrow2.MetadataLockKeyCheck(ctx.TransferAction, script)
263+
if err != nil {
264+
return errors.WithMessagef(err, "failed to check hash escrow metadata")
265+
}
266+
ctx.CountMetadataKey(metadataKey)
267+
217268
continue
218269
}
219270
}

token/core/zkatdlog/nogh/v1/driver/deserializer.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ import (
1616
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/deserializer"
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemix"
1818
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/idemixnym"
19+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/hashescrow"
1920
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
2021
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/multisig"
2122
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/x509"
23+
hashescrow2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
2224
htlc2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2325
)
2426

@@ -46,6 +48,7 @@ func NewDeserializer(pp *v1.PublicParams) (*Deserializer, error) {
4648
}
4749
des.AddTypedVerifierDeserializer(x509.IdentityType, deserializer.NewTypedIdentityVerifierDeserializer(&x509.IdentityDeserializer{}, &x509.AuditMatcherDeserializer{}))
4850
des.AddTypedVerifierDeserializer(htlc2.ScriptType, htlc.NewTypedIdentityDeserializer(des))
51+
des.AddTypedVerifierDeserializer(hashescrow2.ScriptType, hashescrow.NewTypedIdentityDeserializer(des))
4952
des.AddTypedVerifierDeserializer(multisig.Multisig, multisig.NewTypedIdentityDeserializer(des, des))
5053
des.AddTypedVerifierDeserializer(boolpolicy.Policy, boolpolicy.NewTypedIdentityDeserializer(des, des))
5154

@@ -93,6 +96,7 @@ func NewEIDRHDeserializer() *EIDRHDeserializer {
9396
d.AddDeserializer(idemixnym.IdentityType, &idemixnym.AuditInfoDeserializer{})
9497
d.AddDeserializer(x509.IdentityType, &x509.AuditInfoDeserializer{})
9598
d.AddDeserializer(htlc2.ScriptType, htlc.NewAuditDeserializer(d))
99+
d.AddDeserializer(hashescrow2.ScriptType, hashescrow.NewAuditDeserializer(d))
96100
d.AddDeserializer(multisig.Multisig, &multisig.AuditInfoDeserializer{})
97101
d.AddDeserializer(boolpolicy.Policy, &boolpolicy.AuditInfoDeserializer{})
98102

token/core/zkatdlog/nogh/v1/driver/driver.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
v1token "github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/token"
1919
"github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/validator"
2020
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
21+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
2122
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2223
"github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
2324
"github.com/hyperledger-labs/fabric-token-sdk/token/services/ttx/boolpolicy"
@@ -150,6 +151,7 @@ func (d *Driver) NewTokenService(tmsID driver.TMSID, publicParams []byte) (drive
150151
authorization := common.NewAuthorizationMultiplexer(
151152
common.NewTMSAuthorization(logger, ppm.PublicParams(), ws),
152153
htlc.NewScriptAuth(ws),
154+
hashescrow.NewScriptAuth(ws),
153155
multisig.NewEscrowAuth(ws),
154156
boolpolicy.NewEscrowAuth(ws),
155157
)

token/core/zkatdlog/nogh/v1/validator/validator_transfer.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ import (
1717
"github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/transfer"
1818
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1919
"github.com/hyperledger-labs/fabric-token-sdk/token/services/identity"
20+
hashescrow2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/hashescrow"
2021
htlc2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/identity/interop/htlc"
22+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/hashescrow"
2123
"github.com/hyperledger-labs/fabric-token-sdk/token/services/interop/htlc"
2224
token2 "github.com/hyperledger-labs/fabric-token-sdk/token/token"
2325
)
@@ -182,6 +184,29 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
182184
ctx.CountMetadataKey(metadataKey)
183185
}
184186
}
187+
if owner.Type == hashescrow.ScriptType {
188+
// Hash escrow script must be a 1-to-1 transfer of ownership
189+
if len(ctx.InputTokens) != 1 || len(ctx.TransferAction.GetOutputs()) != 1 {
190+
return ErrInvalidHTLCAction
191+
}
192+
193+
out, ok := ctx.TransferAction.GetOutputs()[0].(*token.Token)
194+
if !ok || out == nil {
195+
return ErrHTLCOutputNotFound
196+
}
197+
198+
script, err := hashescrow2.VerifyOwner(ctx.InputTokens[0].Owner, out.Owner)
199+
if err != nil {
200+
return errors.Wrap(err, "failed to verify transfer from hash escrow script")
201+
}
202+
203+
sigma := ctx.Signatures[i]
204+
metadataKey, err := hashescrow2.MetadataClaimKeyCheck(ctx.TransferAction, script, sigma)
205+
if err != nil {
206+
return errors.WithMessagef(err, "failed to check hash escrow metadata")
207+
}
208+
ctx.CountMetadataKey(metadataKey)
209+
}
185210
}
186211

187212
for _, o := range ctx.TransferAction.Outputs {
@@ -207,6 +232,23 @@ func TransferHTLCValidate(c context.Context, ctx *Context) error {
207232
}
208233
ctx.CountMetadataKey(metadataKey)
209234

235+
continue
236+
}
237+
if owner.Type == hashescrow.ScriptType {
238+
script := &hashescrow.Script{}
239+
err = script.FromBytes(owner.Identity)
240+
if err != nil {
241+
return err
242+
}
243+
if err := script.Validate(); err != nil {
244+
return errors.WithMessagef(err, "hash escrow script invalid")
245+
}
246+
metadataKey, err := hashescrow2.MetadataLockKeyCheck(ctx.TransferAction, script)
247+
if err != nil {
248+
return errors.WithMessagef(err, "failed to check hash escrow metadata")
249+
}
250+
ctx.CountMetadataKey(metadataKey)
251+
210252
continue
211253
}
212254
}

token/driver/wallet.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ const (
207207
HTLCScriptIdentityType IdentityType = 4
208208
MultiSigIdentityType IdentityType = 5
209209
PolicyIdentityType IdentityType = 6
210+
HashEscrowIdentityType IdentityType = 7
210211
)
211212

212213
// IdentityTypeString identifies the type of identity as a string
@@ -219,6 +220,7 @@ const (
219220
HTLCScriptIdentityTypeString IdentityTypeString = "htlc"
220221
MultiSigIdentityTypeString IdentityTypeString = "multisig"
221222
PolicyIdentityTypeString IdentityTypeString = "policy"
223+
HashEscrowIdentityTypeString IdentityTypeString = "hashescrow"
222224
)
223225

224226
// Authorization checks the relationship between a token and different wallet types (owner, issuer, auditor).

0 commit comments

Comments
 (0)