Skip to content

Commit

Permalink
Adds special Darc attributes on read contract
Browse files Browse the repository at this point in the history
  • Loading branch information
nkcr committed Sep 20, 2019
1 parent 6edb189 commit 55b5f29
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 1 deletion.
81 changes: 81 additions & 0 deletions calypso/contracts.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package calypso
import (
"errors"
"fmt"
"net/url"
"strings"

"github.com/dedis/odyssey/projectc"
"go.dedis.ch/cothority/v3"
"go.dedis.ch/cothority/v3/byzcoin"
"go.dedis.ch/cothority/v3/darc"
Expand Down Expand Up @@ -215,3 +217,82 @@ func intersectRosters(r1, r2 *onet.Roster) int {
}
return res
}

// VerifyInstruction uses a specific verification based on attr in the case its
// a read spawn
func (c ContractWrite) VerifyInstruction(rst byzcoin.ReadOnlyStateTrie, inst byzcoin.Instruction, ctxHash []byte) error {
log.Info("Hello from the verify instruction")
if inst.GetType() == byzcoin.SpawnType && inst.Spawn.ContractID == ContractReadID {
log.Info("Hello 2 from the verify instruction")
return inst.VerifyWithOption(rst, ctxHash, &byzcoin.VerificationOptions{EvalAttr: c.MakeAttrInterpreters(rst, inst)})
}
return inst.VerifyWithOption(rst, ctxHash, nil)
}

// MakeAttrInterpreters provides the attribute verification which check
// the purposes and uses
func (c ContractWrite) MakeAttrInterpreters(rst byzcoin.ReadOnlyStateTrie, inst byzcoin.Instruction) darc.AttrInterpreters {
log.Info("Hello from the MakeAttrInterpreters")
cb := func(attr string) error {
log.Info("Hello from the inside MakeAttrInterpreters")
// Expecting an 'attr' of form:
// purposes=purpose1,purpose2&uses=use1,use2,use4
// which, once parsed, gives map[purposes:[purpose1,purpose2] uses:[use1,use2]]
vals, err := url.ParseQuery(attr)
if err != nil {
return err
}
purposesStr := vals.Get("purposes")
usesStr := vals.Get("uses")

projectInstID := inst.Spawn.Args.Search("projectInstID")
if projectInstID == nil {
return errors.New("argument 'projectInstID' not found")
}

projectC := projectc.ProjectData{}
projectBuf, _, _, _, err := rst.GetValues(projectInstID)
if err != nil {
return fmt.Errorf("failed to get the given project instance '%x': %s", projectInstID, err.Error())
}
err = protobuf.DecodeWithConstructors(projectBuf, &projectC, network.DefaultConstructors(cothority.Suite))
if err != nil {
return errors.New("failed to decode project instance: " + err.Error())
}

purposes := strings.Split(purposesStr, ",")
log.Info("here are the Darc purposes: ", purposes)
uses := strings.Split(usesStr, ",")

errorMessages := make([]string, 0)
for _, purpose := range projectC.Purposes {
if !stringInSlice(purpose, purposes) {
errorMessages = append(errorMessages,
fmt.Sprintf("the purpose '%s' is not allowed", purpose))
}
}
for _, use := range projectC.Uses {
if !stringInSlice(use, uses) {
errorMessages = append(errorMessages,
fmt.Sprintf("the use '%s' is not allowed", use))
}
}

if len(errorMessages) != 0 {
return fmt.Errorf("validation of attributes failed: %s", strings.Join(errorMessages, ", "))
}

return nil

}
return darc.AttrInterpreters{"allowed": cb}
}

func stringInSlice(a string, list []string) bool {
for _, b := range list {
if b == a {
return true
}
}
return false
}
11 changes: 10 additions & 1 deletion calypso/csadmin/clicontracts/read.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ func ReadSpawn(c *cli.Context) error {
return errors.New("failed to encode read struct: " + err.Error())
}

projectInstID := c.String("projectInstID")
projectInstIDBuff, err := hex.DecodeString(projectInstID)
if err != nil {
return errors.New("failed to decode the projectInstID string")
}

counters, err := cl.GetSignerCounters(signer.Identity().String())
if err != nil {
return errors.New("failed to get the signer counters: " + err.Error())
Expand All @@ -122,7 +128,10 @@ func ReadSpawn(c *cli.Context) error {
InstanceID: byzcoin.NewInstanceID(proof.InclusionProof.Key()),
Spawn: &byzcoin.Spawn{
ContractID: calypso.ContractReadID,
Args: byzcoin.Arguments{{Name: "read", Value: readBuf}},
Args: byzcoin.Arguments{
{Name: "read", Value: readBuf},
{Name: "projectInstID", Value: projectInstIDBuff},
},
},
SignerCounter: []uint64{counters.Counters[0] + 1},
}},
Expand Down
4 changes: 4 additions & 0 deletions calypso/csadmin/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,10 @@ var cmds = cli.Commands{
Name: "export, x",
Usage: "export the instance id to STDOUT",
},
cli.StringFlag{
Name: "projectInstID, pid",
Usage: "The project instance ID, which contains the metadata for verification (optional)",
},
},
},
},
Expand Down
12 changes: 12 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,26 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
go.dedis.ch/cothority/v3 v3.1.3/go.mod h1:9l9ftJQG/LJakHDm3RdrStrTsyMuHNr5h2A6IWrjAgY=
go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs=
go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw=
go.dedis.ch/kyber/v3 v3.0.0-pre2/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
go.dedis.ch/kyber/v3 v3.0.3/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
go.dedis.ch/kyber/v3 v3.0.4 h1:FDuC/S3STkvwxZ0ooo3gcp56QkUKsN7Jy7cpzBxL+vQ=
go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ=
go.dedis.ch/kyber/v3 v3.0.5 h1:BpjX6vY1R3b7TnJ0mUnCFRVXEJThSAj1zQzmNh4v+70=
go.dedis.ch/kyber/v3 v3.0.5/go.mod h1:V1z0JihG9+dUEUCKLI9j9tjnlIflBw3wx8UOg0g3Pnk=
go.dedis.ch/onet/v3 v3.0.20/go.mod h1:ImNGuFERh9xpFGfXH9nYBzkSk1TKTx6DPaeaeqvvQzc=
go.dedis.ch/onet/v3 v3.0.21 h1:+sSu6fQnYy7ZQM5P9jDhI8pOc6Xu8Zr+RjU+urcp3LA=
go.dedis.ch/onet/v3 v3.0.21/go.mod h1:ImNGuFERh9xpFGfXH9nYBzkSk1TKTx6DPaeaeqvvQzc=
go.dedis.ch/onet/v3 v3.0.23 h1:jTqiI//xzzXuVrulMSSV+2qypDF0V1zcAMfY+N6lols=
go.dedis.ch/onet/v3 v3.0.23/go.mod h1:OsEui5KY4+z0hc6od4JOjqZjqgKNTqiGSOMfBcR+Nks=
go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo=
go.dedis.ch/protobuf v1.0.6 h1:E61p2XjYbYrTf3WeXE8M8Ui5WA3hX/NgbHHi5D0FLxI=
go.dedis.ch/protobuf v1.0.6/go.mod h1:YHYXW6dQ9p2iJ3f+2fxKnOpjGx0MvL4cwpg1RVNXaV8=
go.dedis.ch/protobuf v1.0.7 h1:wRUEiq3u0/vBhLjcw9CmAVrol+BnDyq2M0XLukdphyI=
go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4=
go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b h1:Elez2XeF2p9uyVj0yEUDqQ56NFcDtcBNkYP7yv8YbUE=
golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
Expand Down Expand Up @@ -104,6 +114,8 @@ golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
Expand Down

0 comments on commit 55b5f29

Please sign in to comment.