1
0
Fork 0
mirror of https://github.com/eosswedenorg/thalos synced 2026-06-16 04:24:56 +02:00

Merge pull request #8 from eosswedenorg:blocknum-and-timestamp

Adding Blocknum and timestamp to ActionTrace
This commit is contained in:
Henrik Hautakoski 2023-05-08 16:17:13 +02:00 committed by GitHub
commit f7bf1da56f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 780 additions and 148 deletions

View file

@ -6,6 +6,7 @@ require (
github.com/alicebob/miniredis/v2 v2.30.2
github.com/go-redis/redis/v8 v8.11.5
github.com/go-redis/redismock/v8 v8.11.5
github.com/liamylian/jsontime/v2 v2.0.0
github.com/shamaton/msgpack/v2 v2.1.0
github.com/shamaton/msgpackgen v0.3.0
github.com/stretchr/testify v1.8.2
@ -16,6 +17,9 @@ require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/json-iterator/go v1.1.9 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/yuin/gopher-lua v1.1.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View file

@ -34,9 +34,20 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/liamylian/jsontime/v2 v2.0.0 h1:3if2kDW/boymUdO+4Qj/m4uaXMBSF6np9KEgg90cwH0=
github.com/liamylian/jsontime/v2 v2.0.0/go.mod h1:UHp1oAPqCBfspokvGmaGe0IAl2IgOpgOgDaKPcvcGGY=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
@ -60,6 +71,7 @@ github.com/shamaton/msgpackgen v0.3.0/go.mod h1:fd99fDDuxuTiWzkHC59uEGzrt/WDu+lt
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=

View file

@ -1,14 +1,19 @@
package json
import (
"encoding/json"
"time"
"github.com/eosswedenorg/thalos/api/message"
jsontime "github.com/liamylian/jsontime/v2/v2"
)
var json_codec = jsontime.ConfigWithCustomTimeFormat
func init() {
jsontime.SetDefaultTimeFormat("2006-01-02T15:04:05.000", time.UTC)
message.RegisterCodec("json", message.Codec{
Encoder: json.Marshal,
Decoder: json.Unmarshal,
Encoder: json_codec.Marshal,
Decoder: json_codec.Unmarshal,
})
}

View file

@ -0,0 +1,78 @@
package json
import (
"encoding/hex"
"encoding/json"
"testing"
"time"
"github.com/eosswedenorg/thalos/api/message"
"github.com/stretchr/testify/assert"
)
func TestJson_EncodeActionTrace(t *testing.T) {
dataJson, err := json.Marshal(map[string]string{
"from": "account1",
"to": "account2",
"quantity": "1000.0000 WAX",
})
assert.NoError(t, err)
msg := message.ActionTrace{
TxID: "ed3b8e853647971cf8296f004c3a1aeac255f082b2cb3c12cc3222e2d7c174ab",
BlockNum: 267372365,
Timestamp: time.Unix(1048267389, int64(time.Millisecond)*500).UTC(),
Name: "transfer",
Contract: "eosio",
Receiver: "account2",
Data: dataJson,
HexData: hex.EncodeToString(dataJson),
Authorization: []message.PermissionLevel{
{Actor: "account1", Permission: "active"},
},
Except: "errstr",
Error: 2,
Return: []byte{0xde, 0xad, 0xbe, 0xef},
}
expected := `{"tx_id":"ed3b8e853647971cf8296f004c3a1aeac255f082b2cb3c12cc3222e2d7c174ab","blocknum":267372365,"blocktimestamp":"2003-03-21T17:23:09.500","name":"transfer","contract":"eosio","receiver":"account2","data":"eyJmcm9tIjoiYWNjb3VudDEiLCJxdWFudGl0eSI6IjEwMDAuMDAwMCBXQVgiLCJ0byI6ImFjY291bnQyIn0=","hex_data":"7b2266726f6d223a226163636f756e7431222c227175616e74697479223a22313030302e3030303020574158222c22746f223a226163636f756e7432227d","authorization":[{"actor":"account1","permission":"active"}],"except":"errstr","error":2,"return":"3q2+7w=="}`
data, err := json_codec.Marshal(msg)
assert.NoError(t, err)
assert.Equal(t, expected, string(data))
}
func TestJson_DecodeActionTrace(t *testing.T) {
dataJson, err := json.Marshal(map[string]string{
"from": "account1",
"to": "account2",
"quantity": "1000.0000 WAX",
})
assert.NoError(t, err)
expected := message.ActionTrace{
TxID: "952989f7464237b6cf9926e533ecd331df6794ed07564bd052bc368cbd65b4bc",
BlockNum: 8723971,
Timestamp: time.Unix(1718957306, int64(time.Millisecond)*500).UTC(),
Name: "transfer",
Contract: "eosio",
Receiver: "account2",
Data: dataJson,
HexData: hex.EncodeToString(dataJson),
Authorization: []message.PermissionLevel{
{Actor: "account1", Permission: "active"},
},
Except: "errstr",
Error: 2,
Return: []byte{0xde, 0xad, 0xbe, 0xef},
}
input := `{"tx_id":"952989f7464237b6cf9926e533ecd331df6794ed07564bd052bc368cbd65b4bc","blocknum":8723971,"blocktimestamp":"2024-06-21T08:08:26.500","name":"transfer","contract":"eosio","receiver":"account2","data":"eyJmcm9tIjoiYWNjb3VudDEiLCJxdWFudGl0eSI6IjEwMDAuMDAwMCBXQVgiLCJ0byI6ImFjY291bnQyIn0=","hex_data":"7b2266726f6d223a226163636f756e7431222c227175616e74697479223a22313030302e3030303020574158222c22746f223a226163636f756e7432227d","authorization":[{"actor":"account1","permission":"active"}],"except":"errstr","error":2,"return":"3q2+7w=="}`
msg := message.ActionTrace{}
err = json_codec.Unmarshal([]byte(input), &msg)
assert.NoError(t, err)
assert.Equal(t, expected, msg)
}

View file

@ -4,6 +4,7 @@ import (
"encoding/hex"
"encoding/json"
"testing"
"time"
"github.com/eosswedenorg/thalos/api/message"
"github.com/shamaton/msgpack/v2"
@ -30,12 +31,14 @@ func TestMsgpack_EncodeActionTrace(t *testing.T) {
assert.NoError(t, err)
msg := message.ActionTrace{
TxID: "edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3",
Name: "sellitem",
Contract: "mygame",
Receiver: "eosio",
Data: dataJson,
HexData: "d0fa1b2ab8a6fd0d1b0173df91aa9ffd277642d05780cf750",
TxID: "edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3",
BlockNum: 12345,
Timestamp: time.Unix(1699617279, int64(time.Millisecond)*500),
Name: "sellitem",
Contract: "mygame",
Receiver: "eosio",
Data: dataJson,
HexData: "d0fa1b2ab8a6fd0d1b0173df91aa9ffd277642d05780cf750",
Authorization: []message.PermissionLevel{
{Actor: "mygame", Permission: "active"},
},
@ -48,7 +51,7 @@ func TestMsgpack_EncodeActionTrace(t *testing.T) {
assert.NoError(t, err)
expected := []byte{
0x8a, 0xa5, 0x74, 0x78, 0x5f, 0x69, 0x64, 0xd9,
0x8c, 0xa5, 0x74, 0x78, 0x5f, 0x69, 0x64, 0xd9,
0x40, 0x65, 0x64, 0x63, 0x30, 0x36, 0x64, 0x63,
0x65, 0x36, 0x33, 0x32, 0x30, 0x34, 0x35, 0x39,
0x66, 0x64, 0x36, 0x34, 0x34, 0x37, 0x35, 0x36,
@ -57,50 +60,55 @@ func TestMsgpack_EncodeActionTrace(t *testing.T) {
0x62, 0x30, 0x61, 0x34, 0x33, 0x34, 0x63, 0x33,
0x37, 0x64, 0x64, 0x66, 0x66, 0x64, 0x65, 0x33,
0x36, 0x37, 0x37, 0x38, 0x64, 0x63, 0x61, 0x62,
0x33, 0xa4, 0x6e, 0x61, 0x6d, 0x65, 0xa8, 0x73,
0x65, 0x6c, 0x6c, 0x69, 0x74, 0x65, 0x6d, 0xa8,
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74,
0xa6, 0x6d, 0x79, 0x67, 0x61, 0x6d, 0x65, 0xa8,
0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72,
0xa5, 0x65, 0x6f, 0x73, 0x69, 0x6f, 0xa4, 0x64,
0x61, 0x74, 0x61, 0xc4, 0x9b, 0x7b, 0x22, 0x61,
0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x22,
0x31, 0x30, 0x30, 0x30, 0x2e, 0x30, 0x30, 0x30,
0x30, 0x20, 0x53, 0x43, 0x41, 0x4d, 0x22, 0x2c,
0x22, 0x66, 0x72, 0x6f, 0x6d, 0x22, 0x3a, 0x22,
0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x31,
0x22, 0x2c, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x22,
0x3a, 0x7b, 0x22, 0x61, 0x67, 0x69, 0x22, 0x3a,
0x22, 0x32, 0x30, 0x22, 0x2c, 0x22, 0x64, 0x75,
0x72, 0x22, 0x3a, 0x22, 0x31, 0x30, 0x30, 0x22,
0x2c, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x32,
0x31, 0x33, 0x31, 0x32, 0x34, 0x32, 0x22, 0x2c,
0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22,
0x47, 0x72, 0x65, 0x61, 0x74, 0x20, 0x53, 0x77,
0x6f, 0x72, 0x64, 0x22, 0x2c, 0x22, 0x71, 0x75,
0x61, 0x6c, 0x22, 0x3a, 0x22, 0x65, 0x70, 0x69,
0x63, 0x22, 0x2c, 0x22, 0x73, 0x74, 0x72, 0x22,
0x3a, 0x22, 0x31, 0x30, 0x30, 0x22, 0x7d, 0x2c,
0x22, 0x74, 0x6f, 0x22, 0x3a, 0x22, 0x61, 0x63,
0x63, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0x22, 0x7d,
0xa8, 0x68, 0x65, 0x78, 0x5f, 0x64, 0x61, 0x74,
0x61, 0xd9, 0x31, 0x64, 0x30, 0x66, 0x61, 0x31,
0x62, 0x32, 0x61, 0x62, 0x38, 0x61, 0x36, 0x66,
0x64, 0x30, 0x64, 0x31, 0x62, 0x30, 0x31, 0x37,
0x33, 0x64, 0x66, 0x39, 0x31, 0x61, 0x61, 0x39,
0x66, 0x66, 0x64, 0x32, 0x37, 0x37, 0x36, 0x34,
0x32, 0x64, 0x30, 0x35, 0x37, 0x38, 0x30, 0x63,
0x66, 0x37, 0x35, 0x30, 0xad, 0x61, 0x75, 0x74,
0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x91, 0x82, 0xa5, 0x61, 0x63, 0x74,
0x6f, 0x72, 0xa6, 0x6d, 0x79, 0x67, 0x61, 0x6d,
0x65, 0xaa, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73,
0x73, 0x69, 0x6f, 0x6e, 0xa6, 0x61, 0x63, 0x74,
0x69, 0x76, 0x65, 0xa6, 0x65, 0x78, 0x63, 0x65,
0x70, 0x74, 0xa6, 0x65, 0x72, 0x72, 0x73, 0x74,
0x72, 0xa5, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x02,
0xa6, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xc4,
0x4, 0xde, 0xad, 0xbe, 0xef,
0x33, 0xa8, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6e,
0x75, 0x6d, 0xcd, 0x30, 0x39, 0xae, 0x62, 0x6c,
0x6f, 0x63, 0x6b, 0x74, 0x69, 0x6d, 0x65, 0x73,
0x74, 0x61, 0x6d, 0x70, 0xd7, 0xff, 0x77, 0x35,
0x94, 0x00, 0x65, 0x4e, 0x19, 0xff, 0xa4, 0x6e,
0x61, 0x6d, 0x65, 0xa8, 0x73, 0x65, 0x6c, 0x6c,
0x69, 0x74, 0x65, 0x6d, 0xa8, 0x63, 0x6f, 0x6e,
0x74, 0x72, 0x61, 0x63, 0x74, 0xa6, 0x6d, 0x79,
0x67, 0x61, 0x6d, 0x65, 0xa8, 0x72, 0x65, 0x63,
0x65, 0x69, 0x76, 0x65, 0x72, 0xa5, 0x65, 0x6f,
0x73, 0x69, 0x6f, 0xa4, 0x64, 0x61, 0x74, 0x61,
0xc4, 0x9b, 0x7b, 0x22, 0x61, 0x6d, 0x6f, 0x75,
0x6e, 0x74, 0x22, 0x3a, 0x22, 0x31, 0x30, 0x30,
0x30, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53,
0x43, 0x41, 0x4d, 0x22, 0x2c, 0x22, 0x66, 0x72,
0x6f, 0x6d, 0x22, 0x3a, 0x22, 0x61, 0x63, 0x63,
0x6f, 0x75, 0x6e, 0x74, 0x31, 0x22, 0x2c, 0x22,
0x69, 0x74, 0x65, 0x6d, 0x22, 0x3a, 0x7b, 0x22,
0x61, 0x67, 0x69, 0x22, 0x3a, 0x22, 0x32, 0x30,
0x22, 0x2c, 0x22, 0x64, 0x75, 0x72, 0x22, 0x3a,
0x22, 0x31, 0x30, 0x30, 0x22, 0x2c, 0x22, 0x69,
0x64, 0x22, 0x3a, 0x22, 0x32, 0x31, 0x33, 0x31,
0x32, 0x34, 0x32, 0x22, 0x2c, 0x22, 0x6e, 0x61,
0x6d, 0x65, 0x22, 0x3a, 0x22, 0x47, 0x72, 0x65,
0x61, 0x74, 0x20, 0x53, 0x77, 0x6f, 0x72, 0x64,
0x22, 0x2c, 0x22, 0x71, 0x75, 0x61, 0x6c, 0x22,
0x3a, 0x22, 0x65, 0x70, 0x69, 0x63, 0x22, 0x2c,
0x22, 0x73, 0x74, 0x72, 0x22, 0x3a, 0x22, 0x31,
0x30, 0x30, 0x22, 0x7d, 0x2c, 0x22, 0x74, 0x6f,
0x22, 0x3a, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x75,
0x6e, 0x74, 0x32, 0x22, 0x7d, 0xa8, 0x68, 0x65,
0x78, 0x5f, 0x64, 0x61, 0x74, 0x61, 0xd9, 0x31,
0x64, 0x30, 0x66, 0x61, 0x31, 0x62, 0x32, 0x61,
0x62, 0x38, 0x61, 0x36, 0x66, 0x64, 0x30, 0x64,
0x31, 0x62, 0x30, 0x31, 0x37, 0x33, 0x64, 0x66,
0x39, 0x31, 0x61, 0x61, 0x39, 0x66, 0x66, 0x64,
0x32, 0x37, 0x37, 0x36, 0x34, 0x32, 0x64, 0x30,
0x35, 0x37, 0x38, 0x30, 0x63, 0x66, 0x37, 0x35,
0x30, 0xad, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x91,
0x82, 0xa5, 0x61, 0x63, 0x74, 0x6f, 0x72, 0xa6,
0x6d, 0x79, 0x67, 0x61, 0x6d, 0x65, 0xaa, 0x70,
0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f,
0x6e, 0xa6, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65,
0xa6, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0xa6,
0x65, 0x72, 0x72, 0x73, 0x74, 0x72, 0xa5, 0x65,
0x72, 0x72, 0x6f, 0x72, 0x02, 0xa6, 0x72, 0x65,
0x74, 0x75, 0x72, 0x6e, 0xc4, 0x04, 0xde, 0xad,
0xbe, 0xef,
}
assert.Equal(t, expected, data)
@ -109,7 +117,7 @@ func TestMsgpack_EncodeActionTrace(t *testing.T) {
func TestMsgpack_Decode(t *testing.T) {
RegisterGeneratedResolver()
data := []byte("\x8a\xa5tx_id\xd9@edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3\xa4name\xa4drop\xa8contract\xa6mygame\xa8receiver\xa8account1\xa4dataċ{\"dropped_from_id\":674562,\"item\":{\"dur\":145,\"id\":49623,\"name\":\"Shadowmourne\",\"qual\":\"legendary\",\"sta\":198,\"str\":223},\"receiver\":\"account1\"}\xa8hex_data\xda\x01\x167b2264726f707065645f66726f6d5f6964223a3637343536322c226974656d223a7b22647572223a3134352c226964223a34393632332c226e616d65223a22536861646f776d6f75726e65222c227175616c223a226c6567656e64617279222c22737461223a3139382c22737472223a3232337d2c227265636569766572223a226163636f756e7431227d\xadauthorization\x91\x82\xa5actor\xa6mygame\xaapermission\xa6active\xa6except\xa6errstr\xa5error\x02\xa6return\xc4\x04ޭ\xbe\xef")
data := []byte("\x8c\xa5tx_id\xd9@edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3\xa8blocknum\xce\x00\x85F7\xaeblocktimestamp\xd6\xffH\xf1U\x1f\xa4name\xa4drop\xa8contract\xa6mygame\xa8receiver\xa8account1\xa4dataċ{\"dropped_from_id\":674562,\"item\":{\"dur\":145,\"id\":49623,\"name\":\"Shadowmourne\",\"qual\":\"legendary\",\"sta\":198,\"str\":223},\"receiver\":\"account1\"}\xa8hex_data\xda\x01\x167b2264726f707065645f66726f6d5f6964223a3637343536322c226974656d223a7b22647572223a3134352c226964223a34393632332c226e616d65223a22536861646f776d6f75726e65222c227175616c223a226c6567656e64617279222c22737461223a3139382c22737472223a3232337d2c227265636569766572223a226163636f756e7431227d\xadauthorization\x91\x82\xa5actor\xa6mygame\xaapermission\xa6active\xa6except\xa6errstr\xa5error\x02\xa6return\xc4\x04ޭ\xbe\xef")
dataJson, err := json.Marshal(map[string]interface{}{
"item": map[string]interface{}{
@ -127,12 +135,14 @@ func TestMsgpack_Decode(t *testing.T) {
assert.NoError(t, err)
expected := message.ActionTrace{
TxID: "edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3",
Name: "drop",
Contract: "mygame",
Receiver: "account1",
Data: dataJson,
HexData: hex.EncodeToString(dataJson),
TxID: "edc06dce6320459fd644756972048da453b2816b0a434c37ddffde36778dcab3",
BlockNum: 8734263,
Timestamp: time.Unix(1223775519, 0),
Name: "drop",
Contract: "mygame",
Receiver: "account1",
Data: dataJson,
HexData: hex.EncodeToString(dataJson),
Authorization: []message.PermissionLevel{
{Actor: "mygame", Permission: "active"},
},

View file

@ -8,6 +8,7 @@ import (
msgpack "github.com/shamaton/msgpackgen/msgpack"
dec "github.com/shamaton/msgpackgen/msgpack/dec"
enc "github.com/shamaton/msgpackgen/msgpack/enc"
"time"
)
// RegisterGeneratedResolver registers generated resolver.
@ -57,6 +58,36 @@ func ___encodeAsArray(i interface{}) ([]byte, error) {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.HeartBeat", size, offset)
}
return b, err
case message.PermissionLevel:
encoder := enc.NewEncoder()
size, err := ___calcArraySizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder)
if err != nil {
return nil, err
}
encoder.MakeBytes(size)
b, offset, err := ___encodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder, 0)
if err != nil {
return nil, err
}
if size != offset {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.PermissionLevel", size, offset)
}
return b, err
case *message.PermissionLevel:
encoder := enc.NewEncoder()
size, err := ___calcArraySizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, encoder)
if err != nil {
return nil, err
}
encoder.MakeBytes(size)
b, offset, err := ___encodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, encoder, 0)
if err != nil {
return nil, err
}
if size != offset {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.PermissionLevel", size, offset)
}
return b, err
case message.ActionTrace:
encoder := enc.NewEncoder()
size, err := ___calcArraySizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder)
@ -124,6 +155,36 @@ func ___encodeAsMap(i interface{}) ([]byte, error) {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.HeartBeat", size, offset)
}
return b, err
case message.PermissionLevel:
encoder := enc.NewEncoder()
size, err := ___calcMapSizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder)
if err != nil {
return nil, err
}
encoder.MakeBytes(size)
b, offset, err := ___encodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder, 0)
if err != nil {
return nil, err
}
if size != offset {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.PermissionLevel", size, offset)
}
return b, err
case *message.PermissionLevel:
encoder := enc.NewEncoder()
size, err := ___calcMapSizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, encoder)
if err != nil {
return nil, err
}
encoder.MakeBytes(size)
b, offset, err := ___encodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, encoder, 0)
if err != nil {
return nil, err
}
if size != offset {
return nil, fmt.Errorf("%s size / offset different %d : %d", "github.com/eosswedenorg/thalos/api/message.PermissionLevel", size, offset)
}
return b, err
case message.ActionTrace:
encoder := enc.NewEncoder()
size, err := ___calcMapSizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, encoder)
@ -184,6 +245,20 @@ func ___decodeAsArray(data []byte, i interface{}) (bool, error) {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case *message.PermissionLevel:
decoder := dec.NewDecoder(data)
offset, err := ___decodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, decoder, 0)
if err == nil && offset != decoder.Len() {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case **message.PermissionLevel:
decoder := dec.NewDecoder(data)
offset, err := ___decodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, decoder, 0)
if err == nil && offset != decoder.Len() {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case *message.ActionTrace:
decoder := dec.NewDecoder(data)
offset, err := ___decodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, decoder, 0)
@ -219,6 +294,20 @@ func ___decodeAsMap(data []byte, i interface{}) (bool, error) {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case *message.PermissionLevel:
decoder := dec.NewDecoder(data)
offset, err := ___decodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, decoder, 0)
if err == nil && offset != decoder.Len() {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case **message.PermissionLevel:
decoder := dec.NewDecoder(data)
offset, err := ___decodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(*v, decoder, 0)
if err == nil && offset != decoder.Len() {
return true, fmt.Errorf("read length is different [%d] [%d] ", offset, decoder.Len())
}
return true, err
case *message.ActionTrace:
decoder := dec.NewDecoder(data)
offset, err := ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v, decoder, 0)
@ -388,11 +477,139 @@ func ___decodeMapHeartBeat_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d
return offset, err
}
// calculate size from github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___calcArraySizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.PermissionLevel, encoder *enc.Encoder) (int, error) {
size := 0
size += encoder.CalcStructHeaderFix(2)
size += encoder.CalcString(v.Actor)
size += encoder.CalcString(v.Permission)
return size, nil
}
// calculate size from github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___calcMapSizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.PermissionLevel, encoder *enc.Encoder) (int, error) {
size := 0
size += encoder.CalcStructHeaderFix(2)
size += encoder.CalcStringFix(5)
size += encoder.CalcString(v.Actor)
size += encoder.CalcStringFix(10)
size += encoder.CalcString(v.Permission)
return size, nil
}
// encode from github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___encodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.PermissionLevel, encoder *enc.Encoder, offset int) ([]byte, int, error) {
var err error
offset = encoder.WriteStructHeaderFixAsArray(2, offset)
offset = encoder.WriteString(v.Actor, offset)
offset = encoder.WriteString(v.Permission, offset)
return encoder.EncodedBytes(), offset, err
}
// encode from github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___encodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.PermissionLevel, encoder *enc.Encoder, offset int) ([]byte, int, error) {
var err error
offset = encoder.WriteStructHeaderFixAsMap(2, offset)
offset = encoder.WriteStringFix("actor", 5, offset)
offset = encoder.WriteString(v.Actor, offset)
offset = encoder.WriteStringFix("permission", 10, offset)
offset = encoder.WriteString(v.Permission, offset)
return encoder.EncodedBytes(), offset, err
}
// decode to github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___decodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v *message.PermissionLevel, decoder *dec.Decoder, offset int) (int, error) {
offset, err := decoder.CheckStructHeader(2, offset)
if err != nil {
return 0, err
}
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Actor = vv
}
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Permission = vv
}
return offset, err
}
// decode to github.com/eosswedenorg/thalos/api/message.PermissionLevel
func ___decodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v *message.PermissionLevel, decoder *dec.Decoder, offset int) (int, error) {
keys := [][]byte{
{uint8(0x61), uint8(0x63), uint8(0x74), uint8(0x6f), uint8(0x72)}, // actor
{uint8(0x70), uint8(0x65), uint8(0x72), uint8(0x6d), uint8(0x69), uint8(0x73), uint8(0x73), uint8(0x69), uint8(0x6f), uint8(0x6e)}, // permission
}
offset, err := decoder.CheckStructHeader(2, offset)
if err != nil {
return 0, err
}
count := 0
for count < 2 {
var dataKey []byte
dataKey, offset, err = decoder.AsStringBytes(offset)
if err != nil {
return 0, err
}
fieldIndex := -1
for i, key := range keys {
if len(dataKey) != len(key) {
continue
}
fieldIndex = i
for dataKeyIndex := range dataKey {
if dataKey[dataKeyIndex] != key[dataKeyIndex] {
fieldIndex = -1
break
}
}
if fieldIndex >= 0 {
break
}
}
switch fieldIndex {
case 0:
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Actor = vv
}
count++
case 1:
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Permission = vv
}
count++
default:
return 0, fmt.Errorf("unknown key[%s] found", string(dataKey))
}
}
return offset, err
}
// calculate size from github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___calcArraySizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.ActionTrace, encoder *enc.Encoder) (int, error) {
size := 0
size += encoder.CalcStructHeaderFix(6)
size += encoder.CalcStructHeaderFix(12)
size += encoder.CalcString(v.TxID)
size += encoder.CalcUint32(v.BlockNum)
size += encoder.CalcTime(v.Timestamp)
size += encoder.CalcString(v.Name)
size += encoder.CalcString(v.Contract)
size += encoder.CalcString(v.Receiver)
@ -409,15 +626,49 @@ func ___calcArraySizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988b
size += encoder.CalcNil()
}
size += encoder.CalcString(v.HexData)
if v.Authorization != nil {
s, err := encoder.CalcSliceLength(len(v.Authorization), false)
if err != nil {
return 0, err
}
size += s
for _, vv := range v.Authorization {
size_vv, err := ___calcArraySizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(vv, encoder)
if err != nil {
return 0, err
}
size += size_vv
}
} else {
size += encoder.CalcNil()
}
size += encoder.CalcString(v.Except)
size += encoder.CalcUint64(v.Error)
if v.Return != nil {
s, err := encoder.CalcSliceLength(len(v.Return), true)
if err != nil {
return 0, err
}
size += s
for _, vv := range v.Return {
size += encoder.CalcByte(vv)
}
} else {
size += encoder.CalcNil()
}
return size, nil
}
// calculate size from github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___calcMapSizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.ActionTrace, encoder *enc.Encoder) (int, error) {
size := 0
size += encoder.CalcStructHeaderFix(6)
size += encoder.CalcStructHeaderFix(12)
size += encoder.CalcStringFix(5)
size += encoder.CalcString(v.TxID)
size += encoder.CalcStringFix(8)
size += encoder.CalcUint32(v.BlockNum)
size += encoder.CalcStringFix(14)
size += encoder.CalcTime(v.Timestamp)
size += encoder.CalcStringFix(4)
size += encoder.CalcString(v.Name)
size += encoder.CalcStringFix(8)
@ -439,14 +690,50 @@ func ___calcMapSizeActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc6
}
size += encoder.CalcStringFix(8)
size += encoder.CalcString(v.HexData)
size += encoder.CalcStringFix(13)
if v.Authorization != nil {
s, err := encoder.CalcSliceLength(len(v.Authorization), false)
if err != nil {
return 0, err
}
size += s
for _, vv := range v.Authorization {
size_vv, err := ___calcMapSizePermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(vv, encoder)
if err != nil {
return 0, err
}
size += size_vv
}
} else {
size += encoder.CalcNil()
}
size += encoder.CalcStringFix(6)
size += encoder.CalcString(v.Except)
size += encoder.CalcStringFix(5)
size += encoder.CalcUint64(v.Error)
size += encoder.CalcStringFix(6)
if v.Return != nil {
s, err := encoder.CalcSliceLength(len(v.Return), true)
if err != nil {
return 0, err
}
size += s
for _, vv := range v.Return {
size += encoder.CalcByte(vv)
}
} else {
size += encoder.CalcNil()
}
return size, nil
}
// encode from github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___encodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.ActionTrace, encoder *enc.Encoder, offset int) ([]byte, int, error) {
var err error
offset = encoder.WriteStructHeaderFixAsArray(6, offset)
offset = encoder.WriteStructHeaderFixAsArray(12, offset)
offset = encoder.WriteString(v.TxID, offset)
offset = encoder.WriteUint32(v.BlockNum, offset)
offset = encoder.WriteTime(v.Timestamp, offset)
offset = encoder.WriteString(v.Name, offset)
offset = encoder.WriteString(v.Contract, offset)
offset = encoder.WriteString(v.Receiver, offset)
@ -459,15 +746,40 @@ func ___encodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc6
offset = encoder.WriteNil(offset)
}
offset = encoder.WriteString(v.HexData, offset)
if v.Authorization != nil {
offset = encoder.WriteSliceLength(len(v.Authorization), offset, false)
for _, vv := range v.Authorization {
_, offset, err = ___encodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(vv, encoder, offset)
if err != nil {
return nil, 0, err
}
}
} else {
offset = encoder.WriteNil(offset)
}
offset = encoder.WriteString(v.Except, offset)
offset = encoder.WriteUint64(v.Error, offset)
if v.Return != nil {
offset = encoder.WriteSliceLength(len(v.Return), offset, true)
for _, vv := range v.Return {
offset = encoder.WriteByte(vv, offset)
}
} else {
offset = encoder.WriteNil(offset)
}
return encoder.EncodedBytes(), offset, err
}
// encode from github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___encodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v message.ActionTrace, encoder *enc.Encoder, offset int) ([]byte, int, error) {
var err error
offset = encoder.WriteStructHeaderFixAsMap(6, offset)
offset = encoder.WriteStructHeaderFixAsMap(12, offset)
offset = encoder.WriteStringFix("tx_id", 5, offset)
offset = encoder.WriteString(v.TxID, offset)
offset = encoder.WriteStringFix("blocknum", 8, offset)
offset = encoder.WriteUint32(v.BlockNum, offset)
offset = encoder.WriteStringFix("blocktimestamp", 14, offset)
offset = encoder.WriteTime(v.Timestamp, offset)
offset = encoder.WriteStringFix("name", 4, offset)
offset = encoder.WriteString(v.Name, offset)
offset = encoder.WriteStringFix("contract", 8, offset)
@ -485,12 +797,37 @@ func ___encodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f
}
offset = encoder.WriteStringFix("hex_data", 8, offset)
offset = encoder.WriteString(v.HexData, offset)
offset = encoder.WriteStringFix("authorization", 13, offset)
if v.Authorization != nil {
offset = encoder.WriteSliceLength(len(v.Authorization), offset, false)
for _, vv := range v.Authorization {
_, offset, err = ___encodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(vv, encoder, offset)
if err != nil {
return nil, 0, err
}
}
} else {
offset = encoder.WriteNil(offset)
}
offset = encoder.WriteStringFix("except", 6, offset)
offset = encoder.WriteString(v.Except, offset)
offset = encoder.WriteStringFix("error", 5, offset)
offset = encoder.WriteUint64(v.Error, offset)
offset = encoder.WriteStringFix("return", 6, offset)
if v.Return != nil {
offset = encoder.WriteSliceLength(len(v.Return), offset, true)
for _, vv := range v.Return {
offset = encoder.WriteByte(vv, offset)
}
} else {
offset = encoder.WriteNil(offset)
}
return encoder.EncodedBytes(), offset, err
}
// decode to github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___decodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v *message.ActionTrace, decoder *dec.Decoder, offset int) (int, error) {
offset, err := decoder.CheckStructHeader(6, offset)
offset, err := decoder.CheckStructHeader(12, offset)
if err != nil {
return 0, err
}
@ -502,6 +839,22 @@ func ___decodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc6
}
v.TxID = vv
}
{
var vv uint32
vv, offset, err = decoder.AsUint32(offset)
if err != nil {
return 0, err
}
v.BlockNum = vv
}
{
var vv time.Time
vv, offset, err = decoder.AsDateTime(offset)
if err != nil {
return 0, err
}
v.Timestamp = vv
}
{
var vv string
vv, offset, err = decoder.AsString(offset)
@ -554,25 +907,87 @@ func ___decodeArrayActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc6
}
v.HexData = vv
}
if !decoder.IsCodeNil(offset) {
var vv []message.PermissionLevel
var vvl int
vvl, offset, err = decoder.SliceLength(offset)
if err != nil {
return 0, err
}
vv = make([]message.PermissionLevel, vvl)
for vvi := range vv {
var vvv message.PermissionLevel
offset, err = ___decodeArrayPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(&vvv, decoder, offset)
if err != nil {
return 0, err
}
vv[vvi] = vvv
}
v.Authorization = vv
} else {
offset++
}
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Except = vv
}
{
var vv uint64
vv, offset, err = decoder.AsUint64(offset)
if err != nil {
return 0, err
}
v.Error = vv
}
if !decoder.IsCodeNil(offset) {
var vv []byte
var vvl int
vvl, offset, err = decoder.SliceLength(offset)
if err != nil {
return 0, err
}
vv = make([]byte, vvl)
for vvi := range vv {
var vvv byte
vvv, offset, err = decoder.AsByte(offset)
if err != nil {
return 0, err
}
vv[vvi] = vvv
}
v.Return = vv
} else {
offset++
}
return offset, err
}
// decode to github.com/eosswedenorg/thalos/api/message.ActionTrace
func ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(v *message.ActionTrace, decoder *dec.Decoder, offset int) (int, error) {
keys := [][]byte{
{uint8(0x74), uint8(0x78), uint8(0x5f), uint8(0x69), uint8(0x64)}, // tx_id
{uint8(0x6e), uint8(0x61), uint8(0x6d), uint8(0x65)}, // name
{uint8(0x63), uint8(0x6f), uint8(0x6e), uint8(0x74), uint8(0x72), uint8(0x61), uint8(0x63), uint8(0x74)}, // contract
{uint8(0x72), uint8(0x65), uint8(0x63), uint8(0x65), uint8(0x69), uint8(0x76), uint8(0x65), uint8(0x72)}, // receiver
{uint8(0x64), uint8(0x61), uint8(0x74), uint8(0x61)}, // data
{uint8(0x68), uint8(0x65), uint8(0x78), uint8(0x5f), uint8(0x64), uint8(0x61), uint8(0x74), uint8(0x61)}, // hex_data
{uint8(0x74), uint8(0x78), uint8(0x5f), uint8(0x69), uint8(0x64)}, // tx_id
{uint8(0x62), uint8(0x6c), uint8(0x6f), uint8(0x63), uint8(0x6b), uint8(0x6e), uint8(0x75), uint8(0x6d)}, // blocknum
{uint8(0x62), uint8(0x6c), uint8(0x6f), uint8(0x63), uint8(0x6b), uint8(0x74), uint8(0x69), uint8(0x6d), uint8(0x65), uint8(0x73), uint8(0x74), uint8(0x61), uint8(0x6d), uint8(0x70)}, // blocktimestamp
{uint8(0x6e), uint8(0x61), uint8(0x6d), uint8(0x65)}, // name
{uint8(0x63), uint8(0x6f), uint8(0x6e), uint8(0x74), uint8(0x72), uint8(0x61), uint8(0x63), uint8(0x74)}, // contract
{uint8(0x72), uint8(0x65), uint8(0x63), uint8(0x65), uint8(0x69), uint8(0x76), uint8(0x65), uint8(0x72)}, // receiver
{uint8(0x64), uint8(0x61), uint8(0x74), uint8(0x61)}, // data
{uint8(0x68), uint8(0x65), uint8(0x78), uint8(0x5f), uint8(0x64), uint8(0x61), uint8(0x74), uint8(0x61)}, // hex_data
{uint8(0x61), uint8(0x75), uint8(0x74), uint8(0x68), uint8(0x6f), uint8(0x72), uint8(0x69), uint8(0x7a), uint8(0x61), uint8(0x74), uint8(0x69), uint8(0x6f), uint8(0x6e)}, // authorization
{uint8(0x65), uint8(0x78), uint8(0x63), uint8(0x65), uint8(0x70), uint8(0x74)}, // except
{uint8(0x65), uint8(0x72), uint8(0x72), uint8(0x6f), uint8(0x72)}, // error
{uint8(0x72), uint8(0x65), uint8(0x74), uint8(0x75), uint8(0x72), uint8(0x6e)}, // return
}
offset, err := decoder.CheckStructHeader(6, offset)
offset, err := decoder.CheckStructHeader(12, offset)
if err != nil {
return 0, err
}
count := 0
for count < 6 {
for count < 12 {
var dataKey []byte
dataKey, offset, err = decoder.AsStringBytes(offset)
if err != nil {
@ -607,22 +1022,22 @@ func ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f
count++
case 1:
{
var vv string
vv, offset, err = decoder.AsString(offset)
var vv uint32
vv, offset, err = decoder.AsUint32(offset)
if err != nil {
return 0, err
}
v.Name = vv
v.BlockNum = vv
}
count++
case 2:
{
var vv string
vv, offset, err = decoder.AsString(offset)
var vv time.Time
vv, offset, err = decoder.AsDateTime(offset)
if err != nil {
return 0, err
}
v.Contract = vv
v.Timestamp = vv
}
count++
case 3:
@ -632,10 +1047,30 @@ func ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f
if err != nil {
return 0, err
}
v.Receiver = vv
v.Name = vv
}
count++
case 4:
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Contract = vv
}
count++
case 5:
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Receiver = vv
}
count++
case 6:
if !decoder.IsCodeNil(offset) {
var vv []byte
var vvl int
@ -657,7 +1092,7 @@ func ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f
offset++
}
count++
case 5:
case 7:
{
var vv string
vv, offset, err = decoder.AsString(offset)
@ -667,6 +1102,70 @@ func ___decodeMapActionTrace_27424f445a2085e7723342fb0df638c626b43c59240988bc64f
v.HexData = vv
}
count++
case 8:
if !decoder.IsCodeNil(offset) {
var vv []message.PermissionLevel
var vvl int
vvl, offset, err = decoder.SliceLength(offset)
if err != nil {
return 0, err
}
vv = make([]message.PermissionLevel, vvl)
for vvi := range vv {
var vvv message.PermissionLevel
offset, err = ___decodeMapPermissionLevel_27424f445a2085e7723342fb0df638c626b43c59240988bc64f2d60167ee4080(&vvv, decoder, offset)
if err != nil {
return 0, err
}
vv[vvi] = vvv
}
v.Authorization = vv
} else {
offset++
}
count++
case 9:
{
var vv string
vv, offset, err = decoder.AsString(offset)
if err != nil {
return 0, err
}
v.Except = vv
}
count++
case 10:
{
var vv uint64
vv, offset, err = decoder.AsUint64(offset)
if err != nil {
return 0, err
}
v.Error = vv
}
count++
case 11:
if !decoder.IsCodeNil(offset) {
var vv []byte
var vvl int
vvl, offset, err = decoder.SliceLength(offset)
if err != nil {
return 0, err
}
vv = make([]byte, vvl)
for vvi := range vv {
var vvv byte
vvv, offset, err = decoder.AsByte(offset)
if err != nil {
return 0, err
}
vv[vvi] = vvv
}
v.Return = vv
} else {
offset++
}
count++
default:
return 0, fmt.Errorf("unknown key[%s] found", string(dataKey))
}

View file

@ -1,6 +1,9 @@
package message
import "encoding/json"
import (
"encoding/json"
"time"
)
type HeartBeat struct {
BlockNum uint32 `json:"blocknum" msgpack:"blocknum"`
@ -16,6 +19,10 @@ type PermissionLevel struct {
type ActionTrace struct {
TxID string `json:"tx_id" msgpack:"tx_id"`
BlockNum uint32 `json:"blocknum" msgpack:"blocknum"`
Timestamp time.Time `json:"blocktimestamp" msgpack:"blocktimestamp"`
// Action name
Name string `json:"name" msgpack:"name"`

View file

@ -43,7 +43,9 @@ func SpawnProccessor(shipStream *shipclient.Stream, writer api.Writer, abi *abi.
// Attach handlers
shipStream.BlockHandler = processor.processBlock
shipStream.TraceHandler = processor.processTraces
// Needed because if nil, traces will not be included in the response from ship.
shipStream.TraceHandler = func([]*ship.TransactionTraceV0) {}
return processor
}
@ -77,83 +79,81 @@ func (processor *ShipProcessor) processBlock(block *ship.GetBlocksResultV0) {
}
processor.encodeQueue(api.HeartbeatChannel, hb)
err := processor.writer.Flush()
if err != nil {
log.WithError(err).Error("Failed to send messages")
}
}
}
func (processor *ShipProcessor) processTraces(traces []*ship.TransactionTraceV0) {
for _, trace := range traces {
// Process traces
if block.Traces != nil && len(block.Traces.Elem) > 0 {
for _, trace := range block.Traces.AsTransactionTracesV0() {
processor.encodeQueue(api.TransactionChannel, trace)
processor.encodeQueue(api.TransactionChannel, trace)
// Actions
for _, actionTraceVar := range trace.ActionTraces {
var act_trace *ship.ActionTraceV1
// Actions
for _, actionTraceVar := range trace.ActionTraces {
var act_trace *ship.ActionTraceV1
if trace_v0, ok := actionTraceVar.Impl.(*ship.ActionTraceV0); ok {
// convert to v1
act_trace = &ship.ActionTraceV1{
ActionOrdinal: trace_v0.ActionOrdinal,
CreatorActionOrdinal: trace_v0.CreatorActionOrdinal,
Receipt: trace_v0.Receipt,
Receiver: trace_v0.Receiver,
Act: trace_v0.Act,
ContextFree: trace_v0.ContextFree,
Elapsed: trace_v0.Elapsed,
Console: trace_v0.Console,
AccountRamDeltas: trace_v0.AccountRamDeltas,
Except: trace_v0.Except,
ErrorCode: trace_v0.ErrorCode,
ReturnValue: []byte{},
if trace_v0, ok := actionTraceVar.Impl.(*ship.ActionTraceV0); ok {
// convert to v1
act_trace = &ship.ActionTraceV1{
ActionOrdinal: trace_v0.ActionOrdinal,
CreatorActionOrdinal: trace_v0.CreatorActionOrdinal,
Receipt: trace_v0.Receipt,
Receiver: trace_v0.Receiver,
Act: trace_v0.Act,
ContextFree: trace_v0.ContextFree,
Elapsed: trace_v0.Elapsed,
Console: trace_v0.Console,
AccountRamDeltas: trace_v0.AccountRamDeltas,
Except: trace_v0.Except,
ErrorCode: trace_v0.ErrorCode,
ReturnValue: []byte{},
}
} else {
act_trace = actionTraceVar.Impl.(*ship.ActionTraceV1)
}
} else {
act_trace = actionTraceVar.Impl.(*ship.ActionTraceV1)
}
act := message.ActionTrace{
TxID: trace.ID.String(),
Name: act_trace.Act.Name.String(),
Contract: act_trace.Act.Account.String(),
Receiver: act_trace.Receiver.String(),
HexData: hex.EncodeToString(act_trace.Act.Data),
}
act := message.ActionTrace{
TxID: trace.ID.String(),
BlockNum: block.Block.BlockNumber(),
Timestamp: block.Block.Timestamp.Time.UTC(),
Name: act_trace.Act.Name.String(),
Contract: act_trace.Act.Account.String(),
Receiver: act_trace.Receiver.String(),
HexData: hex.EncodeToString(act_trace.Act.Data),
}
for _, auth := range act_trace.Act.Authorization {
act.Authorization = append(act.Authorization, message.PermissionLevel{
Actor: auth.Actor.String(),
Permission: auth.Permission.String(),
})
}
for _, auth := range act_trace.Act.Authorization {
act.Authorization = append(act.Authorization, message.PermissionLevel{
Actor: auth.Actor.String(),
Permission: auth.Permission.String(),
})
}
ABI, err := processor.abi.GetAbi(act_trace.Act.Account)
if err == nil {
data, err := ABI.DecodeAction(act_trace.Act.Data, act_trace.Act.Name)
ABI, err := processor.abi.GetAbi(act_trace.Act.Account)
if err == nil {
data, err := ABI.DecodeAction(act_trace.Act.Data, act_trace.Act.Name)
if err != nil {
log.WithError(err).Warn("Failed to decode action")
}
act.Data = data
} else {
log.WithError(err).Errorf("Failed to get abi for contract %s", act_trace.Act.Account)
}
payload, err := processor.encode(act)
if err != nil {
log.WithError(err).Warn("Failed to decode action")
continue
}
act.Data = data
} else {
log.WithError(err).Errorf("Failed to get abi for contract %s", act_trace.Act.Account)
}
payload, err := processor.encode(act)
if err != nil {
continue
}
channels := []api.Channel{
api.ActionChannel{}.Channel(),
api.ActionChannel{Name: act.Name}.Channel(),
api.ActionChannel{Contract: act.Contract}.Channel(),
api.ActionChannel{Name: act.Name, Contract: act.Contract}.Channel(),
}
channels := []api.Channel{
api.ActionChannel{}.Channel(),
api.ActionChannel{Name: act.Name}.Channel(),
api.ActionChannel{Contract: act.Contract}.Channel(),
api.ActionChannel{Name: act.Name, Contract: act.Contract}.Channel(),
}
for _, channel := range channels {
processor.queueMessage(channel, payload)
for _, channel := range channels {
processor.queueMessage(channel, payload)
}
}
}
}

4
go.mod
View file

@ -26,9 +26,13 @@ require (
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.16.5 // indirect
github.com/liamylian/jsontime/v2 v2.0.0 // indirect
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/onsi/gomega v1.27.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect

13
go.sum
View file

@ -56,6 +56,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
@ -63,6 +64,9 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jarcoal/httpmock v1.2.0 h1:gSvTxxFR/MEMfsGrvRbdfpRUMBStovlSRLw0Ep1bwwc=
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
@ -74,10 +78,19 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/liamylian/jsontime/v2 v2.0.0 h1:3if2kDW/boymUdO+4Qj/m4uaXMBSF6np9KEgg90cwH0=
github.com/liamylian/jsontime/v2 v2.0.0/go.mod h1:UHp1oAPqCBfspokvGmaGe0IAl2IgOpgOgDaKPcvcGGY=
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/nikoksr/notify v0.38.1 h1:+WjA3nUMMhfxKuFFYmTIgDOykdI7GPP3ZWWg3SLuQyo=
github.com/nikoksr/notify v0.38.1/go.mod h1:BA0LnpzG+iBlnxtPnSmV/Ei57wqEtyv9V9IJ+rDlo58=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=