cmd/clef: bundle 4byte db into clef, (#19112)

* clef: bundle 4byte db into clef, fix #19048

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

* cmd/clef: extend go generate to format asset file
This commit is contained in:
Martin Holst Swende 2019-04-11 12:22:48 +02:00 committed by Péter Szilágyi
parent 31bc2a2434
commit 54dfce8af7
7 changed files with 305 additions and 33 deletions

File diff suppressed because one or more lines are too long

273
cmd/clef/bindata.go Normal file

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,9 @@
// arbitrary data. // arbitrary data.
package main package main
//go:generate go-bindata -o bindata.go resources/4byte.json
//go:generate gofmt -s -w bindata.go
import ( import (
"bufio" "bufio"
"context" "context"
@ -57,16 +60,16 @@ import (
) )
const legalWarning = ` 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 Please take care to
- backup your keystore files, - backup your keystore files,
- verify that the keystore(s) can be opened with your password. - 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; 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 without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details. PURPOSE. See the GNU General Public License for more details.
` `
@ -104,11 +107,6 @@ var (
Name: "signersecret", Name: "signersecret",
Usage: "A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash", 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{ customDBFlag = cli.StringFlag{
Name: "4bytedb-custom", Name: "4bytedb-custom",
Usage: "File used for writing new 4byte-identifiers submitted via API", Usage: "File used for writing new 4byte-identifiers submitted via API",
@ -145,7 +143,7 @@ var (
configdirFlag, configdirFlag,
}, },
Description: ` 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.`, the rule-engine to work.`,
} }
attestCommand = cli.Command{ attestCommand = cli.Command{
@ -159,10 +157,10 @@ the rule-engine to work.`,
signerSecretFlag, signerSecretFlag,
}, },
Description: ` Description: `
The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of
incoming requests. 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.`, Clef that the file is 'safe' to execute.`,
} }
@ -177,7 +175,7 @@ Clef that the file is 'safe' to execute.`,
signerSecretFlag, signerSecretFlag,
}, },
Description: ` 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) remove any stored credential for that address (keyfile)
`} `}
gendocCommand = cli.Command{ gendocCommand = cli.Command{
@ -206,7 +204,6 @@ func init() {
utils.RPCEnabledFlag, utils.RPCEnabledFlag,
rpcPortFlag, rpcPortFlag,
signerSecretFlag, signerSecretFlag,
dBFlag,
customDBFlag, customDBFlag,
auditLogFlag, auditLogFlag,
ruleFlag, ruleFlag,
@ -273,12 +270,12 @@ func initializeSecrets(c *cli.Context) error {
} }
fmt.Printf("A master seed has been generated into %s\n", location) fmt.Printf("A master seed has been generated into %s\n", location)
fmt.Printf(` 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) * Passwords for keystores (used by rule engine)
* Storage for javascript rules * Storage for javascript rules
* Hash of rule-file * 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! NOTE: This file does not contain your accounts. Those need to be backed up separately!
`) `)
@ -365,13 +362,17 @@ func signer(c *cli.Context) error {
log.Info("Using CLI as UI-channel") log.Info("Using CLI as UI-channel")
ui = core.NewCommandlineUI() ui = core.NewCommandlineUI()
} }
fourByteDb := c.GlobalString(dBFlag.Name) // 4bytedb data
fourByteLocal := c.GlobalString(customDBFlag.Name) fourByteLocal := c.GlobalString(customDBFlag.Name)
db, err := core.NewAbiDBFromFiles(fourByteDb, fourByteLocal) data, err := Asset("resources/4byte.json")
if err != nil { if err != nil {
utils.Fatalf(err.Error()) utils.Fatalf(err.Error())
} }
log.Info("Loaded 4byte db", "signatures", db.Size(), "file", fourByteDb, "local", fourByteLocal) db, err := core.NewAbiDBFromFiles(data, fourByteLocal)
if err != nil {
utils.Fatalf(err.Error())
}
log.Info("Loaded 4byte db", "signatures", db.Size(), "local", fourByteLocal)
var ( var (
api core.ExternalAPI api core.ExternalAPI

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,7 @@ package core
import ( import (
"bytes" "bytes"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@ -183,17 +184,13 @@ func NewAbiDBFromFile(path string) (*AbiDb, error) {
return db, nil return db, nil
} }
// NewAbiDBFromFiles loads both the standard signature database and a custom database. The latter will be used // NewAbiDBFromFiles loads both the standard signature database (resource file)and a custom database.
// to write new values into if they are submitted via the API // The latter will be used to write new values into if they are submitted via the API
func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) { func NewAbiDBFromFiles(raw []byte, custom string) (*AbiDb, error) {
db := &AbiDb{make(map[string]string), make(map[string]string), custom} db := &AbiDb{make(map[string]string), make(map[string]string), custom}
db.customdbPath = custom db.customdbPath = custom
raw, err := ioutil.ReadFile(standard)
if err != nil {
return nil, err
}
if err := json.Unmarshal(raw, &db.db); err != nil { if err := json.Unmarshal(raw, &db.db); err != nil {
return nil, err return nil, err
} }
@ -207,7 +204,6 @@ func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) {
return nil, err return nil, err
} }
} }
return db, nil return db, nil
} }
@ -217,7 +213,7 @@ func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) {
if len(id) < 4 { if len(id) < 4 {
return "", fmt.Errorf("Expected 4-byte id, got %d", len(id)) 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 { if key, exists := db.db[sig]; exists {
return key, nil return key, nil
} }
@ -226,6 +222,7 @@ func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) {
} }
return "", fmt.Errorf("Signature %v not found", sig) return "", fmt.Errorf("Signature %v not found", sig)
} }
func (db *AbiDb) Size() int { func (db *AbiDb) Size() int {
return len(db.db) return len(db.db)
} }
@ -255,6 +252,6 @@ func (db *AbiDb) AddSignature(selector string, data []byte) error {
if err == nil { if err == nil {
return nil return nil
} }
sig := common.ToHex(data[:4]) sig := hex.EncodeToString(data[:4])
return db.saveCustomAbi(selector, sig) return db.saveCustomAbi(selector, sig)
} }

View File

@ -205,7 +205,7 @@ func TestCustomABI(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
filename := fmt.Sprintf("%s/4byte_custom.json", d) filename := fmt.Sprintf("%s/4byte_custom.json", d)
abidb, err := NewAbiDBFromFiles("../../cmd/clef/4byte.json", filename) abidb, err := NewAbiDBFromFiles([]byte(""), filename)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -38,6 +38,7 @@ type Validator struct {
func NewValidator(db *AbiDb) *Validator { func NewValidator(db *AbiDb) *Validator {
return &Validator{db} return &Validator{db}
} }
func testSelector(selector string, data []byte) (*decodedCallData, error) { func testSelector(selector string, data []byte) (*decodedCallData, error) {
if selector == "" { if selector == "" {
return nil, fmt.Errorf("selector not found") return nil, fmt.Errorf("selector not found")