diff --git a/deploy/compile/solgo/main.go b/deploy/compile/solgo/main.go index 0229cd5d4b3dcaf0ec0f8557a093b3a63f66ec61..6611daad095b5ea1cdff34f1a58cad0722b4d4b1 100644 --- a/deploy/compile/solgo/main.go +++ b/deploy/compile/solgo/main.go @@ -39,7 +39,7 @@ func main() { for _, c := range resp.Objects { f.WriteString(fmt.Sprintf("var Bytecode_%s = hex.MustDecodeString(\"%s\")\n", c.Objectname, c.Binary.Evm.Bytecode.Object)) - f.WriteString(fmt.Sprintf("var Abi_%s = `%s`\n", + f.WriteString(fmt.Sprintf("var Abi_%s = []byte(`%s`)\n", c.Objectname, c.Binary.Abi)) } } diff --git a/execution/evm/abi/abi.go b/execution/evm/abi/abi.go index 037be30447d7e16216036323e80d67939914e6c2..3879bb8a89b292e3a45f0be857181c6b597121a0 100644 --- a/execution/evm/abi/abi.go +++ b/execution/evm/abi/abi.go @@ -12,6 +12,7 @@ import ( "strings" "unsafe" // just for Sizeof + burrow_binary "github.com/hyperledger/burrow/binary" "github.com/hyperledger/burrow/crypto" "github.com/hyperledger/burrow/execution/evm/sha3" ) @@ -867,6 +868,12 @@ func ReadAbiSpec(specBytes []byte) (*AbiSpec, error) { if err != nil { return nil, err } + for i := range inputs { + if inputs[i].Indexed && inputs[i].EVM.isDynamic() { + // For Dynamic types, the hash is stored in stead + inputs[i].EVM = EVMBytes{M: 32} + } + } abiSpec.Events[s.Name] = Event{Inputs: inputs} case "function": inputs, err := readArgSpec(s.Inputs) @@ -1007,6 +1014,81 @@ func GetFunctionID(signature string) (id FunctionID) { return } +func UnpackRevert(data []byte) (message string, err error) { + err = RevertAbi.UnpackWithID(data, &message) + return +} + +/* + * Given a eventSpec, get all the fields (topic fields or not) + */ +func UnpackEvent(eventSpec Event, topics []burrow_binary.Word256, data []byte, args ...interface{}) error { + // First unpack the topic fields + topicIndex := 0 + if !eventSpec.Anonymous { + topicIndex++ + } + + for i, a := range eventSpec.Inputs { + if a.Indexed { + _, err := a.EVM.unpack(topics[topicIndex].Bytes(), 0, args[i]) + if err != nil { + return err + } + topicIndex++ + } + } + + // Now unpack the other fields. unpack will step over any indexed fields + return unpack(eventSpec.Inputs, data, func(i int) interface{} { + return args[i] + }) +} + +func (abiSpec *AbiSpec) Unpack(data []byte, fname string, args ...interface{}) error { + var funcSpec FunctionSpec + var argSpec []Argument + if fname != "" { + if _, ok := abiSpec.Functions[fname]; ok { + funcSpec = abiSpec.Functions[fname] + } else { + funcSpec = abiSpec.Fallback + } + } else { + funcSpec = abiSpec.Constructor + } + + argSpec = funcSpec.Outputs + + if argSpec == nil { + return fmt.Errorf("Unknown function %s", fname) + } + + return unpack(argSpec, data, func(i int) interface{} { + return args[i] + }) +} + +func (abiSpec *AbiSpec) UnpackWithID(data []byte, args ...interface{}) error { + var argSpec []Argument + + var id FunctionID + copy(id[:], data) + for _, fspec := range abiSpec.Functions { + if id == fspec.FunctionID { + argSpec = fspec.Outputs + } + } + + if argSpec == nil { + return fmt.Errorf("Unknown function %x", id) + } + + return unpack(argSpec, data[4:], func(i int) interface{} { + return args[i] + }) +} + func (abiSpec *AbiSpec) Pack(fname string, args ...interface{}) ([]byte, error) { var funcSpec FunctionSpec var argSpec []Argument @@ -1213,6 +1295,10 @@ func unpack(argSpec []Argument, data []byte, getArg func(int) interface{}) error } for i, a := range argSpec { + if a.Indexed { + continue + } + arg := getArg(i) if a.IsArray { var array *[]interface{} diff --git a/execution/evm/abi/core.go b/execution/evm/abi/core.go index 617665b98efe86e78902e93cc9c845b599bbf12d..c68b367de7f169a4dd876bdbf856e688a0ff1adf 100644 --- a/execution/evm/abi/core.go +++ b/execution/evm/abi/core.go @@ -16,6 +16,16 @@ type Variable struct { Value string } +func init() { + var err error + RevertAbi, err = ReadAbiSpec([]byte(`[{"name":"Error","type":"function","outputs":[{"type":"string"}],"inputs":[{"type":"string"}]}]`)) + if err != nil { + panic(fmt.Sprintf("internal error: failed to build revert abi: %v", err)) + } +} + +var RevertAbi *AbiSpec + func ReadAbiFormulateCallFile(abiLocation, binPath, funcName string, args []string) ([]byte, error) { abiSpecBytes, err := readAbi(binPath, abiLocation) if err != nil { diff --git a/execution/solidity/revert.sol.go b/execution/solidity/revert.sol.go index 0298b821afdf4eb6b0d80d428430993c6c961164..2d618b950405fcee6b7bb92564677431bbb4ec65 100644 --- a/execution/solidity/revert.sol.go +++ b/execution/solidity/revert.sol.go @@ -3,4 +3,4 @@ package solidity import "github.com/tmthrgd/go-hex" var Bytecode_Revert = hex.MustDecodeString("608060405234801561001057600080fd5b506101f4806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635b202afb14610046575b600080fd5b34801561005257600080fd5b50610077600480360381019080803563ffffffff169060200190929190505050610079565b005b60008163ffffffff1614156100f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f492068617665207265766572746564000000000000000000000000000000000081525060200191505060405180910390fd5b8080600190039150508063ffffffff167ff7f0feb5b4ac5276c55faa8936d962de931ebe8333a2efdc0506878de3979ba960405160405180910390a23073ffffffffffffffffffffffffffffffffffffffff16635b202afb826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808263ffffffff1663ffffffff168152602001915050600060405180830381600087803b1580156101ad57600080fd5b505af11580156101c1573d6000803e3d6000fd5b50505050505600a165627a7a7230582024a36efd1abf70d00acdeea9b7cebd6e23cb5739c56ac17f65054c1d5711e9bf0029") -var Abi_Revert = `[{"constant":false,"inputs":[{"name":"i","type":"uint32"}],"name":"RevertAt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"i","type":"uint32"}],"name":"NotReverting","type":"event"}]` +var Abi_Revert = []byte(`[{"constant":false,"inputs":[{"name":"i","type":"uint32"}],"name":"RevertAt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"i","type":"uint32"}],"name":"NotReverting","type":"event"}]`) diff --git a/execution/solidity/strange_loop.sol.go b/execution/solidity/strange_loop.sol.go index 018ac53cd07b3ff2a83ef709358a5e269b4ba8cd..5f85f9321db2f3f8d5930fd32d44fbb0ce4ae52f 100644 --- a/execution/solidity/strange_loop.sol.go +++ b/execution/solidity/strange_loop.sol.go @@ -3,4 +3,4 @@ package solidity import "github.com/tmthrgd/go-hex" var Bytecode_StrangeLoop = hex.MustDecodeString("60806040526017600055602260015560116002556001600360006101000a81548160ff02191690831515021790555034801561003a57600080fd5b506103da8061004a6000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ebb384dd14610046575b600080fd5b34801561005257600080fd5b5061005b610071565b6040518082815260200191505060405180910390f35b60006002549050600360009054906101000a900460ff161561026b5760015460025412156101a5576002600081548092919060010191905055506002547f55707369652100000000000000000000000000000000000000000000000000007f3ff0b1eac80ecf8e93d1a2d7982a9230f8ea7693439fd548687b08a5e292b09760405160405180910390a360025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561016457600080fd5b505af1158015610178573d6000803e3d6000fd5b505050506040513d602081101561018e57600080fd5b810190808051906020019092919050505050610266565b6000600360006101000a81548160ff02191690831515021790555060025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b505050506040513d602081101561025357600080fd5b8101908080519060200190929190505050505b6103aa565b600054600254131561038457600260008154809291906001900391905055506002547f446f776e736965210000000000000000000000000000000000000000000000007f3ff0b1eac80ecf8e93d1a2d7982a9230f8ea7693439fd548687b08a5e292b09760405160405180910390a360025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561034357600080fd5b505af1158015610357573d6000803e3d6000fd5b505050506040513d602081101561036d57600080fd5b8101908080519060200190929190505050506103a9565b6001600360006101000a81548160ff02191690831515021790555060025490506103ab565b5b5b905600a165627a7a723058208a36392c4111612b78f5e50934eb54c073f518a40cb7424d0b06303cdfdd93440029") -var Abi_StrangeLoop = `[{"constant":false,"inputs":[],"name":"UpsieDownsie","outputs":[{"name":"i","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"direction","type":"bytes32"},{"indexed":true,"name":"newDepth","type":"int256"}],"name":"ChangeLevel","type":"event"}]` +var Abi_StrangeLoop = []byte(`[{"constant":false,"inputs":[],"name":"UpsieDownsie","outputs":[{"name":"i","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"direction","type":"bytes32"},{"indexed":true,"name":"newDepth","type":"int256"}],"name":"ChangeLevel","type":"event"}]`) diff --git a/execution/solidity/zero_reset.sol.go b/execution/solidity/zero_reset.sol.go index cf034e0cf622e581350a5689abfae3dc28388e52..858122389b861be6b085afeb563964559e71ae68 100644 --- a/execution/solidity/zero_reset.sol.go +++ b/execution/solidity/zero_reset.sol.go @@ -3,4 +3,4 @@ package solidity import "github.com/tmthrgd/go-hex" var Bytecode_ZeroReset = hex.MustDecodeString("608060405234801561001057600080fd5b506101c0806100206000396000f300608060405260043610610077576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680620267a41461007c5780634ef65c3b146100a757806362738998146100d4578063747586b8146100ff578063987dc8201461012c578063b15a0d5f14610143575b600080fd5b34801561008857600080fd5b5061009161015a565b6040518082815260200191505060405180910390f35b3480156100b357600080fd5b506100d260048036038101908080359060200190929190505050610164565b005b3480156100e057600080fd5b506100e961016e565b6040518082815260200191505060405180910390f35b34801561010b57600080fd5b5061012a60048036038101908080359060200190929190505050610177565b005b34801561013857600080fd5b50610141610181565b005b34801561014f57600080fd5b5061015861018a565b005b6000600154905090565b8060018190555050565b60008054905090565b8060008190555050565b60008081905550565b60006001819055505600a165627a7a72305820c19c71b6113c0b546a6cf9c093b61a1e9c9f42f62811bb4ebaff2f02b860a43e0029") -var Abi_ZeroReset = `[{"constant":true,"inputs":[],"name":"getUint","outputs":[{"name":"retUint","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInt","outputs":[{"name":"retInt","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setIntToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setUintToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]` +var Abi_ZeroReset = []byte(`[{"constant":true,"inputs":[],"name":"getUint","outputs":[{"name":"retUint","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInt","outputs":[{"name":"retInt","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setIntToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setUintToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]`) diff --git a/integration/core/kernel_test.go b/integration/core/kernel_test.go index 374cf4b9913bee6beb4d23acc4e3ecd5ed5c9fbc..420c468af6478ddd04c2e8eb9350f5dcaba89813 100644 --- a/integration/core/kernel_test.go +++ b/integration/core/kernel_test.go @@ -17,6 +17,7 @@ import ( "github.com/hyperledger/burrow/core" "github.com/hyperledger/burrow/event" "github.com/hyperledger/burrow/execution/exec" + "github.com/hyperledger/burrow/execution/solidity" "github.com/hyperledger/burrow/genesis" "github.com/hyperledger/burrow/integration" "github.com/hyperledger/burrow/integration/rpctest" @@ -142,7 +143,7 @@ func bootWaitBlocksShutdown(t testing.TB, privValidator tmTypes.PrivValidator, t tcli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) // Generate a few transactions for i := 0; i < 3; i++ { - rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_Strangeloop) + rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_StrangeLoop) } subID := event.GenSubID() diff --git a/integration/rpcevents/execution_events_server_test.go b/integration/rpcevents/execution_events_server_test.go index bc867e339f31828391969e4fdb611ad9a947f46b..7d1bccd69570c55516bfe3667fcc00c1ad660df0 100644 --- a/integration/rpcevents/execution_events_server_test.go +++ b/integration/rpcevents/execution_events_server_test.go @@ -24,13 +24,12 @@ import ( "testing" "time" - "github.com/hyperledger/burrow/binary" "github.com/hyperledger/burrow/event" "github.com/hyperledger/burrow/event/query" "github.com/hyperledger/burrow/execution/errors" "github.com/hyperledger/burrow/execution/evm/abi" - "github.com/hyperledger/burrow/execution/evm/asm/bc" "github.com/hyperledger/burrow/execution/exec" + "github.com/hyperledger/burrow/execution/solidity" "github.com/hyperledger/burrow/integration/rpctest" "github.com/hyperledger/burrow/rpc/rpcevents" "github.com/hyperledger/burrow/rpc/rpctransact" @@ -131,11 +130,13 @@ func TestGetEventsSendFiltered(t *testing.T) { func TestRevert(t *testing.T) { tcli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) - txe := rpctest.CreateContract(t, tcli, inputAddress, rpctest.Bytecode_Revert) - functionID := abi.GetFunctionID("RevertAt(uint32)") + txe := rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_Revert) + spec, err := abi.ReadAbiSpec(solidity.Abi_Revert) + require.NoError(t, err) + data, err := spec.Pack("RevertAt", 4) + require.NoError(t, err) contractAddress := txe.Receipt.ContractAddress - txe = rpctest.CallContract(t, tcli, inputAddress, contractAddress, - bc.MustSplice(functionID, binary.Int64ToWord256(4))) + txe = rpctest.CallContract(t, tcli, inputAddress, contractAddress, data) assert.Equal(t, errors.ErrorCodeExecutionReverted, txe.Exception.Code) request := &rpcevents.BlocksRequest{ diff --git a/execution/solidity/helpers.go b/integration/rpctest/helpers.go similarity index 100% rename from execution/solidity/helpers.go rename to integration/rpctest/helpers.go diff --git a/integration/rpctransact/call_test.go b/integration/rpctransact/call_test.go index 4628b110c9471c830d766f334ecb81806407123a..4937943ffb0e7f2f6bfcf6f29bab3bd095da068b 100644 --- a/integration/rpctransact/call_test.go +++ b/integration/rpctransact/call_test.go @@ -5,7 +5,6 @@ package rpctransact import ( "context" "fmt" - "strings" "sync" "testing" @@ -66,7 +65,7 @@ func TestCreateContract(t *testing.T) { Amount: 2, }, Address: nil, - Data: solidity.Bytecode_Strangeloop, + Data: solidity.Bytecode_StrangeLoop, Fee: 2, GasLimit: 10000, }) @@ -91,7 +90,7 @@ func BenchmarkCreateContract(b *testing.B) { Amount: 2, }, Address: nil, - Data: solidity.Bytecode_Strangeloop, + Data: solidity.Bytecode_StrangeLoop, Fee: 2, GasLimit: 10000, }) @@ -104,15 +103,20 @@ func TestCallTxSync(t *testing.T) { cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) numGoroutines := 40 numRuns := 5 - functionID := abi.GetFunctionID("UpsieDownsie()") + spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop) + require.NoError(t, err) + data, err := spec.Pack("UpsieDownsie") + require.NoError(t, err) countCh := rpctest.CommittedTxCount(t, kern.Emitter) for i := 0; i < numGoroutines; i++ { go func() { for j := 0; j < numRuns; j++ { - createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop) + createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop) callTxe := rpctest.CallContract(t, cli, inputAddress, lastCall(createTxe.Events).CallData.Callee, - functionID[:]) - depth := binary.Uint64FromWord256(binary.LeftPadWord256(lastCall(callTxe.Events).Return)) + data) + var depth int64 + err = spec.Unpack(lastCall(callTxe.Events).Return, "UpsieDownsie", &depth) + require.NoError(t, err) // Would give 23 if taken from wrong frame (i.e. not the outer stackdepth == 0 one) assert.Equal(t, 18, int(depth)) } @@ -248,10 +252,13 @@ func TestNestedCall(t *testing.T) { func TestCallEvents(t *testing.T) { cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) - createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop) + createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop) address := lastCall(createTxe.Events).CallData.Callee - functionID := abi.GetFunctionID("UpsieDownsie()") - callTxe := rpctest.CallContract(t, cli, inputAddress, address, functionID[:]) + spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop) + require.NoError(t, err) + data, err := spec.Pack("UpsieDownsie") + require.NoError(t, err) + callTxe := rpctest.CallContract(t, cli, inputAddress, address, data) callEvents := filterCalls(callTxe.Events) require.Len(t, callEvents, rpctest.UpsieDownsieCallCount, "should see 30 recursive call events") for i, ev := range callEvents { @@ -261,15 +268,20 @@ func TestCallEvents(t *testing.T) { func TestLogEvents(t *testing.T) { cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) - createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop) + createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop) address := lastCall(createTxe.Events).CallData.Callee - functionID := abi.GetFunctionID("UpsieDownsie()") - callTxe := rpctest.CallContract(t, cli, inputAddress, address, functionID[:]) + spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop) + require.NoError(t, err) + data, err := spec.Pack("UpsieDownsie") + require.NoError(t, err) + callTxe := rpctest.CallContract(t, cli, inputAddress, address, data) evs := filterLogs(callTxe.Events) require.Len(t, evs, rpctest.UpsieDownsieCallCount-2) log := evs[0] - depth := binary.Int64FromWord256(log.Topics[2]) - direction := strings.TrimRight(string(log.Topics[1][:]), "\x00") + var direction string + var depth int64 + err = abi.UnpackEvent(spec.Events["ChangeLevel"], log.Topics, log.Data, &direction, &depth) + require.NoError(t, err) assert.Equal(t, int64(18), depth) assert.Equal(t, "Upsie!", direction) } @@ -277,15 +289,15 @@ func TestLogEvents(t *testing.T) { func TestRevert(t *testing.T) { cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress) txe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Revert) - functionID := abi.GetFunctionID("RevertAt(uint32)") - txe = rpctest.CallContract(t, cli, inputAddress, txe.Receipt.ContractAddress, - bc.MustSplice(functionID, binary.Int64ToWord256(4))) + spec, err := abi.ReadAbiSpec(solidity.Abi_Revert) + require.NoError(t, err) + data, err := spec.Pack("RevertAt", 4) + require.NoError(t, err) + txe = rpctest.CallContract(t, cli, inputAddress, txe.Receipt.ContractAddress, data) assert.Equal(t, errors.ErrorCodeExecutionReverted, txe.Exception.Code) - - revertReason := "I have reverted" - expectedReturn := bc.MustSplice(abi.GetFunctionID("Error(string)"), binary.Int64ToWord256(binary.Word256Length), - binary.Int64ToWord256(int64(len(revertReason))), binary.RightPadWord256([]byte(revertReason))) - assert.Equal(t, expectedReturn, txe.Result.Return) + revertReason, err := abi.UnpackRevert(txe.Result.Return) + require.NoError(t, err) + assert.Equal(t, revertReason, "I have reverted") } func filterCalls(evs []*exec.Event) []*exec.CallEvent { diff --git a/integration/rpctransact/transact_server_test.go b/integration/rpctransact/transact_server_test.go index e452d398654419f6eba1f82375e38a1ad29b1e53..6d52bd3ea5b801373364997e8413678a1770578f 100644 --- a/integration/rpctransact/transact_server_test.go +++ b/integration/rpctransact/transact_server_test.go @@ -49,7 +49,7 @@ func TestInputAccountPublicKeySet(t *testing.T) { assert.False(t, acc.PublicKey.IsSet()) // Sign with this account - should set public key - rpctest.CreateContract(t, tcli, input.Address(), solidity.Bytecode_Strangeloop) + rpctest.CreateContract(t, tcli, input.Address(), solidity.Bytecode_StrangeLoop) acc, err = qcli.GetAccount(context.Background(), &rpcquery.GetAccountParam{Address: input.Address()}) // Check public key set