From aa61e9528523e5424bc6ee9a0f290b6d5bc0fa0c Mon Sep 17 00:00:00 2001 From: Silas Davis <silas@erisindustries.com> Date: Fri, 17 Feb 2017 17:20:18 +0000 Subject: [PATCH] Fix snative signature test --- Makefile | 5 +++++ manager/eris-mint/evm/native.go | 3 ++- manager/eris-mint/evm/snative.go | 6 +++--- manager/eris-mint/evm/snative_test.go | 27 ++++++++++++++------------- util/snatives/main.go | 19 +++++++++++++++++++ word256/word.go | 3 ++- 6 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 util/snatives/main.go diff --git a/Makefile b/Makefile index 29bbd1a8..53fd84ee 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,11 @@ hell: go build -o ${REPO}/target/hell ./util/hell/cmd/hell/main.go ./target/hell $(filter-out $@,$(MAKECMDGOALS)) +# Dumps Solidity interface contracts for SNatives +.PHONY: snatives +snatives: + @go run ./util/snatives/main.go + ### Building github.com/eris-ltd/eris-db # build all targets in github.com/eris-ltd/eris-db diff --git a/manager/eris-mint/evm/native.go b/manager/eris-mint/evm/native.go index ab9e0c97..7470ee32 100644 --- a/manager/eris-mint/evm/native.go +++ b/manager/eris-mint/evm/native.go @@ -40,7 +40,8 @@ func registerNativeContracts() { type NativeContract func(appState AppState, caller *Account, input []byte, gas *int64) (output []byte, err error) -type FuncID [4]byte +const FuncIDLength = 4 +type FuncID [FuncIDLength]byte /* Removed due to C dependency func ecrecoverFunc(appState AppState, caller *Account, input []byte, gas *int64) (output []byte, err error) { diff --git a/manager/eris-mint/evm/snative.go b/manager/eris-mint/evm/snative.go index c107804c..a9829919 100644 --- a/manager/eris-mint/evm/snative.go +++ b/manager/eris-mint/evm/snative.go @@ -201,7 +201,7 @@ func NewSNativeContract(comment, name string, functions ...SNativeFuncDescriptio func (contract *SNativeContractDescription) Dispatch(appState AppState, caller *Account, args []byte, gas *int64) (output []byte, err error) { - if len(args) < 4 { + if len(args) < FuncIDLength { return Zero256.Bytes(), fmt.Errorf("SNatives dispatch requires a 4-byte function "+ "identifier but arguments are only %s bytes long", len(args)) } @@ -211,7 +211,7 @@ func (contract *SNativeContractDescription) Dispatch(appState AppState, return Zero256.Bytes(), err } - remainingArgs := args[4:] + remainingArgs := args[FuncIDLength:] // check if we have permission to call this function if !HasPermission(appState, caller, function.PermFlag) { @@ -219,7 +219,7 @@ func (contract *SNativeContractDescription) Dispatch(appState AppState, } // ensure there are enough arguments - if len(remainingArgs) != function.NArgs()*32 { + if len(remainingArgs) != function.NArgs()*Word256Length { return Zero256.Bytes(), fmt.Errorf("%s() takes %d arguments", function.Name, function.NArgs()) } diff --git a/manager/eris-mint/evm/snative_test.go b/manager/eris-mint/evm/snative_test.go index b04aefda..65a94f7b 100644 --- a/manager/eris-mint/evm/snative_test.go +++ b/manager/eris-mint/evm/snative_test.go @@ -9,15 +9,16 @@ import ( ) /* Compiling the Permissions solidity contract at +(generated by Solidity() function) https://ethereum.github.io/browser-solidity yields: 3fbf7da5 add_role(address,bytes32) -bb37737a has_base(address,int256) +744f5998 has_base(address,uint64) e8145855 has_role(address,bytes32) 28fd0194 rm_role(address,bytes32) -9ea53314 set_base(address,int256,bool) -d69186a6 set_global(int256,bool) -180d26f2 unset_base(address,int256) +3f0ebb30 set_base(address,uint64,uint64) +67dc6f70 set_global(address,uint64,uint64) +73448c99 unset_base(address,uint64) */ func TestPermissionsContract(t *testing.T) { @@ -27,23 +28,23 @@ func TestPermissionsContract(t *testing.T) { assertContractFunction(t, contract, "3fbf7da5", "add_role(address,bytes32)") - assertContractFunction(t, contract, "bb37737a", - "has_base(address,int256)") + assertContractFunction(t, contract, "744f5998", + "has_base(address,uint64)") - assertContractFunction(t, contract, "054556ac", + assertContractFunction(t, contract, "e8145855", "has_role(address,bytes32)") - assertContractFunction(t, contract, "ded3350a", + assertContractFunction(t, contract, "28fd0194", "rm_role(address,bytes32)") - assertContractFunction(t, contract, "c2174d8f", - "set_base(address,int256,bool)") + assertContractFunction(t, contract, "3f0ebb30", + "set_base(address,uint64,uint64)") - assertContractFunction(t, contract, "85f1522b", - "set_global(int256,bool)") + assertContractFunction(t, contract, "67dc6f70", + "set_global(address,uint64,uint64)") assertContractFunction(t, contract, "73448c99", - "unset_base(address,int256)") + "unset_base(address,uint64)") } func TestSNativeFuncTemplate(t *testing.T) { diff --git a/util/snatives/main.go b/util/snatives/main.go new file mode 100644 index 00000000..e15d26ff --- /dev/null +++ b/util/snatives/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + + "github.com/eris-ltd/eris-db/manager/eris-mint/evm" +) + +// Dump SNative contracts +func main() { + for _, contract := range vm.SNativeContracts() { + solidity, err := contract.Solidity() + if err != nil { + fmt.Printf("Error generating solidity for contract %s: %s\n", + contract.Name, err) + } + fmt.Println(solidity) + } +} diff --git a/word256/word.go b/word256/word.go index 2537830e..9dfe7a67 100644 --- a/word256/word.go +++ b/word256/word.go @@ -30,7 +30,8 @@ var ( One256 = Word256{1} ) -type Word256 [32]byte +const Word256Length = 32 +type Word256 [Word256Length]byte func (w Word256) String() string { return string(w[:]) } func (w Word256) TrimmedString() string { return TrimmedString(w.Bytes()) } -- GitLab