From 7f1844a39e7fc39cc2a6a4b933852031d0db7ef1 Mon Sep 17 00:00:00 2001 From: Vsevolod Brekelov Date: Tue, 24 Dec 2019 22:58:15 +0300 Subject: [PATCH 1/2] transaction: add unmarshaling for TXType --- pkg/core/transaction/type.go | 47 ++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/pkg/core/transaction/type.go b/pkg/core/transaction/type.go index e7cc222f8..4cb0efaef 100644 --- a/pkg/core/transaction/type.go +++ b/pkg/core/transaction/type.go @@ -1,5 +1,11 @@ package transaction +import ( + "strings" + + "github.com/pkg/errors" +) + // TXType is the type of a transaction. type TXType uint8 @@ -52,3 +58,44 @@ func (t TXType) String() string { func (t TXType) MarshalJSON() ([]byte, error) { return []byte(`"` + t.String() + `"`), nil } + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *TXType) UnmarshalJSON(data []byte) error { + l := len(data) + if l < 2 || data[0] != '"' || data[l-1] != '"' { + return errors.New("wrong format") + } + var err error + *t, err = TXTypeFromString(string(data[1 : l-1])) + return err +} + +// TXTypeFromString searches for TXType by string name. +func TXTypeFromString(jsonString string) (TXType, error) { + switch jsonString = strings.TrimSpace(jsonString); jsonString { + case "MinerTransaction": + return MinerType, nil + case "IssueTransaction": + return IssueType, nil + case "ClaimTransaction": + return ClaimType, nil + case "EnrollmentTransaction": + return EnrollmentType, nil + case "VotingTransaction": + return VotingType, nil + case "RegisterTransaction": + return RegisterType, nil + case "ContractTransaction": + return ContractType, nil + case "StateTransaction": + return StateType, nil + case "AgencyTransaction": + return AgencyType, nil + case "PublishTransaction": + return PublishType, nil + case "InvocationTransaction": + return InvocationType, nil + default: + return 0, errors.New("unknown state") + } +} From 606616618f22be3b64963e3ef77fd8dbffaeb8d7 Mon Sep 17 00:00:00 2001 From: Vsevolod Brekelov Date: Tue, 24 Dec 2019 23:01:16 +0300 Subject: [PATCH 2/2] rpc: add ability to answer as C# with block as []byte --- pkg/rpc/server.go | 9 ++++++++- pkg/rpc/server_test.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/rpc/server.go b/pkg/rpc/server.go index 549fc0f2a..e9d30c8a0 100644 --- a/pkg/rpc/server.go +++ b/pkg/rpc/server.go @@ -152,7 +152,14 @@ Methods: break } - results = wrappers.NewBlock(block, s.chain) + if len(reqParams) == 2 && reqParams[1].Value == 1 { + results = wrappers.NewBlock(block, s.chain) + } else { + writer := io.NewBufBinWriter() + block.EncodeBinary(writer.BinWriter) + results = hex.EncodeToString(writer.Bytes()) + } + case "getblockcount": getblockcountCalled.Inc() results = s.chain.BlockHeight() + 1 diff --git a/pkg/rpc/server_test.go b/pkg/rpc/server_test.go index 5950d4eca..4b86ac271 100644 --- a/pkg/rpc/server_test.go +++ b/pkg/rpc/server_test.go @@ -108,7 +108,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getblock": { { name: "positive", - params: "[1]", + params: "[1, 1]", result: func(e *executor) interface{} { return &GetBlockResponse{} }, check: func(t *testing.T, e *executor, result interface{}) { res, ok := result.(*GetBlockResponse)