Skip to content

Commit

Permalink
cmd/clef: bundle 4byte db into clef, (ethereum#19112)
Browse files Browse the repository at this point in the history
* clef: bundle 4byte db into clef, fix ethereum#19048

* clef: add go-generate directive, remove internal abidb parser tool

* cmd/clef: extend go generate to format asset file
  • Loading branch information
holiman authored and karalabe committed Apr 11, 2019
1 parent 31bc2a2 commit 54dfce8
Show file tree
Hide file tree
Showing 7 changed files with 305 additions and 33 deletions.
1 change: 0 additions & 1 deletion cmd/clef/4byte.json

This file was deleted.

273 changes: 273 additions & 0 deletions cmd/clef/bindata.go

Large diffs are not rendered by default.

43 changes: 22 additions & 21 deletions cmd/clef/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
// arbitrary data.
package main

//go:generate go-bindata -o bindata.go resources/4byte.json
//go:generate gofmt -s -w bindata.go

import (
"bufio"
"context"
Expand Down Expand Up @@ -57,16 +60,16 @@ import (
)

const legalWarning = `
WARNING!
WARNING!
Clef is an account management tool. It may, like any software, contain bugs.
Clef is an account management tool. It may, like any software, contain bugs.
Please take care to
- backup your keystore files,
- backup your keystore files,
- verify that the keystore(s) can be opened with your password.
Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Clef is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
`

Expand Down Expand Up @@ -104,11 +107,6 @@ var (
Name: "signersecret",
Usage: "A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash",
}
dBFlag = cli.StringFlag{
Name: "4bytedb",
Usage: "File containing 4byte-identifiers",
Value: "./4byte.json",
}
customDBFlag = cli.StringFlag{
Name: "4bytedb-custom",
Usage: "File used for writing new 4byte-identifiers submitted via API",
Expand Down Expand Up @@ -145,7 +143,7 @@ var (
configdirFlag,
},
Description: `
The init command generates a master seed which Clef can use to store credentials and data needed for
The init command generates a master seed which Clef can use to store credentials and data needed for
the rule-engine to work.`,
}
attestCommand = cli.Command{
Expand All @@ -159,10 +157,10 @@ the rule-engine to work.`,
signerSecretFlag,
},
Description: `
The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of
incoming requests.
The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of
incoming requests.
Whenever you make an edit to the rule file, you need to use attestation to tell
Whenever you make an edit to the rule file, you need to use attestation to tell
Clef that the file is 'safe' to execute.`,
}

Expand All @@ -177,7 +175,7 @@ Clef that the file is 'safe' to execute.`,
signerSecretFlag,
},
Description: `
The setpw command stores a password for a given address (keyfile). If you enter a blank passphrase, it will
The setpw command stores a password for a given address (keyfile). If you enter a blank passphrase, it will
remove any stored credential for that address (keyfile)
`}
gendocCommand = cli.Command{
Expand Down Expand Up @@ -206,7 +204,6 @@ func init() {
utils.RPCEnabledFlag,
rpcPortFlag,
signerSecretFlag,
dBFlag,
customDBFlag,
auditLogFlag,
ruleFlag,
Expand Down Expand Up @@ -273,12 +270,12 @@ func initializeSecrets(c *cli.Context) error {
}
fmt.Printf("A master seed has been generated into %s\n", location)
fmt.Printf(`
This is required to be able to store credentials, such as :
This is required to be able to store credentials, such as :
* Passwords for keystores (used by rule engine)
* Storage for javascript rules
* Hash of rule-file
You should treat that file with utmost secrecy, and make a backup of it.
You should treat that file with utmost secrecy, and make a backup of it.
NOTE: This file does not contain your accounts. Those need to be backed up separately!
`)
Expand Down Expand Up @@ -365,13 +362,17 @@ func signer(c *cli.Context) error {
log.Info("Using CLI as UI-channel")
ui = core.NewCommandlineUI()
}
fourByteDb := c.GlobalString(dBFlag.Name)
// 4bytedb data
fourByteLocal := c.GlobalString(customDBFlag.Name)
db, err := core.NewAbiDBFromFiles(fourByteDb, fourByteLocal)
data, err := Asset("resources/4byte.json")
if err != nil {
utils.Fatalf(err.Error())
}
db, err := core.NewAbiDBFromFiles(data, fourByteLocal)
if err != nil {
utils.Fatalf(err.Error())
}
log.Info("Loaded 4byte db", "signatures", db.Size(), "file", fourByteDb, "local", fourByteLocal)
log.Info("Loaded 4byte db", "signatures", db.Size(), "local", fourByteLocal)

var (
api core.ExternalAPI
Expand Down
1 change: 1 addition & 0 deletions cmd/clef/resources/4byte.json

Large diffs are not rendered by default.

17 changes: 7 additions & 10 deletions signer/core/abihelper.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package core

import (
"bytes"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
Expand Down Expand Up @@ -183,17 +184,13 @@ func NewAbiDBFromFile(path string) (*AbiDb, error) {
return db, nil
}

// NewAbiDBFromFiles loads both the standard signature database and a custom database. The latter will be used
// to write new values into if they are submitted via the API
func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) {
// NewAbiDBFromFiles loads both the standard signature database (resource file)and a custom database.
// The latter will be used to write new values into if they are submitted via the API
func NewAbiDBFromFiles(raw []byte, custom string) (*AbiDb, error) {

db := &AbiDb{make(map[string]string), make(map[string]string), custom}
db.customdbPath = custom

raw, err := ioutil.ReadFile(standard)
if err != nil {
return nil, err
}
if err := json.Unmarshal(raw, &db.db); err != nil {
return nil, err
}
Expand All @@ -207,7 +204,6 @@ func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) {
return nil, err
}
}

return db, nil
}

Expand All @@ -217,7 +213,7 @@ func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) {
if len(id) < 4 {
return "", fmt.Errorf("Expected 4-byte id, got %d", len(id))
}
sig := common.ToHex(id[:4])
sig := hex.EncodeToString(id[:4])
if key, exists := db.db[sig]; exists {
return key, nil
}
Expand All @@ -226,6 +222,7 @@ func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) {
}
return "", fmt.Errorf("Signature %v not found", sig)
}

func (db *AbiDb) Size() int {
return len(db.db)
}
Expand Down Expand Up @@ -255,6 +252,6 @@ func (db *AbiDb) AddSignature(selector string, data []byte) error {
if err == nil {
return nil
}
sig := common.ToHex(data[:4])
sig := hex.EncodeToString(data[:4])
return db.saveCustomAbi(selector, sig)
}
2 changes: 1 addition & 1 deletion signer/core/abihelper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ func TestCustomABI(t *testing.T) {
t.Fatal(err)
}
filename := fmt.Sprintf("%s/4byte_custom.json", d)
abidb, err := NewAbiDBFromFiles("../../cmd/clef/4byte.json", filename)
abidb, err := NewAbiDBFromFiles([]byte(""), filename)
if err != nil {
t.Fatal(err)
}
Expand Down
1 change: 1 addition & 0 deletions signer/core/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type Validator struct {
func NewValidator(db *AbiDb) *Validator {
return &Validator{db}
}

func testSelector(selector string, data []byte) (*decodedCallData, error) {
if selector == "" {
return nil, fmt.Errorf("selector not found")
Expand Down

0 comments on commit 54dfce8

Please sign in to comment.