Compare commits

...

10 Commits

Author SHA1 Message Date
marbar3778
ed0c89eb76 fix tests amd errors 2021-07-15 15:00:15 +02:00
marbar3778
87c2ee69fd fix errors in abci 2021-07-05 16:58:31 +02:00
marbar3778
dc3327083e fix errors 2021-07-05 14:34:43 +02:00
marbar3778
6a29aa2b7a Merge branch 'abci++' into finalizeBlock 2021-07-05 13:51:13 +02:00
marbar3778
8a39848d06 fix some tests 2021-06-17 11:56:16 +02:00
marbar3778
f9a22483c0 vacation commit 2021-06-17 09:38:02 +02:00
marbar3778
5a4a56a781 abciresponse, blok events, indexer, some tests 2021-06-08 18:26:35 +02:00
marbar3778
3e006e6bc1 work on abci, proxy and mempool 2021-06-08 17:53:31 +02:00
marbar3778
ffb1fc32ea migrate abci to finalizeBlock 2021-06-08 10:43:57 +02:00
marbar3778
a8f91f696a finalize block 2021-06-07 18:19:56 +02:00
60 changed files with 1914 additions and 3267 deletions

View File

@@ -35,33 +35,29 @@ type Client interface {
FlushAsync(context.Context) (*ReqRes, error) FlushAsync(context.Context) (*ReqRes, error)
EchoAsync(ctx context.Context, msg string) (*ReqRes, error) EchoAsync(ctx context.Context, msg string) (*ReqRes, error)
InfoAsync(context.Context, types.RequestInfo) (*ReqRes, error) InfoAsync(context.Context, types.RequestInfo) (*ReqRes, error)
DeliverTxAsync(context.Context, types.RequestDeliverTx) (*ReqRes, error)
CheckTxAsync(context.Context, types.RequestCheckTx) (*ReqRes, error) CheckTxAsync(context.Context, types.RequestCheckTx) (*ReqRes, error)
QueryAsync(context.Context, types.RequestQuery) (*ReqRes, error) QueryAsync(context.Context, types.RequestQuery) (*ReqRes, error)
CommitAsync(context.Context) (*ReqRes, error) CommitAsync(context.Context) (*ReqRes, error)
InitChainAsync(context.Context, types.RequestInitChain) (*ReqRes, error) InitChainAsync(context.Context, types.RequestInitChain) (*ReqRes, error)
BeginBlockAsync(context.Context, types.RequestBeginBlock) (*ReqRes, error)
EndBlockAsync(context.Context, types.RequestEndBlock) (*ReqRes, error)
ListSnapshotsAsync(context.Context, types.RequestListSnapshots) (*ReqRes, error) ListSnapshotsAsync(context.Context, types.RequestListSnapshots) (*ReqRes, error)
OfferSnapshotAsync(context.Context, types.RequestOfferSnapshot) (*ReqRes, error) OfferSnapshotAsync(context.Context, types.RequestOfferSnapshot) (*ReqRes, error)
LoadSnapshotChunkAsync(context.Context, types.RequestLoadSnapshotChunk) (*ReqRes, error) LoadSnapshotChunkAsync(context.Context, types.RequestLoadSnapshotChunk) (*ReqRes, error)
ApplySnapshotChunkAsync(context.Context, types.RequestApplySnapshotChunk) (*ReqRes, error) ApplySnapshotChunkAsync(context.Context, types.RequestApplySnapshotChunk) (*ReqRes, error)
FinalizeBlockAsync(context.Context, types.RequestFinalizeBlock) (*ReqRes, error)
// Synchronous requests // Synchronous requests
FlushSync(context.Context) error FlushSync(context.Context) error
EchoSync(ctx context.Context, msg string) (*types.ResponseEcho, error) EchoSync(ctx context.Context, msg string) (*types.ResponseEcho, error)
InfoSync(context.Context, types.RequestInfo) (*types.ResponseInfo, error) InfoSync(context.Context, types.RequestInfo) (*types.ResponseInfo, error)
DeliverTxSync(context.Context, types.RequestDeliverTx) (*types.ResponseDeliverTx, error)
CheckTxSync(context.Context, types.RequestCheckTx) (*types.ResponseCheckTx, error) CheckTxSync(context.Context, types.RequestCheckTx) (*types.ResponseCheckTx, error)
QuerySync(context.Context, types.RequestQuery) (*types.ResponseQuery, error) QuerySync(context.Context, types.RequestQuery) (*types.ResponseQuery, error)
CommitSync(context.Context) (*types.ResponseCommit, error) CommitSync(context.Context) (*types.ResponseCommit, error)
InitChainSync(context.Context, types.RequestInitChain) (*types.ResponseInitChain, error) InitChainSync(context.Context, types.RequestInitChain) (*types.ResponseInitChain, error)
BeginBlockSync(context.Context, types.RequestBeginBlock) (*types.ResponseBeginBlock, error)
EndBlockSync(context.Context, types.RequestEndBlock) (*types.ResponseEndBlock, error)
ListSnapshotsSync(context.Context, types.RequestListSnapshots) (*types.ResponseListSnapshots, error) ListSnapshotsSync(context.Context, types.RequestListSnapshots) (*types.ResponseListSnapshots, error)
OfferSnapshotSync(context.Context, types.RequestOfferSnapshot) (*types.ResponseOfferSnapshot, error) OfferSnapshotSync(context.Context, types.RequestOfferSnapshot) (*types.ResponseOfferSnapshot, error)
LoadSnapshotChunkSync(context.Context, types.RequestLoadSnapshotChunk) (*types.ResponseLoadSnapshotChunk, error) LoadSnapshotChunkSync(context.Context, types.RequestLoadSnapshotChunk) (*types.ResponseLoadSnapshotChunk, error)
ApplySnapshotChunkSync(context.Context, types.RequestApplySnapshotChunk) (*types.ResponseApplySnapshotChunk, error) ApplySnapshotChunkSync(context.Context, types.RequestApplySnapshotChunk) (*types.ResponseApplySnapshotChunk, error)
FinalizeBlockSync(context.Context, types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error)
} }
//---------------------------------------- //----------------------------------------

View File

@@ -194,16 +194,6 @@ func (cli *grpcClient) InfoAsync(ctx context.Context, params types.RequestInfo)
return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_Info{Info: res}}) return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_Info{Info: res}})
} }
// NOTE: call is synchronous, use ctx to break early if needed
func (cli *grpcClient) DeliverTxAsync(ctx context.Context, params types.RequestDeliverTx) (*ReqRes, error) {
req := types.ToRequestDeliverTx(params)
res, err := cli.client.DeliverTx(ctx, req.GetDeliverTx(), grpc.WaitForReady(true))
if err != nil {
return nil, err
}
return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_DeliverTx{DeliverTx: res}})
}
// NOTE: call is synchronous, use ctx to break early if needed // NOTE: call is synchronous, use ctx to break early if needed
func (cli *grpcClient) CheckTxAsync(ctx context.Context, params types.RequestCheckTx) (*ReqRes, error) { func (cli *grpcClient) CheckTxAsync(ctx context.Context, params types.RequestCheckTx) (*ReqRes, error) {
req := types.ToRequestCheckTx(params) req := types.ToRequestCheckTx(params)
@@ -244,26 +234,6 @@ func (cli *grpcClient) InitChainAsync(ctx context.Context, params types.RequestI
return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_InitChain{InitChain: res}}) return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_InitChain{InitChain: res}})
} }
// NOTE: call is synchronous, use ctx to break early if needed
func (cli *grpcClient) BeginBlockAsync(ctx context.Context, params types.RequestBeginBlock) (*ReqRes, error) {
req := types.ToRequestBeginBlock(params)
res, err := cli.client.BeginBlock(ctx, req.GetBeginBlock(), grpc.WaitForReady(true))
if err != nil {
return nil, err
}
return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_BeginBlock{BeginBlock: res}})
}
// NOTE: call is synchronous, use ctx to break early if needed
func (cli *grpcClient) EndBlockAsync(ctx context.Context, params types.RequestEndBlock) (*ReqRes, error) {
req := types.ToRequestEndBlock(params)
res, err := cli.client.EndBlock(ctx, req.GetEndBlock(), grpc.WaitForReady(true))
if err != nil {
return nil, err
}
return cli.finishAsyncCall(ctx, req, &types.Response{Value: &types.Response_EndBlock{EndBlock: res}})
}
// NOTE: call is synchronous, use ctx to break early if needed // NOTE: call is synchronous, use ctx to break early if needed
func (cli *grpcClient) ListSnapshotsAsync(ctx context.Context, params types.RequestListSnapshots) (*ReqRes, error) { func (cli *grpcClient) ListSnapshotsAsync(ctx context.Context, params types.RequestListSnapshots) (*ReqRes, error) {
req := types.ToRequestListSnapshots(params) req := types.ToRequestListSnapshots(params)
@@ -314,6 +284,22 @@ func (cli *grpcClient) ApplySnapshotChunkAsync(
) )
} }
func (cli *grpcClient) FinalizeBlockAsync(
ctx context.Context,
params types.RequestFinalizeBlock,
) (*ReqRes, error) {
req := types.ToRequestFinalizeBlock(params)
res, err := cli.client.FinalizeBlock(ctx, req.GetFinalizeBlock(), grpc.WaitForReady(true))
if err != nil {
return nil, err
}
return cli.finishAsyncCall(
ctx,
req,
&types.Response{Value: &types.Response_FinalizeBlock{FinalizeBlock: res}},
)
}
// finishAsyncCall creates a ReqRes for an async call, and immediately populates it // finishAsyncCall creates a ReqRes for an async call, and immediately populates it
// with the response. We don't complete it until it's been ordered via the channel. // with the response. We don't complete it until it's been ordered via the channel.
func (cli *grpcClient) finishAsyncCall(ctx context.Context, req *types.Request, res *types.Response) (*ReqRes, error) { func (cli *grpcClient) finishAsyncCall(ctx context.Context, req *types.Request, res *types.Response) (*ReqRes, error) {
@@ -380,18 +366,6 @@ func (cli *grpcClient) InfoSync(
return cli.finishSyncCall(reqres).GetInfo(), cli.Error() return cli.finishSyncCall(reqres).GetInfo(), cli.Error()
} }
func (cli *grpcClient) DeliverTxSync(
ctx context.Context,
params types.RequestDeliverTx,
) (*types.ResponseDeliverTx, error) {
reqres, err := cli.DeliverTxAsync(ctx, params)
if err != nil {
return nil, err
}
return cli.finishSyncCall(reqres).GetDeliverTx(), cli.Error()
}
func (cli *grpcClient) CheckTxSync( func (cli *grpcClient) CheckTxSync(
ctx context.Context, ctx context.Context,
params types.RequestCheckTx, params types.RequestCheckTx,
@@ -435,30 +409,6 @@ func (cli *grpcClient) InitChainSync(
return cli.finishSyncCall(reqres).GetInitChain(), cli.Error() return cli.finishSyncCall(reqres).GetInitChain(), cli.Error()
} }
func (cli *grpcClient) BeginBlockSync(
ctx context.Context,
params types.RequestBeginBlock,
) (*types.ResponseBeginBlock, error) {
reqres, err := cli.BeginBlockAsync(ctx, params)
if err != nil {
return nil, err
}
return cli.finishSyncCall(reqres).GetBeginBlock(), cli.Error()
}
func (cli *grpcClient) EndBlockSync(
ctx context.Context,
params types.RequestEndBlock,
) (*types.ResponseEndBlock, error) {
reqres, err := cli.EndBlockAsync(ctx, params)
if err != nil {
return nil, err
}
return cli.finishSyncCall(reqres).GetEndBlock(), cli.Error()
}
func (cli *grpcClient) ListSnapshotsSync( func (cli *grpcClient) ListSnapshotsSync(
ctx context.Context, ctx context.Context,
params types.RequestListSnapshots, params types.RequestListSnapshots,
@@ -504,3 +454,14 @@ func (cli *grpcClient) ApplySnapshotChunkSync(
} }
return cli.finishSyncCall(reqres).GetApplySnapshotChunk(), cli.Error() return cli.finishSyncCall(reqres).GetApplySnapshotChunk(), cli.Error()
} }
func (cli *grpcClient) FinalizeBlockSync(
ctx context.Context,
params types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
reqres, err := cli.FinalizeBlockAsync(ctx, params)
if err != nil {
return nil, err
}
return cli.finishSyncCall(reqres).GetFinalizeBlock(), cli.Error()
}

View File

@@ -77,17 +77,6 @@ func (app *localClient) InfoAsync(ctx context.Context, req types.RequestInfo) (*
), nil ), nil
} }
func (app *localClient) DeliverTxAsync(ctx context.Context, params types.RequestDeliverTx) (*ReqRes, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.DeliverTx(params)
return app.callback(
types.ToRequestDeliverTx(params),
types.ToResponseDeliverTx(res),
), nil
}
func (app *localClient) CheckTxAsync(ctx context.Context, req types.RequestCheckTx) (*ReqRes, error) { func (app *localClient) CheckTxAsync(ctx context.Context, req types.RequestCheckTx) (*ReqRes, error) {
app.mtx.Lock() app.mtx.Lock()
defer app.mtx.Unlock() defer app.mtx.Unlock()
@@ -132,28 +121,6 @@ func (app *localClient) InitChainAsync(ctx context.Context, req types.RequestIni
), nil ), nil
} }
func (app *localClient) BeginBlockAsync(ctx context.Context, req types.RequestBeginBlock) (*ReqRes, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.BeginBlock(req)
return app.callback(
types.ToRequestBeginBlock(req),
types.ToResponseBeginBlock(res),
), nil
}
func (app *localClient) EndBlockAsync(ctx context.Context, req types.RequestEndBlock) (*ReqRes, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.EndBlock(req)
return app.callback(
types.ToRequestEndBlock(req),
types.ToResponseEndBlock(res),
), nil
}
func (app *localClient) ListSnapshotsAsync(ctx context.Context, req types.RequestListSnapshots) (*ReqRes, error) { func (app *localClient) ListSnapshotsAsync(ctx context.Context, req types.RequestListSnapshots) (*ReqRes, error) {
app.mtx.Lock() app.mtx.Lock()
defer app.mtx.Unlock() defer app.mtx.Unlock()
@@ -204,6 +171,20 @@ func (app *localClient) ApplySnapshotChunkAsync(
), nil ), nil
} }
func (app *localClient) FinalizeBlockAsync(
ctx context.Context,
req types.RequestFinalizeBlock,
) (*ReqRes, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.FinalizeBlock(req)
return app.callback(
types.ToRequestFinalizeBlock(req),
types.ToResponseFinalizeBlock(res),
), nil
}
//------------------------------------------------------- //-------------------------------------------------------
func (app *localClient) FlushSync(ctx context.Context) error { func (app *localClient) FlushSync(ctx context.Context) error {
@@ -222,18 +203,6 @@ func (app *localClient) InfoSync(ctx context.Context, req types.RequestInfo) (*t
return &res, nil return &res, nil
} }
func (app *localClient) DeliverTxSync(
ctx context.Context,
req types.RequestDeliverTx,
) (*types.ResponseDeliverTx, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.DeliverTx(req)
return &res, nil
}
func (app *localClient) CheckTxSync( func (app *localClient) CheckTxSync(
ctx context.Context, ctx context.Context,
req types.RequestCheckTx, req types.RequestCheckTx,
@@ -276,30 +245,6 @@ func (app *localClient) InitChainSync(
return &res, nil return &res, nil
} }
func (app *localClient) BeginBlockSync(
ctx context.Context,
req types.RequestBeginBlock,
) (*types.ResponseBeginBlock, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.BeginBlock(req)
return &res, nil
}
func (app *localClient) EndBlockSync(
ctx context.Context,
req types.RequestEndBlock,
) (*types.ResponseEndBlock, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.EndBlock(req)
return &res, nil
}
func (app *localClient) ListSnapshotsSync( func (app *localClient) ListSnapshotsSync(
ctx context.Context, ctx context.Context,
req types.RequestListSnapshots, req types.RequestListSnapshots,
@@ -346,6 +291,17 @@ func (app *localClient) ApplySnapshotChunkSync(
return &res, nil return &res, nil
} }
func (app *localClient) FinalizeBlockSync(
ctx context.Context,
req types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
app.mtx.Lock()
defer app.mtx.Unlock()
res := app.Application.FinalizeBlock(req)
return &res, nil
}
//------------------------------------------------------- //-------------------------------------------------------
func (app *localClient) callback(req *types.Request, res *types.Response) *ReqRes { func (app *localClient) callback(req *types.Request, res *types.Response) *ReqRes {

View File

@@ -1,4 +1,4 @@
// Code generated by mockery 2.7.4. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks
@@ -65,52 +65,6 @@ func (_m *Client) ApplySnapshotChunkSync(_a0 context.Context, _a1 types.RequestA
return r0, r1 return r0, r1
} }
// BeginBlockAsync provides a mock function with given fields: _a0, _a1
func (_m *Client) BeginBlockAsync(_a0 context.Context, _a1 types.RequestBeginBlock) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1)
var r0 *abcicli.ReqRes
if rf, ok := ret.Get(0).(func(context.Context, types.RequestBeginBlock) *abcicli.ReqRes); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*abcicli.ReqRes)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestBeginBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// BeginBlockSync provides a mock function with given fields: _a0, _a1
func (_m *Client) BeginBlockSync(_a0 context.Context, _a1 types.RequestBeginBlock) (*types.ResponseBeginBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseBeginBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestBeginBlock) *types.ResponseBeginBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseBeginBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestBeginBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// CheckTxAsync provides a mock function with given fields: _a0, _a1 // CheckTxAsync provides a mock function with given fields: _a0, _a1
func (_m *Client) CheckTxAsync(_a0 context.Context, _a1 types.RequestCheckTx) (*abcicli.ReqRes, error) { func (_m *Client) CheckTxAsync(_a0 context.Context, _a1 types.RequestCheckTx) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1) ret := _m.Called(_a0, _a1)
@@ -203,52 +157,6 @@ func (_m *Client) CommitSync(_a0 context.Context) (*types.ResponseCommit, error)
return r0, r1 return r0, r1
} }
// DeliverTxAsync provides a mock function with given fields: _a0, _a1
func (_m *Client) DeliverTxAsync(_a0 context.Context, _a1 types.RequestDeliverTx) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1)
var r0 *abcicli.ReqRes
if rf, ok := ret.Get(0).(func(context.Context, types.RequestDeliverTx) *abcicli.ReqRes); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*abcicli.ReqRes)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestDeliverTx) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DeliverTxSync provides a mock function with given fields: _a0, _a1
func (_m *Client) DeliverTxSync(_a0 context.Context, _a1 types.RequestDeliverTx) (*types.ResponseDeliverTx, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseDeliverTx
if rf, ok := ret.Get(0).(func(context.Context, types.RequestDeliverTx) *types.ResponseDeliverTx); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseDeliverTx)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestDeliverTx) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// EchoAsync provides a mock function with given fields: ctx, msg // EchoAsync provides a mock function with given fields: ctx, msg
func (_m *Client) EchoAsync(ctx context.Context, msg string) (*abcicli.ReqRes, error) { func (_m *Client) EchoAsync(ctx context.Context, msg string) (*abcicli.ReqRes, error) {
ret := _m.Called(ctx, msg) ret := _m.Called(ctx, msg)
@@ -295,52 +203,6 @@ func (_m *Client) EchoSync(ctx context.Context, msg string) (*types.ResponseEcho
return r0, r1 return r0, r1
} }
// EndBlockAsync provides a mock function with given fields: _a0, _a1
func (_m *Client) EndBlockAsync(_a0 context.Context, _a1 types.RequestEndBlock) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1)
var r0 *abcicli.ReqRes
if rf, ok := ret.Get(0).(func(context.Context, types.RequestEndBlock) *abcicli.ReqRes); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*abcicli.ReqRes)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestEndBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// EndBlockSync provides a mock function with given fields: _a0, _a1
func (_m *Client) EndBlockSync(_a0 context.Context, _a1 types.RequestEndBlock) (*types.ResponseEndBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseEndBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestEndBlock) *types.ResponseEndBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseEndBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestEndBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// Error provides a mock function with given fields: // Error provides a mock function with given fields:
func (_m *Client) Error() error { func (_m *Client) Error() error {
ret := _m.Called() ret := _m.Called()
@@ -355,6 +217,52 @@ func (_m *Client) Error() error {
return r0 return r0
} }
// FinalizeBlockAsync provides a mock function with given fields: _a0, _a1
func (_m *Client) FinalizeBlockAsync(_a0 context.Context, _a1 types.RequestFinalizeBlock) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1)
var r0 *abcicli.ReqRes
if rf, ok := ret.Get(0).(func(context.Context, types.RequestFinalizeBlock) *abcicli.ReqRes); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*abcicli.ReqRes)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestFinalizeBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// FinalizeBlockSync provides a mock function with given fields: _a0, _a1
func (_m *Client) FinalizeBlockSync(_a0 context.Context, _a1 types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseFinalizeBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestFinalizeBlock) *types.ResponseFinalizeBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseFinalizeBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestFinalizeBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// FlushAsync provides a mock function with given fields: _a0 // FlushAsync provides a mock function with given fields: _a0
func (_m *Client) FlushAsync(_a0 context.Context) (*abcicli.ReqRes, error) { func (_m *Client) FlushAsync(_a0 context.Context) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0) ret := _m.Called(_a0)

View File

@@ -245,10 +245,6 @@ func (cli *socketClient) InfoAsync(ctx context.Context, req types.RequestInfo) (
return cli.queueRequestAsync(ctx, types.ToRequestInfo(req)) return cli.queueRequestAsync(ctx, types.ToRequestInfo(req))
} }
func (cli *socketClient) DeliverTxAsync(ctx context.Context, req types.RequestDeliverTx) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestDeliverTx(req))
}
func (cli *socketClient) CheckTxAsync(ctx context.Context, req types.RequestCheckTx) (*ReqRes, error) { func (cli *socketClient) CheckTxAsync(ctx context.Context, req types.RequestCheckTx) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestCheckTx(req)) return cli.queueRequestAsync(ctx, types.ToRequestCheckTx(req))
} }
@@ -265,14 +261,6 @@ func (cli *socketClient) InitChainAsync(ctx context.Context, req types.RequestIn
return cli.queueRequestAsync(ctx, types.ToRequestInitChain(req)) return cli.queueRequestAsync(ctx, types.ToRequestInitChain(req))
} }
func (cli *socketClient) BeginBlockAsync(ctx context.Context, req types.RequestBeginBlock) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestBeginBlock(req))
}
func (cli *socketClient) EndBlockAsync(ctx context.Context, req types.RequestEndBlock) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestEndBlock(req))
}
func (cli *socketClient) ListSnapshotsAsync(ctx context.Context, req types.RequestListSnapshots) (*ReqRes, error) { func (cli *socketClient) ListSnapshotsAsync(ctx context.Context, req types.RequestListSnapshots) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestListSnapshots(req)) return cli.queueRequestAsync(ctx, types.ToRequestListSnapshots(req))
} }
@@ -295,6 +283,13 @@ func (cli *socketClient) ApplySnapshotChunkAsync(
return cli.queueRequestAsync(ctx, types.ToRequestApplySnapshotChunk(req)) return cli.queueRequestAsync(ctx, types.ToRequestApplySnapshotChunk(req))
} }
func (cli *socketClient) FinalizeBlockAsync(
ctx context.Context,
req types.RequestFinalizeBlock,
) (*ReqRes, error) {
return cli.queueRequestAsync(ctx, types.ToRequestFinalizeBlock(req))
}
//---------------------------------------- //----------------------------------------
func (cli *socketClient) FlushSync(ctx context.Context) error { func (cli *socketClient) FlushSync(ctx context.Context) error {
@@ -341,18 +336,6 @@ func (cli *socketClient) InfoSync(
return reqres.Response.GetInfo(), nil return reqres.Response.GetInfo(), nil
} }
func (cli *socketClient) DeliverTxSync(
ctx context.Context,
req types.RequestDeliverTx,
) (*types.ResponseDeliverTx, error) {
reqres, err := cli.queueRequestAndFlushSync(ctx, types.ToRequestDeliverTx(req))
if err != nil {
return nil, err
}
return reqres.Response.GetDeliverTx(), nil
}
func (cli *socketClient) CheckTxSync( func (cli *socketClient) CheckTxSync(
ctx context.Context, ctx context.Context,
req types.RequestCheckTx, req types.RequestCheckTx,
@@ -395,30 +378,6 @@ func (cli *socketClient) InitChainSync(
return reqres.Response.GetInitChain(), nil return reqres.Response.GetInitChain(), nil
} }
func (cli *socketClient) BeginBlockSync(
ctx context.Context,
req types.RequestBeginBlock,
) (*types.ResponseBeginBlock, error) {
reqres, err := cli.queueRequestAndFlushSync(ctx, types.ToRequestBeginBlock(req))
if err != nil {
return nil, err
}
return reqres.Response.GetBeginBlock(), nil
}
func (cli *socketClient) EndBlockSync(
ctx context.Context,
req types.RequestEndBlock,
) (*types.ResponseEndBlock, error) {
reqres, err := cli.queueRequestAndFlushSync(ctx, types.ToRequestEndBlock(req))
if err != nil {
return nil, err
}
return reqres.Response.GetEndBlock(), nil
}
func (cli *socketClient) ListSnapshotsSync( func (cli *socketClient) ListSnapshotsSync(
ctx context.Context, ctx context.Context,
req types.RequestListSnapshots, req types.RequestListSnapshots,
@@ -465,6 +424,17 @@ func (cli *socketClient) ApplySnapshotChunkSync(
return reqres.Response.GetApplySnapshotChunk(), nil return reqres.Response.GetApplySnapshotChunk(), nil
} }
func (cli *socketClient) FinalizeBlockSync(
ctx context.Context,
req types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
reqres, err := cli.queueRequestAndFlushSync(ctx, types.ToRequestFinalizeBlock(req))
if err != nil {
return nil, err
}
return reqres.Response.GetFinalizeBlock(), nil
}
//---------------------------------------- //----------------------------------------
// queueRequest enqueues req onto the queue. If the queue is full, it ether // queueRequest enqueues req onto the queue. If the queue is full, it ether
@@ -569,8 +539,6 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) {
_, ok = res.Value.(*types.Response_Flush) _, ok = res.Value.(*types.Response_Flush)
case *types.Request_Info: case *types.Request_Info:
_, ok = res.Value.(*types.Response_Info) _, ok = res.Value.(*types.Response_Info)
case *types.Request_DeliverTx:
_, ok = res.Value.(*types.Response_DeliverTx)
case *types.Request_CheckTx: case *types.Request_CheckTx:
_, ok = res.Value.(*types.Response_CheckTx) _, ok = res.Value.(*types.Response_CheckTx)
case *types.Request_Commit: case *types.Request_Commit:
@@ -579,10 +547,6 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) {
_, ok = res.Value.(*types.Response_Query) _, ok = res.Value.(*types.Response_Query)
case *types.Request_InitChain: case *types.Request_InitChain:
_, ok = res.Value.(*types.Response_InitChain) _, ok = res.Value.(*types.Response_InitChain)
case *types.Request_BeginBlock:
_, ok = res.Value.(*types.Response_BeginBlock)
case *types.Request_EndBlock:
_, ok = res.Value.(*types.Response_EndBlock)
case *types.Request_ApplySnapshotChunk: case *types.Request_ApplySnapshotChunk:
_, ok = res.Value.(*types.Response_ApplySnapshotChunk) _, ok = res.Value.(*types.Response_ApplySnapshotChunk)
case *types.Request_LoadSnapshotChunk: case *types.Request_LoadSnapshotChunk:
@@ -591,6 +555,8 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) {
_, ok = res.Value.(*types.Response_ListSnapshots) _, ok = res.Value.(*types.Response_ListSnapshots)
case *types.Request_OfferSnapshot: case *types.Request_OfferSnapshot:
_, ok = res.Value.(*types.Response_OfferSnapshot) _, ok = res.Value.(*types.Response_OfferSnapshot)
case *types.Request_FinalizeBlock:
_, ok = res.Value.(*types.Response_FinalizeBlock)
} }
return ok return ok
} }

View File

@@ -37,11 +37,11 @@ func TestProperSyncCalls(t *testing.T) {
resp := make(chan error, 1) resp := make(chan error, 1)
go func() { go func() {
// This is BeginBlockSync unrolled.... // This is BeginBlockSync unrolled....
reqres, err := c.BeginBlockAsync(ctx, types.RequestBeginBlock{}) reqres, err := c.FinalizeBlockAsync(ctx, types.RequestFinalizeBlock{})
assert.NoError(t, err) assert.NoError(t, err)
err = c.FlushSync(context.Background()) err = c.FlushSync(context.Background())
assert.NoError(t, err) assert.NoError(t, err)
res := reqres.Response.GetBeginBlock() res := reqres.Response.GetFinalizeBlock()
assert.NotNil(t, res) assert.NotNil(t, res)
resp <- c.Error() resp <- c.Error()
}() }()
@@ -73,7 +73,7 @@ func TestHangingSyncCalls(t *testing.T) {
resp := make(chan error, 1) resp := make(chan error, 1)
go func() { go func() {
// Start BeginBlock and flush it // Start BeginBlock and flush it
reqres, err := c.BeginBlockAsync(ctx, types.RequestBeginBlock{}) reqres, err := c.FinalizeBlockAsync(ctx, types.RequestFinalizeBlock{})
assert.NoError(t, err) assert.NoError(t, err)
flush, err := c.FlushAsync(ctx) flush, err := c.FlushAsync(ctx)
assert.NoError(t, err) assert.NoError(t, err)
@@ -84,7 +84,7 @@ func TestHangingSyncCalls(t *testing.T) {
err = s.Stop() err = s.Stop()
assert.NoError(t, err) assert.NoError(t, err)
// wait for the response from BeginBlock // wait for the response from FinalizeBlock
reqres.Wait() reqres.Wait()
flush.Wait() flush.Wait()
resp <- c.Error() resp <- c.Error()
@@ -121,7 +121,7 @@ type slowApp struct {
types.BaseApplication types.BaseApplication
} }
func (slowApp) BeginBlock(req types.RequestBeginBlock) types.ResponseBeginBlock { func (slowApp) FinalizeBlock(req types.RequestFinalizeBlock) types.ResponseFinalizeBlock {
time.Sleep(200 * time.Millisecond) time.Sleep(200 * time.Millisecond)
return types.ResponseBeginBlock{} return types.ResponseFinalizeBlock{}
} }

View File

@@ -504,16 +504,18 @@ func cmdDeliverTx(cmd *cobra.Command, args []string) error {
if err != nil { if err != nil {
return err return err
} }
res, err := client.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: txBytes}) res, err := client.FinalizeBlockSync(ctx, types.RequestFinalizeBlock{Txs: [][]byte{txBytes}})
if err != nil { if err != nil {
return err return err
} }
printResponse(cmd, args, response{ for _, tx := range res.Txs {
Code: res.Code, printResponse(cmd, args, response{
Data: res.Data, Code: tx.Code,
Info: res.Info, Data: tx.Data,
Log: res.Log, Info: tx.Info,
}) Log: tx.Log,
})
}
return nil return nil
} }

View File

@@ -24,24 +24,30 @@ func (app *Application) Info(req types.RequestInfo) types.ResponseInfo {
return types.ResponseInfo{Data: fmt.Sprintf("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)} return types.ResponseInfo{Data: fmt.Sprintf("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)}
} }
func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { func (app *Application) FinalizeBlock(req types.RequestFinalizeBlock) types.ResponseFinalizeBlock {
if app.serial { if app.serial {
if len(req.Tx) > 8 { for _, tx := range req.Txs {
return types.ResponseDeliverTx{ if len(tx) > 8 {
Code: code.CodeTypeEncodingError, return types.ResponseFinalizeBlock{Txs: []*types.ResponseDeliverTx{{
Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(req.Tx))} Code: code.CodeTypeEncodingError,
} Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(tx))}},
tx8 := make([]byte, 8) }
copy(tx8[len(tx8)-len(req.Tx):], req.Tx) }
txValue := binary.BigEndian.Uint64(tx8) tx8 := make([]byte, 8)
if txValue != uint64(app.txCount) { copy(tx8[len(tx8)-len(tx):], tx)
return types.ResponseDeliverTx{ txValue := binary.BigEndian.Uint64(tx8)
Code: code.CodeTypeBadNonce, if txValue != uint64(app.txCount) {
Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)} return types.ResponseFinalizeBlock{
Txs: []*types.ResponseDeliverTx{{
Code: code.CodeTypeBadNonce,
Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)}},
}
}
} }
} }
app.txCount++ app.txCount++
return types.ResponseDeliverTx{Code: code.CodeTypeOK} return types.ResponseFinalizeBlock{Txs: []*types.ResponseDeliverTx{{Code: code.CodeTypeOK}}}
} }
func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx {

View File

@@ -76,20 +76,22 @@ func testStream(t *testing.T, app types.Application) {
client.SetResponseCallback(func(req *types.Request, res *types.Response) { client.SetResponseCallback(func(req *types.Request, res *types.Response) {
// Process response // Process response
switch r := res.Value.(type) { switch r := res.Value.(type) {
case *types.Response_DeliverTx: case *types.Response_FinalizeBlock:
counter++ for _, tx := range r.FinalizeBlock.Txs {
if r.DeliverTx.Code != code.CodeTypeOK { counter++
t.Error("DeliverTx failed with ret_code", r.DeliverTx.Code) if tx.Code != code.CodeTypeOK {
} t.Error("DeliverTx failed with ret_code", tx.Code)
if counter > numDeliverTxs { }
t.Fatalf("Too many DeliverTx responses. Got %d, expected %d", counter, numDeliverTxs) if counter > numDeliverTxs {
} t.Fatalf("Too many DeliverTx responses. Got %d, expected %d", counter, numDeliverTxs)
if counter == numDeliverTxs { }
go func() { if counter == numDeliverTxs {
time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow go func() {
close(done) time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow
}() close(done)
return }()
return
}
} }
case *types.Response_Flush: case *types.Response_Flush:
// ignore // ignore
@@ -103,7 +105,8 @@ func testStream(t *testing.T, app types.Application) {
// Write requests // Write requests
for counter := 0; counter < numDeliverTxs; counter++ { for counter := 0; counter < numDeliverTxs; counter++ {
// Send request // Send request
_, err = client.DeliverTxAsync(ctx, types.RequestDeliverTx{Tx: []byte("test")}) tx := []byte("test")
_, err = client.FinalizeBlockAsync(ctx, types.RequestFinalizeBlock{Txs: [][]byte{tx}})
require.NoError(t, err) require.NoError(t, err)
// Sometimes send flush messages // Sometimes send flush messages
@@ -163,22 +166,25 @@ func testGRPCSync(t *testing.T, app types.ABCIApplicationServer) {
// Write requests // Write requests
for counter := 0; counter < numDeliverTxs; counter++ { for counter := 0; counter < numDeliverTxs; counter++ {
// Send request // Send request
response, err := client.DeliverTx(context.Background(), &types.RequestDeliverTx{Tx: []byte("test")}) txt := []byte("test")
response, err := client.FinalizeBlock(context.Background(), &types.RequestFinalizeBlock{Txs: [][]byte{txt}})
if err != nil { if err != nil {
t.Fatalf("Error in GRPC DeliverTx: %v", err.Error()) t.Fatalf("Error in GRPC DeliverTx: %v", err.Error())
} }
counter++ counter++
if response.Code != code.CodeTypeOK { for _, tx := range response.Txs {
t.Error("DeliverTx failed with ret_code", response.Code) if tx.Code != code.CodeTypeOK {
} t.Error("DeliverTx failed with ret_code", tx.Code)
if counter > numDeliverTxs { }
t.Fatal("Too many DeliverTx responses") if counter > numDeliverTxs {
} t.Fatal("Too many DeliverTx responses")
t.Log("response", counter) }
if counter == numDeliverTxs { t.Log("response", counter)
go func() { if counter == numDeliverTxs {
time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow go func() {
}() time.Sleep(time.Second * 1) // Wait for a bit to allow counter overflow
}()
}
} }
} }

View File

@@ -86,35 +86,40 @@ func (app *Application) Info(req types.RequestInfo) (resInfo types.ResponseInfo)
} }
// tx is either "key=value" or just arbitrary bytes // tx is either "key=value" or just arbitrary bytes
func (app *Application) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { func (app *Application) FinalizeBlock(req types.RequestFinalizeBlock) types.ResponseFinalizeBlock {
var key, value string var key, value string
var txs = make([]*types.ResponseDeliverTx, len(req.Txs))
parts := bytes.Split(req.Tx, []byte("=")) for i, tx := range req.Txs {
if len(parts) == 2 { parts := bytes.Split(tx, []byte("="))
key, value = string(parts[0]), string(parts[1]) if len(parts) == 2 {
} else { key, value = string(parts[0]), string(parts[1])
key, value = string(req.Tx), string(req.Tx) } else {
} key, value = string(tx), string(tx)
}
err := app.state.db.Set(prefixKey([]byte(key)), []byte(value)) err := app.state.db.Set(prefixKey([]byte(key)), []byte(value))
if err != nil { if err != nil {
panic(err) panic(err)
} }
app.state.Size++ app.state.Size++
events := []types.Event{ events := []types.Event{
{ {
Type: "app", Type: "app",
Attributes: []types.EventAttribute{ Attributes: []types.EventAttribute{
{Key: "creator", Value: "Cosmoshi Netowoko", Index: true}, {Key: "creator", Value: "Cosmoshi Netowoko", Index: true},
{Key: "key", Value: key, Index: true}, {Key: "key", Value: key, Index: true},
{Key: "index_key", Value: "index is working", Index: true}, {Key: "index_key", Value: "index is working", Index: true},
{Key: "noindex_key", Value: "index is working", Index: false}, {Key: "noindex_key", Value: "index is working", Index: false},
},
}, },
}, }
txs[i] = &types.ResponseDeliverTx{Code: code.CodeTypeOK, Events: events}
} }
return types.ResponseDeliverTx{Code: code.CodeTypeOK, Events: events} return types.ResponseFinalizeBlock{Txs: txs}
} }
func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { func (app *Application) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx {

View File

@@ -27,12 +27,16 @@ const (
var ctx = context.Background() var ctx = context.Background()
func testKVStore(t *testing.T, app types.Application, tx []byte, key, value string) { func testKVStore(t *testing.T, app types.Application, tx []byte, key, value string) {
req := types.RequestDeliverTx{Tx: tx} req := types.RequestFinalizeBlock{Txs: [][]byte{tx}}
ar := app.DeliverTx(req) ar := app.FinalizeBlock(req)
require.False(t, ar.IsErr(), ar) for _, tx := range ar.Txs {
require.False(t, tx.IsErr(), ar)
}
// repeating tx doesn't raise error // repeating tx doesn't raise error
ar = app.DeliverTx(req) ar = app.FinalizeBlock(req)
require.False(t, ar.IsErr(), ar) for _, tx := range ar.Txs {
require.False(t, tx.IsErr(), ar)
}
// commit // commit
app.Commit() app.Commit()
@@ -109,8 +113,7 @@ func TestPersistentKVStoreInfo(t *testing.T) {
header := tmproto.Header{ header := tmproto.Header{
Height: height, Height: height,
} }
kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header}) kvstore.FinalizeBlock(types.RequestFinalizeBlock{Hash: hash, Header: header})
kvstore.EndBlock(types.RequestEndBlock{Height: header.Height})
kvstore.Commit() kvstore.Commit()
resInfo = kvstore.Info(types.RequestInfo{}) resInfo = kvstore.Info(types.RequestInfo{})
@@ -200,16 +203,15 @@ func makeApplyBlock(
Height: height, Height: height,
} }
kvstore.BeginBlock(types.RequestBeginBlock{Hash: hash, Header: header}) resFinalizeBlock := kvstore.FinalizeBlock(types.RequestFinalizeBlock{
for _, tx := range txs { Hash: hash,
if r := kvstore.DeliverTx(types.RequestDeliverTx{Tx: tx}); r.IsErr() { Header: header,
t.Fatal(r) Txs: txs,
} })
}
resEndBlock := kvstore.EndBlock(types.RequestEndBlock{Height: header.Height})
kvstore.Commit() kvstore.Commit()
valsEqual(t, diff, resEndBlock.ValidatorUpdates) valsEqual(t, diff, resFinalizeBlock.ValidatorUpdates)
} }
@@ -326,13 +328,16 @@ func runClientTests(t *testing.T, client abcicli.Client) {
} }
func testClient(t *testing.T, app abcicli.Client, tx []byte, key, value string) { func testClient(t *testing.T, app abcicli.Client, tx []byte, key, value string) {
ar, err := app.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: tx}) ar, err := app.FinalizeBlockSync(ctx, types.RequestFinalizeBlock{Txs: [][]byte{tx}})
for _, tx := range ar.Txs {
require.False(t, tx.IsErr(), ar)
}
ar, err = app.FinalizeBlockSync(ctx, types.RequestFinalizeBlock{Txs: [][]byte{tx}}) // repeating tx doesn't raise error
require.NoError(t, err) require.NoError(t, err)
require.False(t, ar.IsErr(), ar) for _, tx := range ar.Txs {
// repeating tx doesn't raise error require.False(t, tx.IsErr(), ar)
ar, err = app.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: tx}) }
require.NoError(t, err)
require.False(t, ar.IsErr(), ar)
// commit // commit
_, err = app.CommitSync(ctx) _, err = app.CommitSync(ctx)
require.NoError(t, err) require.NoError(t, err)

View File

@@ -66,19 +66,19 @@ func (app *PersistentKVStoreApplication) Info(req types.RequestInfo) types.Respo
return res return res
} }
// tx is either "val:pubkey!power" or "key=value" or just arbitrary bytes // // tx is either "val:pubkey!power" or "key=value" or just arbitrary bytes
func (app *PersistentKVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx { // func (app *PersistentKVStoreApplication) DeliverTx(req types.RequestDeliverTx) types.ResponseDeliverTx {
// if it starts with "val:", update the validator set // // if it starts with "val:", update the validator set
// format is "val:pubkey!power" // // format is "val:pubkey!power"
if isValidatorTx(req.Tx) { // if isValidatorTx(req.Tx) {
// update validators in the merkle tree // // update validators in the merkle tree
// and in app.ValUpdates // // and in app.ValUpdates
return app.execValidatorTx(req.Tx) // return app.execValidatorTx(req.Tx)
} // }
// otherwise, update the key-value store // // otherwise, update the key-value store
return app.app.DeliverTx(req) // return app.app.DeliverTx(req)
} // }
func (app *PersistentKVStoreApplication) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx { func (app *PersistentKVStoreApplication) CheckTx(req types.RequestCheckTx) types.ResponseCheckTx {
return app.app.CheckTx(req) return app.app.CheckTx(req)
@@ -119,8 +119,40 @@ func (app *PersistentKVStoreApplication) InitChain(req types.RequestInitChain) t
return types.ResponseInitChain{} return types.ResponseInitChain{}
} }
// Track the block hash and header information func (app *PersistentKVStoreApplication) ListSnapshots(
func (app *PersistentKVStoreApplication) BeginBlock(req types.RequestBeginBlock) types.ResponseBeginBlock { req types.RequestListSnapshots) types.ResponseListSnapshots {
return types.ResponseListSnapshots{}
}
func (app *PersistentKVStoreApplication) LoadSnapshotChunk(
req types.RequestLoadSnapshotChunk) types.ResponseLoadSnapshotChunk {
return types.ResponseLoadSnapshotChunk{}
}
func (app *PersistentKVStoreApplication) OfferSnapshot(
req types.RequestOfferSnapshot) types.ResponseOfferSnapshot {
return types.ResponseOfferSnapshot{Result: types.ResponseOfferSnapshot_ABORT}
}
func (app *PersistentKVStoreApplication) ApplySnapshotChunk(
req types.RequestApplySnapshotChunk) types.ResponseApplySnapshotChunk {
return types.ResponseApplySnapshotChunk{Result: types.ResponseApplySnapshotChunk_ABORT}
}
func (app *PersistentKVStoreApplication) FinalizeBlock(
req types.RequestFinalizeBlock) types.ResponseFinalizeBlock {
// for i, tx := range req.Txs {
// // if it starts with "val:", update the validator set
// // format is "val:pubkey!power"
// if isValidatorTx(tx) {
// // update validators in the merkle tree
// // and in app.ValUpdates
// return app.execValidatorTx(req.Tx)
// }
// // otherwise, update the key-value store
// return app.app.DeliverTx(tx)
// }
// reset valset changes // reset valset changes
app.ValUpdates = make([]types.ValidatorUpdate, 0) app.ValUpdates = make([]types.ValidatorUpdate, 0)
@@ -142,32 +174,7 @@ func (app *PersistentKVStoreApplication) BeginBlock(req types.RequestBeginBlock)
} }
} }
return types.ResponseBeginBlock{} return types.ResponseFinalizeBlock{ValidatorUpdates: app.ValUpdates}
}
// Update the validator set
func (app *PersistentKVStoreApplication) EndBlock(req types.RequestEndBlock) types.ResponseEndBlock {
return types.ResponseEndBlock{ValidatorUpdates: app.ValUpdates}
}
func (app *PersistentKVStoreApplication) ListSnapshots(
req types.RequestListSnapshots) types.ResponseListSnapshots {
return types.ResponseListSnapshots{}
}
func (app *PersistentKVStoreApplication) LoadSnapshotChunk(
req types.RequestLoadSnapshotChunk) types.ResponseLoadSnapshotChunk {
return types.ResponseLoadSnapshotChunk{}
}
func (app *PersistentKVStoreApplication) OfferSnapshot(
req types.RequestOfferSnapshot) types.ResponseOfferSnapshot {
return types.ResponseOfferSnapshot{Result: types.ResponseOfferSnapshot_ABORT}
}
func (app *PersistentKVStoreApplication) ApplySnapshotChunk(
req types.RequestApplySnapshotChunk) types.ResponseApplySnapshotChunk {
return types.ResponseApplySnapshotChunk{Result: types.ResponseApplySnapshotChunk_ABORT}
} }
//--------------------------------------------- //---------------------------------------------

View File

@@ -200,9 +200,6 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types
case *types.Request_Info: case *types.Request_Info:
res := s.app.Info(*r.Info) res := s.app.Info(*r.Info)
responses <- types.ToResponseInfo(res) responses <- types.ToResponseInfo(res)
case *types.Request_DeliverTx:
res := s.app.DeliverTx(*r.DeliverTx)
responses <- types.ToResponseDeliverTx(res)
case *types.Request_CheckTx: case *types.Request_CheckTx:
res := s.app.CheckTx(*r.CheckTx) res := s.app.CheckTx(*r.CheckTx)
responses <- types.ToResponseCheckTx(res) responses <- types.ToResponseCheckTx(res)
@@ -215,12 +212,6 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types
case *types.Request_InitChain: case *types.Request_InitChain:
res := s.app.InitChain(*r.InitChain) res := s.app.InitChain(*r.InitChain)
responses <- types.ToResponseInitChain(res) responses <- types.ToResponseInitChain(res)
case *types.Request_BeginBlock:
res := s.app.BeginBlock(*r.BeginBlock)
responses <- types.ToResponseBeginBlock(res)
case *types.Request_EndBlock:
res := s.app.EndBlock(*r.EndBlock)
responses <- types.ToResponseEndBlock(res)
case *types.Request_ListSnapshots: case *types.Request_ListSnapshots:
res := s.app.ListSnapshots(*r.ListSnapshots) res := s.app.ListSnapshots(*r.ListSnapshots)
responses <- types.ToResponseListSnapshots(res) responses <- types.ToResponseListSnapshots(res)
@@ -233,6 +224,9 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types
case *types.Request_ApplySnapshotChunk: case *types.Request_ApplySnapshotChunk:
res := s.app.ApplySnapshotChunk(*r.ApplySnapshotChunk) res := s.app.ApplySnapshotChunk(*r.ApplySnapshotChunk)
responses <- types.ToResponseApplySnapshotChunk(res) responses <- types.ToResponseApplySnapshotChunk(res)
case *types.Request_FinalizeBlock:
res := s.app.FinalizeBlock(*r.FinalizeBlock)
responses <- types.ToResponseFinalizeBlock(res)
default: default:
responses <- types.ToResponseException("Unknown request") responses <- types.ToResponseException("Unknown request")
} }

View File

@@ -51,20 +51,22 @@ func Commit(client abcicli.Client, hashExp []byte) error {
return nil return nil
} }
func DeliverTx(client abcicli.Client, txBytes []byte, codeExp uint32, dataExp []byte) error { func FinalizeBlock(client abcicli.Client, txBytes []byte, codeExp uint32, dataExp []byte) error {
res, _ := client.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: txBytes}) res, _ := client.FinalizeBlockSync(ctx, types.RequestFinalizeBlock{Txs: [][]byte{txBytes}})
code, data, log := res.Code, res.Data, res.Log for _, tx := range res.Txs {
if code != codeExp { code, data, log := tx.Code, tx.Data, tx.Log
fmt.Println("Failed test: DeliverTx") if code != codeExp {
fmt.Printf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v\n", fmt.Println("Failed test: DeliverTx")
code, codeExp, log) fmt.Printf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v\n",
return errors.New("deliverTx error") code, codeExp, log)
} return errors.New("deliverTx error")
if !bytes.Equal(data, dataExp) { }
fmt.Println("Failed test: DeliverTx") if !bytes.Equal(data, dataExp) {
fmt.Printf("DeliverTx response data was unexpected. Got %X expected %X\n", fmt.Println("Failed test: DeliverTx")
data, dataExp) fmt.Printf("DeliverTx response data was unexpected. Got %X expected %X\n",
return errors.New("deliverTx error") data, dataExp)
return errors.New("deliverTx error")
}
} }
fmt.Println("Passed test: DeliverTx") fmt.Println("Passed test: DeliverTx")
return nil return nil

View File

@@ -37,16 +37,29 @@ func commit(client abcicli.Client, hashExp []byte) {
} }
} }
func deliverTx(client abcicli.Client, txBytes []byte, codeExp uint32, dataExp []byte) { type tx struct {
res, err := client.DeliverTxSync(ctx, types.RequestDeliverTx{Tx: txBytes}) Data []byte
CodeExp uint32
DataExp []byte
}
func finalizeBlock(client abcicli.Client, txs []tx) {
var txsData = make([][]byte, len(txs))
for i, tx := range txs {
txsData[i] = tx.Data
}
res, err := client.FinalizeBlockSync(ctx, types.RequestFinalizeBlock{Txs: txsData})
if err != nil { if err != nil {
panicf("client error: %v", err) panicf("client error: %v", err)
} }
if res.Code != codeExp { for i, tx := range res.Txs {
panicf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v", res.Code, codeExp, res.Log) if tx.Code != txs[i].CodeExp {
} panicf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v", tx.Code, txs[i].CodeExp, tx.Log)
if !bytes.Equal(res.Data, dataExp) { }
panicf("DeliverTx response data was unexpected. Got %X expected %X", res.Data, dataExp) if !bytes.Equal(tx.Data, txs[i].DataExp) {
panicf("DeliverTx response data was unexpected. Got %X expected %X", tx.Data, txs[i].DataExp)
}
} }
} }

View File

@@ -81,13 +81,15 @@ func testCounter() {
// commit(client, nil) // commit(client, nil)
// deliverTx(client, []byte("abc"), code.CodeTypeBadNonce, nil) // deliverTx(client, []byte("abc"), code.CodeTypeBadNonce, nil)
commit(client, nil) commit(client, nil)
deliverTx(client, []byte{0x00}, types.CodeTypeOK, nil) finalizeBlock(client, []tx{{Data: []byte{0x00}, CodeExp: types.CodeTypeOK, DataExp: nil}})
commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 1}) commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 1})
// deliverTx(client, []byte{0x00}, code.CodeTypeBadNonce, nil) // deliverTx(client, []byte{0x00}, code.CodeTypeBadNonce, nil)
deliverTx(client, []byte{0x01}, types.CodeTypeOK, nil) txs := []tx{
deliverTx(client, []byte{0x00, 0x02}, types.CodeTypeOK, nil) {Data: []byte{0x01}, DataExp: nil, CodeExp: types.CodeTypeOK},
deliverTx(client, []byte{0x00, 0x03}, types.CodeTypeOK, nil) {Data: []byte{0x00, 0x02}, DataExp: nil, CodeExp: types.CodeTypeOK},
deliverTx(client, []byte{0x00, 0x00, 0x04}, types.CodeTypeOK, nil) {Data: []byte{0x00, 0x03}, DataExp: nil, CodeExp: types.CodeTypeOK},
{Data: []byte{0x00, 0x00, 0x04}, DataExp: nil, CodeExp: types.CodeTypeOK}}
finalizeBlock(client, txs)
// deliverTx(client, []byte{0x00, 0x00, 0x06}, code.CodeTypeBadNonce, nil) // deliverTx(client, []byte{0x00, 0x00, 0x06}, code.CodeTypeBadNonce, nil)
commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 5}) commit(client, []byte{0, 0, 0, 0, 0, 0, 0, 5})
} }

View File

@@ -17,11 +17,9 @@ type Application interface {
CheckTx(RequestCheckTx) ResponseCheckTx // Validate a tx for the mempool CheckTx(RequestCheckTx) ResponseCheckTx // Validate a tx for the mempool
// Consensus Connection // Consensus Connection
InitChain(RequestInitChain) ResponseInitChain // Initialize blockchain w validators/other info from TendermintCore InitChain(RequestInitChain) ResponseInitChain // Initialize blockchain w validators/other info from TendermintCore
BeginBlock(RequestBeginBlock) ResponseBeginBlock // Signals the beginning of a block FinalizeBlock(RequestFinalizeBlock) ResponseFinalizeBlock
DeliverTx(RequestDeliverTx) ResponseDeliverTx // Deliver a tx for full processing Commit() ResponseCommit // Commit the state and return the application Merkle root hash
EndBlock(RequestEndBlock) ResponseEndBlock // Signals the end of a block, returns changes to the validator set
Commit() ResponseCommit // Commit the state and return the application Merkle root hash
// State Sync Connection // State Sync Connection
ListSnapshots(RequestListSnapshots) ResponseListSnapshots // List available snapshots ListSnapshots(RequestListSnapshots) ResponseListSnapshots // List available snapshots
@@ -46,10 +44,6 @@ func (BaseApplication) Info(req RequestInfo) ResponseInfo {
return ResponseInfo{} return ResponseInfo{}
} }
func (BaseApplication) DeliverTx(req RequestDeliverTx) ResponseDeliverTx {
return ResponseDeliverTx{Code: CodeTypeOK}
}
func (BaseApplication) CheckTx(req RequestCheckTx) ResponseCheckTx { func (BaseApplication) CheckTx(req RequestCheckTx) ResponseCheckTx {
return ResponseCheckTx{Code: CodeTypeOK} return ResponseCheckTx{Code: CodeTypeOK}
} }
@@ -66,14 +60,6 @@ func (BaseApplication) InitChain(req RequestInitChain) ResponseInitChain {
return ResponseInitChain{} return ResponseInitChain{}
} }
func (BaseApplication) BeginBlock(req RequestBeginBlock) ResponseBeginBlock {
return ResponseBeginBlock{}
}
func (BaseApplication) EndBlock(req RequestEndBlock) ResponseEndBlock {
return ResponseEndBlock{}
}
func (BaseApplication) ListSnapshots(req RequestListSnapshots) ResponseListSnapshots { func (BaseApplication) ListSnapshots(req RequestListSnapshots) ResponseListSnapshots {
return ResponseListSnapshots{} return ResponseListSnapshots{}
} }
@@ -90,6 +76,10 @@ func (BaseApplication) ApplySnapshotChunk(req RequestApplySnapshotChunk) Respons
return ResponseApplySnapshotChunk{} return ResponseApplySnapshotChunk{}
} }
func (BaseApplication) FinalizeBlock(req RequestFinalizeBlock) ResponseFinalizeBlock {
return ResponseFinalizeBlock{}
}
//------------------------------------------------------- //-------------------------------------------------------
// GRPCApplication is a GRPC wrapper for Application // GRPCApplication is a GRPC wrapper for Application
@@ -114,11 +104,6 @@ func (app *GRPCApplication) Info(ctx context.Context, req *RequestInfo) (*Respon
return &res, nil return &res, nil
} }
func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) {
res := app.app.DeliverTx(*req)
return &res, nil
}
func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) {
res := app.app.CheckTx(*req) res := app.app.CheckTx(*req)
return &res, nil return &res, nil
@@ -139,16 +124,6 @@ func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain
return &res, nil return &res, nil
} }
func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) {
res := app.app.BeginBlock(*req)
return &res, nil
}
func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) {
res := app.app.EndBlock(*req)
return &res, nil
}
func (app *GRPCApplication) ListSnapshots( func (app *GRPCApplication) ListSnapshots(
ctx context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) { ctx context.Context, req *RequestListSnapshots) (*ResponseListSnapshots, error) {
res := app.app.ListSnapshots(*req) res := app.app.ListSnapshots(*req)
@@ -172,3 +147,9 @@ func (app *GRPCApplication) ApplySnapshotChunk(
res := app.app.ApplySnapshotChunk(*req) res := app.app.ApplySnapshotChunk(*req)
return &res, nil return &res, nil
} }
func (app *GRPCApplication) FinalizeBlock(
ctx context.Context, req *RequestFinalizeBlock) (*ResponseFinalizeBlock, error) {
res := app.app.FinalizeBlock(*req)
return &res, nil
}

View File

@@ -48,12 +48,6 @@ func ToRequestInfo(req RequestInfo) *Request {
} }
} }
func ToRequestDeliverTx(req RequestDeliverTx) *Request {
return &Request{
Value: &Request_DeliverTx{&req},
}
}
func ToRequestCheckTx(req RequestCheckTx) *Request { func ToRequestCheckTx(req RequestCheckTx) *Request {
return &Request{ return &Request{
Value: &Request_CheckTx{&req}, Value: &Request_CheckTx{&req},
@@ -78,18 +72,6 @@ func ToRequestInitChain(req RequestInitChain) *Request {
} }
} }
func ToRequestBeginBlock(req RequestBeginBlock) *Request {
return &Request{
Value: &Request_BeginBlock{&req},
}
}
func ToRequestEndBlock(req RequestEndBlock) *Request {
return &Request{
Value: &Request_EndBlock{&req},
}
}
func ToRequestListSnapshots(req RequestListSnapshots) *Request { func ToRequestListSnapshots(req RequestListSnapshots) *Request {
return &Request{ return &Request{
Value: &Request_ListSnapshots{&req}, Value: &Request_ListSnapshots{&req},
@@ -114,6 +96,12 @@ func ToRequestApplySnapshotChunk(req RequestApplySnapshotChunk) *Request {
} }
} }
func ToRequestFinalizeBlock(req RequestFinalizeBlock) *Request {
return &Request{
Value: &Request_FinalizeBlock{&req},
}
}
//---------------------------------------- //----------------------------------------
func ToResponseException(errStr string) *Response { func ToResponseException(errStr string) *Response {
@@ -139,11 +127,6 @@ func ToResponseInfo(res ResponseInfo) *Response {
Value: &Response_Info{&res}, Value: &Response_Info{&res},
} }
} }
func ToResponseDeliverTx(res ResponseDeliverTx) *Response {
return &Response{
Value: &Response_DeliverTx{&res},
}
}
func ToResponseCheckTx(res ResponseCheckTx) *Response { func ToResponseCheckTx(res ResponseCheckTx) *Response {
return &Response{ return &Response{
@@ -169,18 +152,6 @@ func ToResponseInitChain(res ResponseInitChain) *Response {
} }
} }
func ToResponseBeginBlock(res ResponseBeginBlock) *Response {
return &Response{
Value: &Response_BeginBlock{&res},
}
}
func ToResponseEndBlock(res ResponseEndBlock) *Response {
return &Response{
Value: &Response_EndBlock{&res},
}
}
func ToResponseListSnapshots(res ResponseListSnapshots) *Response { func ToResponseListSnapshots(res ResponseListSnapshots) *Response {
return &Response{ return &Response{
Value: &Response_ListSnapshots{&res}, Value: &Response_ListSnapshots{&res},
@@ -204,3 +175,9 @@ func ToResponseApplySnapshotChunk(res ResponseApplySnapshotChunk) *Response {
Value: &Response_ApplySnapshotChunk{&res}, Value: &Response_ApplySnapshotChunk{&res},
} }
} }
func ToResponseFinalizeBlock(res ResponseFinalizeBlock) *Response {
return &Response{
Value: &Response_FinalizeBlock{&res},
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -161,8 +161,8 @@ func TestMempoolRmBadTx(t *testing.T) {
txBytes := make([]byte, 8) txBytes := make([]byte, 8)
binary.BigEndian.PutUint64(txBytes, uint64(0)) binary.BigEndian.PutUint64(txBytes, uint64(0))
resDeliver := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) resDeliver := app.FinalizeBlock(abci.RequestFinalizeBlock{Txs: [][]byte{txBytes}})
assert.False(t, resDeliver.IsErr(), fmt.Sprintf("expected no error. got %v", resDeliver)) assert.False(t, resDeliver.Txs[0].IsErr(), fmt.Sprintf("expected no error. got %v", resDeliver))
resCommit := app.Commit() resCommit := app.Commit()
assert.True(t, len(resCommit.Data) > 0) assert.True(t, len(resCommit.Data) > 0)
@@ -233,15 +233,16 @@ func (app *CounterApplication) Info(req abci.RequestInfo) abci.ResponseInfo {
return abci.ResponseInfo{Data: fmt.Sprintf("txs:%v", app.txCount)} return abci.ResponseInfo{Data: fmt.Sprintf("txs:%v", app.txCount)}
} }
func (app *CounterApplication) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { func (app *CounterApplication) FinalizeBlock(req abci.RequestFinalizeBlock) abci.ResponseFinalizeBlock {
txValue := txAsUint64(req.Tx) txValue := txAsUint64(req.Txs[0])
if txValue != uint64(app.txCount) { if txValue != uint64(app.txCount) {
return abci.ResponseDeliverTx{ return abci.ResponseFinalizeBlock{Txs: []*abci.ResponseDeliverTx{{
Code: code.CodeTypeBadNonce, Code: code.CodeTypeBadNonce,
Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)} Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)}},
}
} }
app.txCount++ app.txCount++
return abci.ResponseDeliverTx{Code: code.CodeTypeOK} return abci.ResponseFinalizeBlock{Txs: []*abci.ResponseDeliverTx{{Code: code.CodeTypeOK}}}
} }
func (app *CounterApplication) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx { func (app *CounterApplication) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {

View File

@@ -73,20 +73,15 @@ type mockProxyApp struct {
abciResponses *tmstate.ABCIResponses abciResponses *tmstate.ABCIResponses
} }
func (mock *mockProxyApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx { func (mock *mockProxyApp) FinalizeBlock(req abci.RequestFinalizeBlock) abci.ResponseFinalizeBlock {
r := mock.abciResponses.DeliverTxs[mock.txCount] r := mock.abciResponses.FinalizeBlock
mock.txCount++ mock.txCount++
if r == nil { if r == nil {
return abci.ResponseDeliverTx{} return abci.ResponseFinalizeBlock{}
} }
return *r return *r
} }
func (mock *mockProxyApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock {
mock.txCount = 0
return *mock.abciResponses.EndBlock
}
func (mock *mockProxyApp) Commit() abci.ResponseCommit { func (mock *mockProxyApp) Commit() abci.ResponseCommit {
return abci.ResponseCommit{Data: mock.appHash} return abci.ResponseCommit{Data: mock.appHash}
} }

View File

@@ -619,8 +619,8 @@ func TestMockProxyApp(t *testing.T) {
assert.NotPanics(t, func() { assert.NotPanics(t, func() {
abciResWithEmptyDeliverTx := new(tmstate.ABCIResponses) abciResWithEmptyDeliverTx := new(tmstate.ABCIResponses)
abciResWithEmptyDeliverTx.DeliverTxs = make([]*abci.ResponseDeliverTx, 0) abciResWithEmptyDeliverTx.FinalizeBlock.Txs = make([]*abci.ResponseDeliverTx, 0)
abciResWithEmptyDeliverTx.DeliverTxs = append(abciResWithEmptyDeliverTx.DeliverTxs, &abci.ResponseDeliverTx{}) abciResWithEmptyDeliverTx.FinalizeBlock.Txs = append(abciResWithEmptyDeliverTx.FinalizeBlock.Txs, &abci.ResponseDeliverTx{})
// called when saveABCIResponses: // called when saveABCIResponses:
bytes, err := proto.Marshal(abciResWithEmptyDeliverTx) bytes, err := proto.Marshal(abciResWithEmptyDeliverTx)
@@ -634,28 +634,30 @@ func TestMockProxyApp(t *testing.T) {
mock := newMockProxyApp([]byte("mock_hash"), loadedAbciRes) mock := newMockProxyApp([]byte("mock_hash"), loadedAbciRes)
abciRes := new(tmstate.ABCIResponses) abciRes := new(tmstate.ABCIResponses)
abciRes.DeliverTxs = make([]*abci.ResponseDeliverTx, len(loadedAbciRes.DeliverTxs)) abciRes.FinalizeBlock.Txs = make([]*abci.ResponseDeliverTx, len(loadedAbciRes.FinalizeBlock.Txs))
// Execute transactions and get hash. // Execute transactions and get hash.
proxyCb := func(req *abci.Request, res *abci.Response) { proxyCb := func(req *abci.Request, res *abci.Response) {
if r, ok := res.Value.(*abci.Response_DeliverTx); ok { if r, ok := res.Value.(*abci.Response_FinalizeBlock); ok {
// TODO: make use of res.Log for i, tx := range r.FinalizeBlock.Txs {
// TODO: make use of this info // TODO: make use of res.Log
// Blocks may include invalid txs. // TODO: make use of this info
txRes := r.DeliverTx // Blocks may include invalid txs.
if txRes.Code == abci.CodeTypeOK { txRes := tx
validTxs++ if txRes.Code == abci.CodeTypeOK {
} else { validTxs++
logger.Debug("Invalid tx", "code", txRes.Code, "log", txRes.Log) } else {
invalidTxs++ logger.Debug("Invalid tx", "code", txRes.Code, "log", txRes.Log)
invalidTxs++
}
abciRes.FinalizeBlock.Txs[i] = txRes
txIndex++
} }
abciRes.DeliverTxs[txIndex] = txRes
txIndex++
} }
} }
mock.SetResponseCallback(proxyCb) mock.SetResponseCallback(proxyCb)
someTx := []byte("tx") someTx := []byte("tx")
_, err = mock.DeliverTxAsync(context.Background(), abci.RequestDeliverTx{Tx: someTx}) _, err = mock.FinalizeBlockSync(context.Background(), abci.RequestFinalizeBlock{Txs: [][]byte{someTx}})
assert.NoError(t, err) assert.NoError(t, err)
}) })
assert.True(t, validTxs == 1) assert.True(t, validTxs == 1)

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -236,8 +236,7 @@ func TestMempool_KeepInvalidTxsInCache(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// simulate new block // simulate new block
_ = app.DeliverTx(abci.RequestDeliverTx{Tx: a}) _ = app.FinalizeBlock(abci.RequestFinalizeBlock{Txs: [][]byte{a, b}})
_ = app.DeliverTx(abci.RequestDeliverTx{Tx: b})
err = mp.Update(1, []types.Tx{a, b}, err = mp.Update(1, []types.Tx{a, b},
[]*abci.ResponseDeliverTx{{Code: abci.CodeTypeOK}, {Code: 2}}, nil, nil) []*abci.ResponseDeliverTx{{Code: abci.CodeTypeOK}, {Code: 2}}, nil, nil)
require.NoError(t, err) require.NoError(t, err)
@@ -363,24 +362,29 @@ func TestSerialReap(t *testing.T) {
commitRange := func(start, end int) { commitRange := func(start, end int) {
ctx := context.Background() ctx := context.Background()
// Deliver some txs. // Deliver some txs.
var txs = make([][]byte, end)
for i := start; i < end; i++ { for i := start; i < end; i++ {
txBytes := make([]byte, 8) txBytes := make([]byte, 8)
binary.BigEndian.PutUint64(txBytes, uint64(i)) binary.BigEndian.PutUint64(txBytes, uint64(i))
res, err := appConnCon.DeliverTxSync(ctx, abci.RequestDeliverTx{Tx: txBytes}) txs[i] = txBytes
if err != nil { }
t.Errorf("client error committing tx: %v", err) res, err := appConnCon.FinalizeBlockSync(ctx, abci.RequestFinalizeBlock{Txs: txs})
} if err != nil {
if res.IsErr() { t.Errorf("client error committing tx: %v", err)
}
for _, tx := range res.Txs {
if tx.IsErr() {
t.Errorf("error committing tx. Code:%v result:%X log:%v", t.Errorf("error committing tx. Code:%v result:%X log:%v",
res.Code, res.Data, res.Log) tx.Code, tx.Data, tx.Log)
} }
} }
res, err := appConnCon.CommitSync(ctx)
resCommit, err := appConnCon.CommitSync(ctx)
if err != nil { if err != nil {
t.Errorf("client error committing: %v", err) t.Errorf("client error committing: %v", err)
} }
if len(res.Data) != 8 { if len(resCommit.Data) != 8 {
t.Errorf("error committing. Hash:%X", res.Data) t.Errorf("error committing. Hash:%X", resCommit.Data)
} }
} }
@@ -405,7 +409,7 @@ func TestSerialReap(t *testing.T) {
// Reap again. We should get the same amount // Reap again. We should get the same amount
reapCheck(1000) reapCheck(1000)
// Commit from the conensus AppConn // Commit from the consensus AppConn
commitRange(0, 500) commitRange(0, 500)
updateRange(0, 500) updateRange(0, 500)
@@ -530,9 +534,11 @@ func TestMempoolTxsBytes(t *testing.T) {
} }
}) })
ctx := context.Background() ctx := context.Background()
res, err := appConnCon.DeliverTxSync(ctx, abci.RequestDeliverTx{Tx: txBytes}) res, err := appConnCon.FinalizeBlockSync(ctx, abci.RequestFinalizeBlock{Txs: [][]byte{txBytes}})
require.NoError(t, err) require.NoError(t, err)
require.EqualValues(t, 0, res.Code) for _, tx := range res.Txs {
require.EqualValues(t, 0, tx.Code)
}
res2, err := appConnCon.CommitSync(ctx) res2, err := appConnCon.CommitSync(ctx)
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, res2.Data) require.NotEmpty(t, res2.Data)

View File

@@ -1,4 +1,4 @@
// Code generated by mockery 2.7.4. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery 2.7.4. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery 2.7.4. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,3 @@
// nolint
package query package query
import ( import (

View File

@@ -407,9 +407,9 @@ func (c *Client) BlockResults(ctx context.Context, height *int64) (*ctypes.Resul
return nil, err return nil, err
} }
// proto-encode BeginBlock events // proto-encode FinalizeBlock events
bbeBytes, err := proto.Marshal(&abci.ResponseBeginBlock{ bbeBytes, err := proto.Marshal(&abci.ResponseFinalizeBlock{
Events: res.BeginBlockEvents, Events: res.FinalizeBlockEvents,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@@ -418,16 +418,8 @@ func (c *Client) BlockResults(ctx context.Context, height *int64) (*ctypes.Resul
// Build a Merkle tree of proto-encoded DeliverTx results and get a hash. // Build a Merkle tree of proto-encoded DeliverTx results and get a hash.
results := types.NewResults(res.TxsResults) results := types.NewResults(res.TxsResults)
// proto-encode EndBlock events.
ebeBytes, err := proto.Marshal(&abci.ResponseEndBlock{
Events: res.EndBlockEvents,
})
if err != nil {
return nil, err
}
// Build a Merkle tree out of the above 3 binary slices. // Build a Merkle tree out of the above 3 binary slices.
rH := merkle.HashFromByteSlices([][]byte{bbeBytes, results.Hash(), ebeBytes}) rH := merkle.HashFromByteSlices([][]byte{bbeBytes, results.Hash()})
// Verify block results. // Verify block results.
if !bytes.Equal(rH, trustedBlock.LastResultsHash) { if !bytes.Equal(rH, trustedBlock.LastResultsHash) {

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -21,20 +21,21 @@ import "gogoproto/gogo.proto";
message Request { message Request {
oneof value { oneof value {
RequestEcho echo = 1; RequestEcho echo = 1;
RequestFlush flush = 2; RequestFlush flush = 2;
RequestInfo info = 3; RequestInfo info = 3;
RequestInitChain init_chain = 4; RequestInitChain init_chain = 4;
RequestQuery query = 5; RequestQuery query = 5;
RequestBeginBlock begin_block = 6; // RequestBeginBlock begin_block = 6;
RequestCheckTx check_tx = 7; RequestCheckTx check_tx = 7;
RequestDeliverTx deliver_tx = 8; // RequestDeliverTx deliver_tx = 8;
RequestEndBlock end_block = 9; // RequestEndBlock end_block = 9;
RequestCommit commit = 10; RequestCommit commit = 10;
RequestListSnapshots list_snapshots = 11; RequestListSnapshots list_snapshots = 11;
RequestOfferSnapshot offer_snapshot = 12; RequestOfferSnapshot offer_snapshot = 12;
RequestLoadSnapshotChunk load_snapshot_chunk = 13; RequestLoadSnapshotChunk load_snapshot_chunk = 13;
RequestApplySnapshotChunk apply_snapshot_chunk = 14; RequestApplySnapshotChunk apply_snapshot_chunk = 14;
RequestFinalizeBlock finalize_block = 15;
} }
} }
@@ -67,13 +68,6 @@ message RequestQuery {
bool prove = 4; bool prove = 4;
} }
message RequestBeginBlock {
bytes hash = 1;
tendermint.types.Header header = 2 [(gogoproto.nullable) = false];
LastCommitInfo last_commit_info = 3 [(gogoproto.nullable) = false];
repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false];
}
enum CheckTxType { enum CheckTxType {
NEW = 0 [(gogoproto.enumvalue_customname) = "New"]; NEW = 0 [(gogoproto.enumvalue_customname) = "New"];
RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"]; RECHECK = 1 [(gogoproto.enumvalue_customname) = "Recheck"];
@@ -84,14 +78,6 @@ message RequestCheckTx {
CheckTxType type = 2; CheckTxType type = 2;
} }
message RequestDeliverTx {
bytes tx = 1;
}
message RequestEndBlock {
int64 height = 1;
}
message RequestCommit {} message RequestCommit {}
// lists available snapshots // lists available snapshots
@@ -117,26 +103,35 @@ message RequestApplySnapshotChunk {
string sender = 3; string sender = 3;
} }
message RequestFinalizeBlock {
repeated bytes txs = 1;
bytes hash = 2;
tendermint.types.Header header = 3 [(gogoproto.nullable) = false];
LastCommitInfo last_commit_info = 4 [(gogoproto.nullable) = false];
repeated Evidence byzantine_validators = 5 [(gogoproto.nullable) = false];
}
//---------------------------------------- //----------------------------------------
// Response types // Response types
message Response { message Response {
oneof value { oneof value {
ResponseException exception = 1; ResponseException exception = 1;
ResponseEcho echo = 2; ResponseEcho echo = 2;
ResponseFlush flush = 3; ResponseFlush flush = 3;
ResponseInfo info = 4; ResponseInfo info = 4;
ResponseInitChain init_chain = 5; ResponseInitChain init_chain = 5;
ResponseQuery query = 6; ResponseQuery query = 6;
ResponseBeginBlock begin_block = 7; // ResponseBeginBlock begin_block = 7;
ResponseCheckTx check_tx = 8; ResponseCheckTx check_tx = 8;
ResponseDeliverTx deliver_tx = 9; // ResponseDeliverTx deliver_tx = 9;
ResponseEndBlock end_block = 10; // ResponseEndBlock end_block = 10;
ResponseCommit commit = 11; ResponseCommit commit = 11;
ResponseListSnapshots list_snapshots = 12; ResponseListSnapshots list_snapshots = 12;
ResponseOfferSnapshot offer_snapshot = 13; ResponseOfferSnapshot offer_snapshot = 13;
ResponseLoadSnapshotChunk load_snapshot_chunk = 14; ResponseLoadSnapshotChunk load_snapshot_chunk = 14;
ResponseApplySnapshotChunk apply_snapshot_chunk = 15; ResponseApplySnapshotChunk apply_snapshot_chunk = 15;
ResponseFinalizeBlock finalize_block = 16;
} }
} }
@@ -181,10 +176,6 @@ message ResponseQuery {
string codespace = 10; string codespace = 10;
} }
message ResponseBeginBlock {
repeated Event events = 1 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
}
message ResponseCheckTx { message ResponseCheckTx {
uint32 code = 1; uint32 code = 1;
bytes data = 2; bytes data = 2;
@@ -210,12 +201,6 @@ message ResponseDeliverTx {
string codespace = 8; string codespace = 8;
} }
message ResponseEndBlock {
repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable) = false];
tendermint.types.ConsensusParams consensus_param_updates = 2;
repeated Event events = 3 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
}
message ResponseCommit { message ResponseCommit {
// reserve 1 // reserve 1
bytes data = 2; bytes data = 2;
@@ -258,6 +243,13 @@ message ResponseApplySnapshotChunk {
} }
} }
message ResponseFinalizeBlock {
repeated ResponseDeliverTx txs = 1;
repeated ValidatorUpdate validator_updates = 2 [(gogoproto.nullable) = false];
tendermint.types.ConsensusParams consensus_param_updates = 3;
repeated Event events = 4 [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
}
//---------------------------------------- //----------------------------------------
// Misc. // Misc.
@@ -351,15 +343,13 @@ service ABCIApplication {
rpc Echo(RequestEcho) returns (ResponseEcho); rpc Echo(RequestEcho) returns (ResponseEcho);
rpc Flush(RequestFlush) returns (ResponseFlush); rpc Flush(RequestFlush) returns (ResponseFlush);
rpc Info(RequestInfo) returns (ResponseInfo); rpc Info(RequestInfo) returns (ResponseInfo);
rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx);
rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx);
rpc Query(RequestQuery) returns (ResponseQuery); rpc Query(RequestQuery) returns (ResponseQuery);
rpc Commit(RequestCommit) returns (ResponseCommit); rpc Commit(RequestCommit) returns (ResponseCommit);
rpc InitChain(RequestInitChain) returns (ResponseInitChain); rpc InitChain(RequestInitChain) returns (ResponseInitChain);
rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock);
rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock);
rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots); rpc ListSnapshots(RequestListSnapshots) returns (ResponseListSnapshots);
rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot); rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot);
rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk); rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk);
rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk); rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk);
rpc FinalizeBlock(RequestFinalizeBlock) returns (ResponseFinalizeBlock);
} }

View File

@@ -34,9 +34,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
// of the various ABCI calls during block processing. // of the various ABCI calls during block processing.
// It is persisted to disk for each height before calling Commit. // It is persisted to disk for each height before calling Commit.
type ABCIResponses struct { type ABCIResponses struct {
DeliverTxs []*types.ResponseDeliverTx `protobuf:"bytes,1,rep,name=deliver_txs,json=deliverTxs,proto3" json:"deliver_txs,omitempty"` FinalizeBlock *types.ResponseFinalizeBlock `protobuf:"bytes,2,opt,name=finalize_block,json=finalizeBlock,proto3" json:"finalize_block,omitempty"`
EndBlock *types.ResponseEndBlock `protobuf:"bytes,2,opt,name=end_block,json=endBlock,proto3" json:"end_block,omitempty"`
BeginBlock *types.ResponseBeginBlock `protobuf:"bytes,3,opt,name=begin_block,json=beginBlock,proto3" json:"begin_block,omitempty"`
} }
func (m *ABCIResponses) Reset() { *m = ABCIResponses{} } func (m *ABCIResponses) Reset() { *m = ABCIResponses{} }
@@ -72,23 +70,9 @@ func (m *ABCIResponses) XXX_DiscardUnknown() {
var xxx_messageInfo_ABCIResponses proto.InternalMessageInfo var xxx_messageInfo_ABCIResponses proto.InternalMessageInfo
func (m *ABCIResponses) GetDeliverTxs() []*types.ResponseDeliverTx { func (m *ABCIResponses) GetFinalizeBlock() *types.ResponseFinalizeBlock {
if m != nil { if m != nil {
return m.DeliverTxs return m.FinalizeBlock
}
return nil
}
func (m *ABCIResponses) GetEndBlock() *types.ResponseEndBlock {
if m != nil {
return m.EndBlock
}
return nil
}
func (m *ABCIResponses) GetBeginBlock() *types.ResponseBeginBlock {
if m != nil {
return m.BeginBlock
} }
return nil return nil
} }
@@ -422,55 +406,52 @@ func init() {
func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) } func init() { proto.RegisterFile("tendermint/state/types.proto", fileDescriptor_ccfacf933f22bf93) }
var fileDescriptor_ccfacf933f22bf93 = []byte{ var fileDescriptor_ccfacf933f22bf93 = []byte{
// 763 bytes of a gzipped FileDescriptorProto // 717 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcf, 0x6f, 0xd3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4d, 0x6f, 0xd3, 0x4a,
0x14, 0x6e, 0xe8, 0xb6, 0xb6, 0xce, 0xda, 0x0e, 0x8f, 0x43, 0xd6, 0xb1, 0xb4, 0x2b, 0x3f, 0x34, 0x14, 0x8d, 0x5f, 0x3f, 0x92, 0x4c, 0x9a, 0xa4, 0x6f, 0xfa, 0x16, 0x69, 0xfa, 0xea, 0xe4, 0x45,
0x71, 0x48, 0xa5, 0x71, 0x40, 0x5c, 0x26, 0x2d, 0x2d, 0x62, 0x95, 0x26, 0x04, 0xd9, 0xb4, 0x03, 0x8f, 0xaa, 0x62, 0xe1, 0x48, 0xb0, 0x40, 0x6c, 0x90, 0x9a, 0x54, 0x50, 0x4b, 0x05, 0x81, 0x8b,
0x97, 0xc8, 0x6d, 0xbc, 0x24, 0xa2, 0x4d, 0xa2, 0xd8, 0x2d, 0xe3, 0x0f, 0xe0, 0xbe, 0x2b, 0xff, 0xba, 0x60, 0x81, 0x35, 0x71, 0x26, 0xf6, 0x08, 0xc7, 0xb6, 0x3c, 0x93, 0xf2, 0xb1, 0x67, 0xdf,
0xd1, 0x8e, 0x3b, 0x22, 0x0e, 0x03, 0xba, 0x7f, 0x04, 0xd9, 0xce, 0x0f, 0xb7, 0x65, 0xd2, 0x10, 0x2d, 0xff, 0xa8, 0xcb, 0x2e, 0x59, 0x15, 0x48, 0xff, 0x08, 0x9a, 0x0f, 0xdb, 0x93, 0x84, 0x45,
0x37, 0xfb, 0x7d, 0xdf, 0xfb, 0xfc, 0xf9, 0xf9, 0x3d, 0x19, 0x3c, 0xa6, 0x38, 0x70, 0x70, 0x3c, 0x11, 0xbb, 0xcc, 0x3d, 0xe7, 0x9e, 0x7b, 0xe6, 0xce, 0xbd, 0x31, 0xf8, 0x97, 0xe1, 0x68, 0x8c,
0xf6, 0x03, 0xda, 0x21, 0x14, 0x51, 0xdc, 0xa1, 0x5f, 0x22, 0x4c, 0x8c, 0x28, 0x0e, 0x69, 0x08, 0xd3, 0x29, 0x89, 0x58, 0x9f, 0x32, 0xc4, 0x70, 0x9f, 0x7d, 0x4c, 0x30, 0xb5, 0x92, 0x34, 0x66,
0x37, 0x72, 0xd4, 0xe0, 0x68, 0xe3, 0x91, 0x1b, 0xba, 0x21, 0x07, 0x3b, 0x6c, 0x25, 0x78, 0x8d, 0x31, 0xdc, 0x2e, 0x50, 0x4b, 0xa0, 0xed, 0x7f, 0xfc, 0xd8, 0x8f, 0x05, 0xd8, 0xe7, 0xbf, 0x24,
0x6d, 0x49, 0x05, 0x0d, 0x86, 0xbe, 0x2c, 0xd2, 0x90, 0x8f, 0xe0, 0xf1, 0x39, 0xb4, 0xb5, 0x84, 0xaf, 0xbd, 0xa7, 0xa9, 0xa0, 0x91, 0x47, 0x74, 0x91, 0xb6, 0x5e, 0x42, 0xc4, 0x17, 0xd0, 0xee,
0x4e, 0xd1, 0xc8, 0x77, 0x10, 0x0d, 0xe3, 0x84, 0xb1, 0xb3, 0xc4, 0x88, 0x50, 0x8c, 0xc6, 0xa9, 0x0a, 0x7a, 0x81, 0x42, 0x32, 0x46, 0x2c, 0x4e, 0x15, 0x63, 0x7f, 0x85, 0x91, 0xa0, 0x14, 0x4d,
0x80, 0x2e, 0xc1, 0x53, 0x1c, 0x13, 0x3f, 0x0c, 0xe6, 0x0e, 0x68, 0xba, 0x61, 0xe8, 0x8e, 0x70, 0x33, 0x01, 0x53, 0x83, 0x2f, 0x70, 0x4a, 0x49, 0x1c, 0x2d, 0x14, 0xe8, 0xf8, 0x71, 0xec, 0x87,
0x87, 0xef, 0x06, 0x93, 0xf3, 0x0e, 0xf5, 0xc7, 0x98, 0x50, 0x34, 0x8e, 0x04, 0xa1, 0xfd, 0x43, 0xb8, 0x2f, 0x4e, 0xa3, 0xd9, 0xa4, 0xcf, 0xc8, 0x14, 0x53, 0x86, 0xa6, 0x89, 0x24, 0xf4, 0xde,
0x01, 0xd5, 0x43, 0xb3, 0xdb, 0xb7, 0x30, 0x89, 0xc2, 0x80, 0x60, 0x02, 0xbb, 0x40, 0x75, 0xf0, 0x82, 0xfa, 0xd1, 0x60, 0x68, 0x3b, 0x98, 0x26, 0x71, 0x44, 0x31, 0x85, 0xcf, 0x41, 0x63, 0x42,
0xc8, 0x9f, 0xe2, 0xd8, 0xa6, 0x17, 0x44, 0x53, 0x5a, 0xc5, 0x3d, 0x75, 0xbf, 0x6d, 0x48, 0xc5, 0x22, 0x14, 0x92, 0x4f, 0xd8, 0x1d, 0x85, 0xb1, 0xf7, 0xae, 0xf5, 0x57, 0xd7, 0x38, 0xac, 0x3d,
0x60, 0x97, 0x34, 0xd2, 0x84, 0x9e, 0xe0, 0x9e, 0x5e, 0x58, 0xc0, 0x49, 0x97, 0x04, 0x1e, 0x80, 0x38, 0xb0, 0xb4, 0x76, 0xf0, 0x6b, 0x5a, 0x59, 0xce, 0x53, 0x45, 0x1f, 0x70, 0xb6, 0x53, 0x9f,
0x0a, 0x0e, 0x1c, 0x7b, 0x30, 0x0a, 0x87, 0x9f, 0xb4, 0x07, 0x2d, 0x65, 0x4f, 0xdd, 0xdf, 0xbd, 0xe8, 0xc7, 0xde, 0x67, 0x03, 0x34, 0xce, 0xb3, 0x3b, 0x51, 0x3b, 0x9a, 0xc4, 0x70, 0x08, 0xea,
0x53, 0xe2, 0x4d, 0xe0, 0x98, 0x8c, 0x68, 0x95, 0x71, 0xb2, 0x82, 0x3d, 0xa0, 0x0e, 0xb0, 0xeb, 0xf9, 0x2d, 0x5d, 0x8a, 0x59, 0xcb, 0x10, 0x05, 0x4c, 0xbd, 0x80, 0xbc, 0x43, 0x9e, 0x78, 0x86,
0x07, 0x89, 0x42, 0x91, 0x2b, 0x3c, 0xb9, 0x53, 0xc1, 0x64, 0x5c, 0xa1, 0x01, 0x06, 0xd9, 0xba, 0x99, 0xb3, 0x75, 0xa1, 0x9d, 0xa0, 0x05, 0x76, 0x42, 0x44, 0x99, 0x1b, 0x60, 0xe2, 0x07, 0xcc,
0xfd, 0x55, 0x01, 0xb5, 0xb3, 0xb4, 0xa0, 0xa4, 0x1f, 0x9c, 0x87, 0xb0, 0x0b, 0xaa, 0x59, 0x89, 0xf5, 0x02, 0x14, 0xf9, 0x78, 0x2c, 0xbc, 0xae, 0x39, 0x7f, 0x73, 0xe8, 0x44, 0x20, 0x43, 0x09,
0x6d, 0x82, 0xa9, 0xa6, 0x70, 0x69, 0x5d, 0x96, 0x16, 0x05, 0xcc, 0x12, 0x4f, 0x30, 0xb5, 0xd6, 0xf4, 0xbe, 0x18, 0x60, 0x67, 0xc8, 0xdd, 0x46, 0x74, 0x46, 0x5f, 0x8a, 0x16, 0x0a, 0x33, 0x0e,
0xa7, 0xd2, 0x0e, 0x1a, 0x60, 0x73, 0x84, 0x08, 0xb5, 0x3d, 0xec, 0xbb, 0x1e, 0xb5, 0x87, 0x1e, 0xd8, 0xf6, 0xb2, 0xb0, 0x2b, 0x5b, 0xab, 0xfc, 0xfc, 0xb7, 0xea, 0x67, 0x49, 0x60, 0xb0, 0x7e,
0x0a, 0x5c, 0xec, 0xf0, 0x7b, 0x16, 0xad, 0x87, 0x0c, 0x3a, 0xe2, 0x48, 0x57, 0x00, 0xed, 0x6f, 0x75, 0xd3, 0x29, 0x39, 0x4d, 0x6f, 0x31, 0xfc, 0xdb, 0xde, 0x02, 0x50, 0x3e, 0x97, 0x6f, 0x07,
0x0a, 0xd8, 0xec, 0x32, 0x9f, 0x01, 0x99, 0x90, 0xf7, 0xfc, 0xfd, 0xb8, 0x19, 0x0b, 0x6c, 0x0c, 0x8f, 0x40, 0x35, 0x57, 0x53, 0x3e, 0xf6, 0x75, 0x1f, 0xea, 0x8d, 0x0b, 0x27, 0xca, 0x43, 0x91,
0xd3, 0xb0, 0x2d, 0xde, 0x35, 0xf1, 0xb3, 0xbb, 0xec, 0x67, 0x41, 0xc0, 0x5c, 0xb9, 0xba, 0x69, 0x05, 0xdb, 0xa0, 0x42, 0xe3, 0x09, 0x7b, 0x8f, 0x52, 0x2c, 0x4a, 0x56, 0x9d, 0xfc, 0xdc, 0xfb,
0x16, 0xac, 0xfa, 0x70, 0x3e, 0xfc, 0xcf, 0xde, 0x3c, 0x50, 0x3a, 0x13, 0x8d, 0x03, 0x0f, 0x41, 0xb1, 0x09, 0x36, 0xce, 0xf8, 0x28, 0xc3, 0xc7, 0xa0, 0xac, 0xb4, 0x54, 0x99, 0x5d, 0x6b, 0x79,
0x25, 0x53, 0x4b, 0x7c, 0xec, 0xc8, 0x3e, 0x92, 0x06, 0xcb, 0x9d, 0x24, 0x1e, 0xf2, 0x2c, 0xd8, 0xdc, 0x2d, 0x65, 0x4a, 0x95, 0xc8, 0xf8, 0xf0, 0x00, 0x54, 0xbc, 0x00, 0x91, 0xc8, 0x25, 0xf2,
0x00, 0x65, 0x12, 0x9e, 0xd3, 0xcf, 0x28, 0xc6, 0xfc, 0xc8, 0x8a, 0x95, 0xed, 0xdb, 0xbf, 0xd7, 0x4e, 0xd5, 0x41, 0x6d, 0x7e, 0xd3, 0x29, 0x0f, 0x79, 0xcc, 0x3e, 0x76, 0xca, 0x02, 0xb4, 0xc7,
0xc0, 0xea, 0x09, 0x9b, 0x23, 0xf8, 0x1a, 0x94, 0x12, 0xad, 0xe4, 0x98, 0x2d, 0x63, 0x71, 0xd6, 0xf0, 0x1e, 0x68, 0x90, 0x88, 0x30, 0x82, 0x42, 0xd5, 0x89, 0x56, 0x43, 0x74, 0xa0, 0xae, 0xa2,
0x8c, 0xc4, 0x54, 0x72, 0x44, 0xca, 0x87, 0xcf, 0x41, 0x79, 0xe8, 0x21, 0x3f, 0xb0, 0x7d, 0x71, 0xb2, 0x09, 0xf0, 0x3e, 0x10, 0x2d, 0x91, 0xc3, 0x96, 0x31, 0xd7, 0x04, 0xb3, 0xc9, 0x01, 0x31,
0xa7, 0x8a, 0xa9, 0xce, 0x6e, 0x9a, 0xa5, 0x2e, 0x8b, 0xf5, 0x7b, 0x56, 0x89, 0x83, 0x7d, 0x07, 0x47, 0x8a, 0xeb, 0x80, 0xba, 0xc6, 0x25, 0xe3, 0xd6, 0xfa, 0xaa, 0x77, 0xf9, 0x54, 0x22, 0xcb,
0x3e, 0x03, 0x35, 0x3f, 0xf0, 0xa9, 0x8f, 0x46, 0x49, 0x25, 0xb4, 0x1a, 0xaf, 0x40, 0x35, 0x89, 0x3e, 0x1e, 0xec, 0x70, 0xef, 0xf3, 0x9b, 0x4e, 0xed, 0x34, 0x93, 0xb2, 0x8f, 0x9d, 0x5a, 0xae,
0x8a, 0x22, 0xc0, 0x17, 0x80, 0x97, 0x44, 0xb4, 0x59, 0xca, 0x2c, 0x72, 0x66, 0x9d, 0x01, 0xbc, 0x6b, 0x8f, 0xe1, 0x29, 0x68, 0x6a, 0x9a, 0x7c, 0x3f, 0x5a, 0x1b, 0x42, 0xb5, 0x6d, 0xc9, 0xe5,
0x8f, 0x12, 0xae, 0x05, 0xaa, 0x12, 0xd7, 0x77, 0xb4, 0x95, 0x65, 0xef, 0xe2, 0xa9, 0x78, 0x56, 0xb1, 0xb2, 0xe5, 0xb1, 0x5e, 0x67, 0xcb, 0x33, 0xa8, 0x70, 0xd9, 0xcb, 0x6f, 0x1d, 0xc3, 0xa9,
0xbf, 0x67, 0x6e, 0x32, 0xef, 0xb3, 0x9b, 0xa6, 0x7a, 0x9c, 0x4a, 0xf5, 0x7b, 0x96, 0x9a, 0xe9, 0xe7, 0x5a, 0x1c, 0x85, 0xcf, 0x40, 0x33, 0xc2, 0x1f, 0x98, 0x9b, 0x0f, 0x2b, 0x6d, 0x6d, 0xde,
0xf6, 0x1d, 0x78, 0x0c, 0xea, 0x92, 0x26, 0x1b, 0x4e, 0x6d, 0x95, 0xab, 0x36, 0x0c, 0x31, 0xb9, 0x69, 0xbc, 0x1b, 0x3c, 0xad, 0xd8, 0x14, 0xf8, 0x04, 0x00, 0x4d, 0xa3, 0x7c, 0x27, 0x0d, 0x2d,
0x46, 0x3a, 0xb9, 0xc6, 0x69, 0x3a, 0xb9, 0x66, 0x99, 0xc9, 0x5e, 0xfe, 0x6c, 0x2a, 0x56, 0x35, 0x83, 0x1b, 0x11, 0xd7, 0xd2, 0x44, 0x2a, 0x77, 0x33, 0xc2, 0xd3, 0x34, 0x23, 0x43, 0x60, 0xea,
0xd3, 0x62, 0x28, 0x7c, 0x0b, 0xea, 0x01, 0xbe, 0xa0, 0x76, 0xd6, 0xac, 0x44, 0x5b, 0xbb, 0x57, 0xd3, 0x5c, 0xe8, 0xe5, 0x83, 0x5d, 0x15, 0x8f, 0xb5, 0x57, 0x0c, 0x76, 0x91, 0xad, 0x46, 0xfc,
0x7b, 0xd7, 0x58, 0x5a, 0x3e, 0x29, 0xf0, 0x00, 0x00, 0x49, 0xa3, 0x74, 0x2f, 0x0d, 0x29, 0x83, 0x97, 0x6b, 0x06, 0xfe, 0x70, 0xcd, 0x5e, 0x80, 0xff, 0x17, 0xd6, 0x6c, 0x49, 0x3f, 0xb7, 0x57,
0x19, 0xe1, 0xd7, 0x92, 0x44, 0xca, 0xf7, 0x33, 0xc2, 0xd2, 0x24, 0x23, 0x5d, 0xa0, 0xcb, 0xdd, 0x13, 0xf6, 0xba, 0xda, 0xde, 0x2d, 0x0a, 0x65, 0x1e, 0xb3, 0x41, 0x4c, 0x31, 0x9d, 0x85, 0x8c,
0x9c, 0xeb, 0x65, 0x8d, 0x5d, 0xe1, 0x8f, 0xb5, 0x9d, 0x37, 0x76, 0x9e, 0x9d, 0xb4, 0xf8, 0x5f, 0xba, 0x01, 0xa2, 0x41, 0x6b, 0xab, 0x6b, 0x1c, 0x6e, 0xc9, 0x41, 0x74, 0x64, 0xfc, 0x04, 0xd1,
0xc7, 0x0c, 0xfc, 0xe7, 0x98, 0xbd, 0x03, 0x4f, 0xe7, 0xc6, 0x6c, 0x41, 0x3f, 0xb3, 0xa7, 0x72, 0x00, 0xee, 0x82, 0x0a, 0x4a, 0x12, 0x49, 0xa9, 0x0b, 0x4a, 0x19, 0x25, 0x09, 0x87, 0x06, 0xaf,
0x7b, 0x2d, 0x69, 0xee, 0xe6, 0x85, 0x52, 0x8f, 0x69, 0x23, 0xc6, 0x98, 0x4c, 0x46, 0x94, 0xd8, 0xae, 0xe6, 0xa6, 0x71, 0x3d, 0x37, 0x8d, 0xef, 0x73, 0xd3, 0xb8, 0xbc, 0x35, 0x4b, 0xd7, 0xb7,
0x1e, 0x22, 0x9e, 0xb6, 0xde, 0x52, 0xf6, 0xd6, 0x45, 0x23, 0x5a, 0x22, 0x7e, 0x84, 0x88, 0x07, 0x66, 0xe9, 0xeb, 0xad, 0x59, 0x7a, 0xf3, 0xc8, 0x27, 0x2c, 0x98, 0x8d, 0x2c, 0x2f, 0x9e, 0xf6,
0xb7, 0x40, 0x19, 0x45, 0x91, 0xa0, 0x54, 0x39, 0xa5, 0x84, 0xa2, 0x88, 0x41, 0xe6, 0x87, 0xab, 0xf5, 0xbf, 0xf5, 0xe2, 0xa7, 0xfc, 0xb6, 0x2c, 0x7f, 0x95, 0x46, 0x9b, 0x22, 0xfe, 0xf0, 0x67,
0x99, 0xae, 0x5c, 0xcf, 0x74, 0xe5, 0xd7, 0x4c, 0x57, 0x2e, 0x6f, 0xf5, 0xc2, 0xf5, 0xad, 0x5e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x88, 0xe8, 0x4c, 0x4d, 0xb0, 0x06, 0x00, 0x00,
0xf8, 0x7e, 0xab, 0x17, 0x3e, 0xbe, 0x72, 0x7d, 0xea, 0x4d, 0x06, 0xc6, 0x30, 0x1c, 0x77, 0xe4,
0x3f, 0x25, 0x5f, 0x8a, 0x8f, 0x6d, 0xf1, 0x4b, 0x1c, 0xac, 0xf1, 0xf8, 0xcb, 0x3f, 0x01, 0x00,
0x00, 0xff, 0xff, 0xa5, 0x17, 0xac, 0x23, 0x2d, 0x07, 0x00, 0x00,
} }
func (m *ABCIResponses) Marshal() (dAtA []byte, err error) { func (m *ABCIResponses) Marshal() (dAtA []byte, err error) {
@@ -493,21 +474,9 @@ func (m *ABCIResponses) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i _ = i
var l int var l int
_ = l _ = l
if m.BeginBlock != nil { if m.FinalizeBlock != nil {
{ {
size, err := m.BeginBlock.MarshalToSizedBuffer(dAtA[:i]) size, err := m.FinalizeBlock.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintTypes(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
if m.EndBlock != nil {
{
size, err := m.EndBlock.MarshalToSizedBuffer(dAtA[:i])
if err != nil { if err != nil {
return 0, err return 0, err
} }
@@ -517,20 +486,6 @@ func (m *ABCIResponses) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x12 dAtA[i] = 0x12
} }
if len(m.DeliverTxs) > 0 {
for iNdEx := len(m.DeliverTxs) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.DeliverTxs[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintTypes(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
@@ -747,12 +702,12 @@ func (m *State) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x32 dAtA[i] = 0x32
} }
n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):]) n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastBlockTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastBlockTime):])
if err10 != nil { if err9 != nil {
return 0, err10 return 0, err9
} }
i -= n10 i -= n9
i = encodeVarintTypes(dAtA, i, uint64(n10)) i = encodeVarintTypes(dAtA, i, uint64(n9))
i-- i--
dAtA[i] = 0x2a dAtA[i] = 0x2a
{ {
@@ -807,18 +762,8 @@ func (m *ABCIResponses) Size() (n int) {
} }
var l int var l int
_ = l _ = l
if len(m.DeliverTxs) > 0 { if m.FinalizeBlock != nil {
for _, e := range m.DeliverTxs { l = m.FinalizeBlock.Size()
l = e.Size()
n += 1 + l + sovTypes(uint64(l))
}
}
if m.EndBlock != nil {
l = m.EndBlock.Size()
n += 1 + l + sovTypes(uint64(l))
}
if m.BeginBlock != nil {
l = m.BeginBlock.Size()
n += 1 + l + sovTypes(uint64(l)) n += 1 + l + sovTypes(uint64(l))
} }
return n return n
@@ -957,43 +902,9 @@ func (m *ABCIResponses) Unmarshal(dAtA []byte) error {
return fmt.Errorf("proto: ABCIResponses: illegal tag %d (wire type %d)", fieldNum, wire) return fmt.Errorf("proto: ABCIResponses: illegal tag %d (wire type %d)", fieldNum, wire)
} }
switch fieldNum { switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DeliverTxs", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.DeliverTxs = append(m.DeliverTxs, &types.ResponseDeliverTx{})
if err := m.DeliverTxs[len(m.DeliverTxs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2: case 2:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field EndBlock", wireType) return fmt.Errorf("proto: wrong wireType = %d for field FinalizeBlock", wireType)
} }
var msglen int var msglen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
@@ -1020,46 +931,10 @@ func (m *ABCIResponses) Unmarshal(dAtA []byte) error {
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
if m.EndBlock == nil { if m.FinalizeBlock == nil {
m.EndBlock = &types.ResponseEndBlock{} m.FinalizeBlock = &types.ResponseFinalizeBlock{}
} }
if err := m.EndBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { if err := m.FinalizeBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field BeginBlock", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowTypes
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthTypes
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthTypes
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.BeginBlock == nil {
m.BeginBlock = &types.ResponseBeginBlock{}
}
if err := m.BeginBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex

View File

@@ -15,9 +15,7 @@ import "google/protobuf/timestamp.proto";
// of the various ABCI calls during block processing. // of the various ABCI calls during block processing.
// It is persisted to disk for each height before calling Commit. // It is persisted to disk for each height before calling Commit.
message ABCIResponses { message ABCIResponses {
repeated tendermint.abci.ResponseDeliverTx deliver_txs = 1; tendermint.abci.ResponseFinalizeBlock finalize_block = 2;
tendermint.abci.ResponseEndBlock end_block = 2;
tendermint.abci.ResponseBeginBlock begin_block = 3;
} }
// ValidatorsInfo represents the latest validator set, or the last height it changed // ValidatorsInfo represents the latest validator set, or the last height it changed

View File

@@ -18,9 +18,7 @@ type AppConnConsensus interface {
InitChainSync(context.Context, types.RequestInitChain) (*types.ResponseInitChain, error) InitChainSync(context.Context, types.RequestInitChain) (*types.ResponseInitChain, error)
BeginBlockSync(context.Context, types.RequestBeginBlock) (*types.ResponseBeginBlock, error) FinalizeBlockSync(context.Context, types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error)
DeliverTxAsync(context.Context, types.RequestDeliverTx) (*abcicli.ReqRes, error)
EndBlockSync(context.Context, types.RequestEndBlock) (*types.ResponseEndBlock, error)
CommitSync(context.Context) (*types.ResponseCommit, error) CommitSync(context.Context) (*types.ResponseCommit, error)
} }
@@ -80,28 +78,14 @@ func (app *appConnConsensus) InitChainSync(
return app.appConn.InitChainSync(ctx, req) return app.appConn.InitChainSync(ctx, req)
} }
func (app *appConnConsensus) BeginBlockSync(
ctx context.Context,
req types.RequestBeginBlock,
) (*types.ResponseBeginBlock, error) {
return app.appConn.BeginBlockSync(ctx, req)
}
func (app *appConnConsensus) DeliverTxAsync(ctx context.Context, req types.RequestDeliverTx) (*abcicli.ReqRes, error) {
return app.appConn.DeliverTxAsync(ctx, req)
}
func (app *appConnConsensus) EndBlockSync(
ctx context.Context,
req types.RequestEndBlock,
) (*types.ResponseEndBlock, error) {
return app.appConn.EndBlockSync(ctx, req)
}
func (app *appConnConsensus) CommitSync(ctx context.Context) (*types.ResponseCommit, error) { func (app *appConnConsensus) CommitSync(ctx context.Context) (*types.ResponseCommit, error) {
return app.appConn.CommitSync(ctx) return app.appConn.CommitSync(ctx)
} }
func (app *appConnConsensus) FinalizeBlockSync(ctx context.Context, req types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
return app.appConn.FinalizeBlockSync(ctx, req)
}
//------------------------------------------------ //------------------------------------------------
// Implements AppConnMempool (subset of abcicli.Client) // Implements AppConnMempool (subset of abcicli.Client)

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks
@@ -17,29 +17,6 @@ type AppConnConsensus struct {
mock.Mock mock.Mock
} }
// BeginBlockSync provides a mock function with given fields: _a0, _a1
func (_m *AppConnConsensus) BeginBlockSync(_a0 context.Context, _a1 types.RequestBeginBlock) (*types.ResponseBeginBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseBeginBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestBeginBlock) *types.ResponseBeginBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseBeginBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestBeginBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// CommitSync provides a mock function with given fields: _a0 // CommitSync provides a mock function with given fields: _a0
func (_m *AppConnConsensus) CommitSync(_a0 context.Context) (*types.ResponseCommit, error) { func (_m *AppConnConsensus) CommitSync(_a0 context.Context) (*types.ResponseCommit, error) {
ret := _m.Called(_a0) ret := _m.Called(_a0)
@@ -63,52 +40,6 @@ func (_m *AppConnConsensus) CommitSync(_a0 context.Context) (*types.ResponseComm
return r0, r1 return r0, r1
} }
// DeliverTxAsync provides a mock function with given fields: _a0, _a1
func (_m *AppConnConsensus) DeliverTxAsync(_a0 context.Context, _a1 types.RequestDeliverTx) (*abcicli.ReqRes, error) {
ret := _m.Called(_a0, _a1)
var r0 *abcicli.ReqRes
if rf, ok := ret.Get(0).(func(context.Context, types.RequestDeliverTx) *abcicli.ReqRes); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*abcicli.ReqRes)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestDeliverTx) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// EndBlockSync provides a mock function with given fields: _a0, _a1
func (_m *AppConnConsensus) EndBlockSync(_a0 context.Context, _a1 types.RequestEndBlock) (*types.ResponseEndBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseEndBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestEndBlock) *types.ResponseEndBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseEndBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestEndBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// Error provides a mock function with given fields: // Error provides a mock function with given fields:
func (_m *AppConnConsensus) Error() error { func (_m *AppConnConsensus) Error() error {
ret := _m.Called() ret := _m.Called()
@@ -123,6 +54,29 @@ func (_m *AppConnConsensus) Error() error {
return r0 return r0
} }
// FinalizeBlockSync provides a mock function with given fields: _a0, _a1
func (_m *AppConnConsensus) FinalizeBlockSync(_a0 context.Context, _a1 types.RequestFinalizeBlock) (*types.ResponseFinalizeBlock, error) {
ret := _m.Called(_a0, _a1)
var r0 *types.ResponseFinalizeBlock
if rf, ok := ret.Get(0).(func(context.Context, types.RequestFinalizeBlock) *types.ResponseFinalizeBlock); ok {
r0 = rf(_a0, _a1)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*types.ResponseFinalizeBlock)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, types.RequestFinalizeBlock) error); ok {
r1 = rf(_a0, _a1)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// InitChainSync provides a mock function with given fields: _a0, _a1 // InitChainSync provides a mock function with given fields: _a0, _a1
func (_m *AppConnConsensus) InitChainSync(_a0 context.Context, _a1 types.RequestInitChain) (*types.ResponseInitChain, error) { func (_m *AppConnConsensus) InitChainSync(_a0 context.Context, _a1 types.RequestInitChain) (*types.ResponseInitChain, error) {
ret := _m.Called(_a0, _a1) ret := _m.Called(_a0, _a1)

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -55,7 +55,8 @@ func (a ABCIApp) BroadcastTxCommit(ctx context.Context, tx types.Tx) (*ctypes.Re
if res.CheckTx.IsErr() { if res.CheckTx.IsErr() {
return &res, nil return &res, nil
} }
res.DeliverTx = a.App.DeliverTx(abci.RequestDeliverTx{Tx: tx}) fb := a.App.FinalizeBlock(abci.RequestFinalizeBlock{Txs: [][]byte{tx}})
res.DeliverTx = *fb.Txs[0]
res.Height = -1 // TODO res.Height = -1 // TODO
return &res, nil return &res, nil
} }
@@ -64,7 +65,7 @@ func (a ABCIApp) BroadcastTxAsync(ctx context.Context, tx types.Tx) (*ctypes.Res
c := a.App.CheckTx(abci.RequestCheckTx{Tx: tx}) c := a.App.CheckTx(abci.RequestCheckTx{Tx: tx})
// and this gets written in a background thread... // and this gets written in a background thread...
if !c.IsErr() { if !c.IsErr() {
go func() { a.App.DeliverTx(abci.RequestDeliverTx{Tx: tx}) }() go func() { a.App.FinalizeBlock(abci.RequestFinalizeBlock{Txs: [][]byte{tx}}) }()
} }
return &ctypes.ResultBroadcastTx{ return &ctypes.ResultBroadcastTx{
Code: c.Code, Code: c.Code,
@@ -79,7 +80,7 @@ func (a ABCIApp) BroadcastTxSync(ctx context.Context, tx types.Tx) (*ctypes.Resu
c := a.App.CheckTx(abci.RequestCheckTx{Tx: tx}) c := a.App.CheckTx(abci.RequestCheckTx{Tx: tx})
// and this gets written in a background thread... // and this gets written in a background thread...
if !c.IsErr() { if !c.IsErr() {
go func() { a.App.DeliverTx(abci.RequestDeliverTx{Tx: tx}) }() go func() { a.App.FinalizeBlock(abci.RequestFinalizeBlock{Txs: [][]byte{tx}}) }()
} }
return &ctypes.ResultBroadcastTx{ return &ctypes.ResultBroadcastTx{
Code: c.Code, Code: c.Code,

View File

@@ -1,4 +1,4 @@
// Code generated by mockery 2.7.4. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -163,18 +163,17 @@ func (env *Environment) BlockResults(ctx *rpctypes.Context, heightPtr *int64) (*
} }
var totalGasUsed int64 var totalGasUsed int64
for _, tx := range results.GetDeliverTxs() { for _, tx := range results.FinalizeBlock.GetTxs() {
totalGasUsed += tx.GetGasUsed() totalGasUsed += tx.GetGasUsed()
} }
return &ctypes.ResultBlockResults{ return &ctypes.ResultBlockResults{
Height: height, Height: height,
TxsResults: results.DeliverTxs, TxsResults: results.FinalizeBlock.Txs,
TotalGasUsed: totalGasUsed, TotalGasUsed: totalGasUsed,
BeginBlockEvents: results.BeginBlock.Events, FinalizeBlockEvents: results.FinalizeBlock.Events,
EndBlockEvents: results.EndBlock.Events, ValidatorUpdates: results.FinalizeBlock.ValidatorUpdates,
ValidatorUpdates: results.EndBlock.ValidatorUpdates, ConsensusParamUpdates: results.FinalizeBlock.ConsensusParamUpdates,
ConsensusParamUpdates: results.EndBlock.ConsensusParamUpdates,
}, nil }, nil
} }

View File

@@ -71,13 +71,13 @@ func TestBlockchainInfo(t *testing.T) {
func TestBlockResults(t *testing.T) { func TestBlockResults(t *testing.T) {
results := &tmstate.ABCIResponses{ results := &tmstate.ABCIResponses{
DeliverTxs: []*abci.ResponseDeliverTx{ FinalizeBlock: &abci.ResponseFinalizeBlock{
{Code: 0, Data: []byte{0x01}, Log: "ok", GasUsed: 10}, Txs: []*abci.ResponseDeliverTx{
{Code: 0, Data: []byte{0x02}, Log: "ok", GasUsed: 5}, {Code: 0, Data: []byte{0x01}, Log: "ok", GasUsed: 10},
{Code: 1, Log: "not ok", GasUsed: 0}, {Code: 0, Data: []byte{0x02}, Log: "ok", GasUsed: 5},
{Code: 1, Log: "not ok", GasUsed: 0},
},
}, },
EndBlock: &abci.ResponseEndBlock{},
BeginBlock: &abci.ResponseBeginBlock{},
} }
env := &Environment{} env := &Environment{}
@@ -96,12 +96,11 @@ func TestBlockResults(t *testing.T) {
{101, true, nil}, {101, true, nil},
{100, false, &ctypes.ResultBlockResults{ {100, false, &ctypes.ResultBlockResults{
Height: 100, Height: 100,
TxsResults: results.DeliverTxs, TxsResults: results.FinalizeBlock.Txs,
TotalGasUsed: 15, TotalGasUsed: 15,
BeginBlockEvents: results.BeginBlock.Events, FinalizeBlockEvents: results.FinalizeBlock.Events,
EndBlockEvents: results.EndBlock.Events, ValidatorUpdates: results.FinalizeBlock.ValidatorUpdates,
ValidatorUpdates: results.EndBlock.ValidatorUpdates, ConsensusParamUpdates: results.FinalizeBlock.ConsensusParamUpdates,
ConsensusParamUpdates: results.EndBlock.ConsensusParamUpdates,
}}, }},
} }

View File

@@ -63,8 +63,7 @@ type ResultBlockResults struct {
Height int64 `json:"height"` Height int64 `json:"height"`
TxsResults []*abci.ResponseDeliverTx `json:"txs_results"` TxsResults []*abci.ResponseDeliverTx `json:"txs_results"`
TotalGasUsed int64 `json:"total_gas_used"` TotalGasUsed int64 `json:"total_gas_used"`
BeginBlockEvents []abci.Event `json:"begin_block_events"` FinalizeBlockEvents []abci.Event `json:"finalize_block_events"`
EndBlockEvents []abci.Event `json:"end_block_events"`
ValidatorUpdates []abci.ValidatorUpdate `json:"validator_updates"` ValidatorUpdates []abci.ValidatorUpdate `json:"validator_updates"`
ConsensusParamUpdates *tmproto.ConsensusParams `json:"consensus_param_updates"` ConsensusParamUpdates *tmproto.ConsensusParams `json:"consensus_param_updates"`
} }

View File

@@ -177,7 +177,7 @@ func (blockExec *BlockExecutor) ApplyBlock(
fail.Fail() // XXX fail.Fail() // XXX
// validate the validator updates and convert to tendermint types // validate the validator updates and convert to tendermint types
abciValUpdates := abciResponses.EndBlock.ValidatorUpdates abciValUpdates := abciResponses.FinalizeBlock.ValidatorUpdates
err = validateValidatorUpdates(abciValUpdates, state.ConsensusParams.Validator) err = validateValidatorUpdates(abciValUpdates, state.ConsensusParams.Validator)
if err != nil { if err != nil {
return state, fmt.Errorf("error in validator updates: %v", err) return state, fmt.Errorf("error in validator updates: %v", err)
@@ -198,7 +198,7 @@ func (blockExec *BlockExecutor) ApplyBlock(
} }
// Lock mempool, commit app state, update mempoool. // Lock mempool, commit app state, update mempoool.
appHash, retainHeight, err := blockExec.Commit(state, block, abciResponses.DeliverTxs) appHash, retainHeight, err := blockExec.Commit(state, block, abciResponses.FinalizeBlock.Txs)
if err != nil { if err != nil {
return state, fmt.Errorf("commit failed for application: %v", err) return state, fmt.Errorf("commit failed for application: %v", err)
} }
@@ -299,27 +299,29 @@ func execBlockOnProxyApp(
) (*tmstate.ABCIResponses, error) { ) (*tmstate.ABCIResponses, error) {
var validTxs, invalidTxs = 0, 0 var validTxs, invalidTxs = 0, 0
txIndex := 0
abciResponses := new(tmstate.ABCIResponses) abciResponses := new(tmstate.ABCIResponses)
abciResponses.FinalizeBlock = &abci.ResponseFinalizeBlock{}
dtxs := make([]*abci.ResponseDeliverTx, len(block.Txs)) dtxs := make([]*abci.ResponseDeliverTx, len(block.Txs))
abciResponses.DeliverTxs = dtxs abciResponses.FinalizeBlock.Txs = dtxs
// Execute transactions and get hash. // Execute transactions and get hash.
proxyCb := func(req *abci.Request, res *abci.Response) { proxyCb := func(req *abci.Request, res *abci.Response) {
if r, ok := res.Value.(*abci.Response_DeliverTx); ok { if r, ok := res.Value.(*abci.Response_FinalizeBlock); ok {
// TODO: make use of res.Log for i, tx := range r.FinalizeBlock.Txs {
// TODO: make use of this info
// Blocks may include invalid txs.
txRes := r.DeliverTx
if txRes.Code == abci.CodeTypeOK {
validTxs++
} else {
logger.Debug("invalid tx", "code", txRes.Code, "log", txRes.Log)
invalidTxs++
}
abciResponses.DeliverTxs[txIndex] = txRes // TODO: make use of res.Log
txIndex++ // TODO: make use of this info
// Blocks may include invalid txs.
txRes := tx
if txRes.Code == abci.CodeTypeOK {
validTxs++
} else {
logger.Debug("invalid tx", "code", txRes.Code, "log", txRes.Log)
invalidTxs++
}
abciResponses.FinalizeBlock.Txs[i] = txRes
}
} }
} }
proxyAppConn.SetResponseCallback(proxyCb) proxyAppConn.SetResponseCallback(proxyCb)
@@ -340,34 +342,17 @@ func execBlockOnProxyApp(
return nil, errors.New("nil header") return nil, errors.New("nil header")
} }
abciResponses.BeginBlock, err = proxyAppConn.BeginBlockSync( abciResponses.FinalizeBlock, err = proxyAppConn.FinalizeBlockSync(ctx, abci.RequestFinalizeBlock{
ctx, Hash: block.Hash(),
abci.RequestBeginBlock{ Header: *pbh,
Hash: block.Hash(), LastCommitInfo: commitInfo,
Header: *pbh, ByzantineValidators: byzVals,
LastCommitInfo: commitInfo, Txs: block.Txs.ToSliceOfBytes(),
ByzantineValidators: byzVals, })
},
)
if err != nil { if err != nil {
logger.Error("error in proxyAppConn.BeginBlock", "err", err) logger.Error("error in proxyAppConn.FinalizeBlock", "err", err)
return nil, err return nil, err
} }
// run txs of block
for _, tx := range block.Txs {
_, err = proxyAppConn.DeliverTxAsync(ctx, abci.RequestDeliverTx{Tx: tx})
if err != nil {
return nil, err
}
}
abciResponses.EndBlock, err = proxyAppConn.EndBlockSync(ctx, abci.RequestEndBlock{Height: block.Height})
if err != nil {
logger.Error("error in proxyAppConn.EndBlock", "err", err)
return nil, err
}
logger.Info("executed block", "height", block.Height, "num_valid_txs", validTxs, "num_invalid_txs", invalidTxs) logger.Info("executed block", "height", block.Height, "num_valid_txs", validTxs, "num_invalid_txs", invalidTxs)
return abciResponses, nil return abciResponses, nil
} }
@@ -467,9 +452,9 @@ func updateState(
// Update the params with the latest abciResponses. // Update the params with the latest abciResponses.
nextParams := state.ConsensusParams nextParams := state.ConsensusParams
lastHeightParamsChanged := state.LastHeightConsensusParamsChanged lastHeightParamsChanged := state.LastHeightConsensusParamsChanged
if abciResponses.EndBlock.ConsensusParamUpdates != nil { if abciResponses.FinalizeBlock.ConsensusParamUpdates != nil {
// NOTE: must not mutate s.ConsensusParams // NOTE: must not mutate s.ConsensusParams
nextParams = state.ConsensusParams.UpdateConsensusParams(abciResponses.EndBlock.ConsensusParamUpdates) nextParams = state.ConsensusParams.UpdateConsensusParams(abciResponses.FinalizeBlock.ConsensusParamUpdates)
err := nextParams.ValidateConsensusParams() err := nextParams.ValidateConsensusParams()
if err != nil { if err != nil {
return state, fmt.Errorf("error updating consensus params: %v", err) return state, fmt.Errorf("error updating consensus params: %v", err)
@@ -515,19 +500,17 @@ func fireEvents(
validatorUpdates []*types.Validator, validatorUpdates []*types.Validator,
) { ) {
if err := eventBus.PublishEventNewBlock(types.EventDataNewBlock{ if err := eventBus.PublishEventNewBlock(types.EventDataNewBlock{
Block: block, Block: block,
BlockID: blockID, BlockID: blockID,
ResultBeginBlock: *abciResponses.BeginBlock, ResultFinalizeBlock: *abciResponses.FinalizeBlock,
ResultEndBlock: *abciResponses.EndBlock,
}); err != nil { }); err != nil {
logger.Error("failed publishing new block", "err", err) logger.Error("failed publishing new block", "err", err)
} }
if err := eventBus.PublishEventNewBlockHeader(types.EventDataNewBlockHeader{ if err := eventBus.PublishEventNewBlockHeader(types.EventDataNewBlockHeader{
Header: block.Header, Header: block.Header,
NumTxs: int64(len(block.Txs)), NumTxs: int64(len(block.Txs)),
ResultBeginBlock: *abciResponses.BeginBlock, ResultFinalizeBlock: *abciResponses.FinalizeBlock,
ResultEndBlock: *abciResponses.EndBlock,
}); err != nil { }); err != nil {
logger.Error("failed publishing new block header", "err", err) logger.Error("failed publishing new block header", "err", err)
} }
@@ -543,14 +526,16 @@ func fireEvents(
} }
} }
for i, tx := range block.Data.Txs { if len(abciResponses.FinalizeBlock.Txs) != 0 {
if err := eventBus.PublishEventTx(types.EventDataTx{TxResult: abci.TxResult{ for i, tx := range block.Data.Txs {
Height: block.Height, if err := eventBus.PublishEventTx(types.EventDataTx{TxResult: abci.TxResult{
Index: uint32(i), Height: block.Height,
Tx: tx, Index: uint32(i),
Result: *(abciResponses.DeliverTxs[i]), Tx: tx,
}}); err != nil { Result: *(abciResponses.FinalizeBlock.Txs[i]),
logger.Error("failed publishing event TX", "err", err) }}); err != nil {
logger.Error("failed publishing event TX", "err", err)
}
} }
} }
@@ -584,7 +569,7 @@ func ExecCommitBlock(
// the BlockExecutor condition is using for the final block replay process. // the BlockExecutor condition is using for the final block replay process.
if be != nil { if be != nil {
abciValUpdates := abciResponses.EndBlock.ValidatorUpdates abciValUpdates := abciResponses.FinalizeBlock.ValidatorUpdates
err = validateValidatorUpdates(abciValUpdates, s.ConsensusParams.Validator) err = validateValidatorUpdates(abciValUpdates, s.ConsensusParams.Validator)
if err != nil { if err != nil {
logger.Error("err", err) logger.Error("err", err)

View File

@@ -141,8 +141,7 @@ func makeHeaderPartsResponsesValPubKeyChange(
block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit))
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{ValidatorUpdates: nil},
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil},
} }
// If the pubkey is new, remove the old and add the new. // If the pubkey is new, remove the old and add the new.
_, val := state.NextValidators.GetByIndex(0) _, val := state.NextValidators.GetByIndex(0)
@@ -155,7 +154,7 @@ func makeHeaderPartsResponsesValPubKeyChange(
if err != nil { if err != nil {
panic(err) panic(err)
} }
abciResponses.EndBlock = &abci.ResponseEndBlock{ abciResponses.FinalizeBlock = &abci.ResponseFinalizeBlock{
ValidatorUpdates: []abci.ValidatorUpdate{ ValidatorUpdates: []abci.ValidatorUpdate{
{PubKey: vPbPk, Power: 0}, {PubKey: vPbPk, Power: 0},
{PubKey: pbPk, Power: 10}, {PubKey: pbPk, Power: 10},
@@ -173,8 +172,7 @@ func makeHeaderPartsResponsesValPowerChange(
block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit))
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{ValidatorUpdates: nil},
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil},
} }
// If the pubkey is new, remove the old and add the new. // If the pubkey is new, remove the old and add the new.
@@ -184,7 +182,7 @@ func makeHeaderPartsResponsesValPowerChange(
if err != nil { if err != nil {
panic(err) panic(err)
} }
abciResponses.EndBlock = &abci.ResponseEndBlock{ abciResponses.FinalizeBlock = &abci.ResponseFinalizeBlock{
ValidatorUpdates: []abci.ValidatorUpdate{ ValidatorUpdates: []abci.ValidatorUpdate{
{PubKey: vPbPk, Power: power}, {PubKey: vPbPk, Power: power},
}, },
@@ -202,8 +200,7 @@ func makeHeaderPartsResponsesParams(
block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit))
pbParams := params.ToProto() pbParams := params.ToProto()
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{ConsensusParamUpdates: &pbParams},
EndBlock: &abci.ResponseEndBlock{ConsensusParamUpdates: &pbParams},
} }
return block.Header, types.BlockID{Hash: block.Hash(), PartSetHeader: types.PartSetHeader{}}, abciResponses return block.Header, types.BlockID{Hash: block.Hash(), PartSetHeader: types.PartSetHeader{}}, abciResponses
} }
@@ -274,22 +271,15 @@ func (app *testApp) Info(req abci.RequestInfo) (resInfo abci.ResponseInfo) {
return abci.ResponseInfo{} return abci.ResponseInfo{}
} }
func (app *testApp) BeginBlock(req abci.RequestBeginBlock) abci.ResponseBeginBlock { func (app *testApp) FinalizeBlock(req abci.RequestFinalizeBlock) abci.ResponseFinalizeBlock {
app.CommitVotes = req.LastCommitInfo.Votes app.CommitVotes = req.LastCommitInfo.Votes
app.ByzantineValidators = req.ByzantineValidators app.ByzantineValidators = req.ByzantineValidators
return abci.ResponseBeginBlock{} return abci.ResponseFinalizeBlock{
}
func (app *testApp) EndBlock(req abci.RequestEndBlock) abci.ResponseEndBlock {
return abci.ResponseEndBlock{
ValidatorUpdates: app.ValidatorUpdates, ValidatorUpdates: app.ValidatorUpdates,
ConsensusParamUpdates: &tmproto.ConsensusParams{ ConsensusParamUpdates: &tmproto.ConsensusParams{
Version: &tmproto.VersionParams{ Version: &tmproto.VersionParams{
AppVersion: 1}}} AppVersion: 1}},
} }
func (app *testApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx {
return abci.ResponseDeliverTx{Events: []abci.Event{}}
} }
func (app *testApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx { func (app *testApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {

View File

@@ -65,15 +65,10 @@ func (idx *BlockerIndexer) Index(bh types.EventDataNewBlockHeader) error {
} }
// 2. index BeginBlock events // 2. index BeginBlock events
if err := idx.indexEvents(batch, bh.ResultBeginBlock.Events, "begin_block", height); err != nil { if err := idx.indexEvents(batch, bh.ResultFinalizeBlock.Events, "begin_block", height); err != nil {
return fmt.Errorf("failed to index BeginBlock events: %w", err) return fmt.Errorf("failed to index BeginBlock events: %w", err)
} }
// 3. index EndBlock events
if err := idx.indexEvents(batch, bh.ResultEndBlock.Events, "end_block", height); err != nil {
return fmt.Errorf("failed to index EndBlock events: %w", err)
}
return batch.WriteSync() return batch.WriteSync()
} }

View File

@@ -2,7 +2,6 @@ package kv_test
import ( import (
"context" "context"
"fmt"
"testing" "testing"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@@ -19,7 +18,7 @@ func TestBlockIndexer(t *testing.T) {
require.NoError(t, indexer.Index(types.EventDataNewBlockHeader{ require.NoError(t, indexer.Index(types.EventDataNewBlockHeader{
Header: types.Header{Height: 1}, Header: types.Header{Height: 1},
ResultBeginBlock: abci.ResponseBeginBlock{ ResultFinalizeBlock: abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{ {
Type: "begin_event", Type: "begin_event",
@@ -33,34 +32,15 @@ func TestBlockIndexer(t *testing.T) {
}, },
}, },
}, },
ResultEndBlock: abci.ResponseEndBlock{
Events: []abci.Event{
{
Type: "end_event",
Attributes: []abci.EventAttribute{
{
Key: "foo",
Value: "100",
Index: true,
},
},
},
},
},
})) }))
for i := 2; i < 12; i++ { for i := 2; i < 12; i++ {
var index bool
if i%2 == 0 {
index = true
}
require.NoError(t, indexer.Index(types.EventDataNewBlockHeader{ require.NoError(t, indexer.Index(types.EventDataNewBlockHeader{
Header: types.Header{Height: int64(i)}, Header: types.Header{Height: int64(i)},
ResultBeginBlock: abci.ResponseBeginBlock{ ResultFinalizeBlock: abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{ {
Type: "begin_event", Type: "finalize_event",
Attributes: []abci.EventAttribute{ Attributes: []abci.EventAttribute{
{ {
Key: "proposer", Key: "proposer",
@@ -71,20 +51,6 @@ func TestBlockIndexer(t *testing.T) {
}, },
}, },
}, },
ResultEndBlock: abci.ResponseEndBlock{
Events: []abci.Event{
{
Type: "end_event",
Attributes: []abci.EventAttribute{
{
Key: "foo",
Value: fmt.Sprintf("%d", i),
Index: index,
},
},
},
},
},
})) }))
} }

View File

@@ -32,10 +32,10 @@ func TestBlockFuncs(t *testing.T) {
require.NoError(t, indexer.IndexBlockEvents(types.EventDataNewBlockHeader{ require.NoError(t, indexer.IndexBlockEvents(types.EventDataNewBlockHeader{
Header: types.Header{Height: 1}, Header: types.Header{Height: 1},
ResultBeginBlock: abci.ResponseBeginBlock{ ResultFinalizeBlock: abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{ {
Type: "begin_event", Type: "finalize_event",
Attributes: []abci.EventAttribute{ Attributes: []abci.EventAttribute{
{ {
Key: "proposer", Key: "proposer",
@@ -46,20 +46,6 @@ func TestBlockFuncs(t *testing.T) {
}, },
}, },
}, },
ResultEndBlock: abci.ResponseEndBlock{
Events: []abci.Event{
{
Type: "end_event",
Attributes: []abci.EventAttribute{
{
Key: "foo",
Value: "100",
Index: true,
},
},
},
},
},
})) }))
b, e := indexer.HasBlock(1) b, e := indexer.HasBlock(1)
@@ -67,17 +53,12 @@ func TestBlockFuncs(t *testing.T) {
assert.True(t, b) assert.True(t, b)
for i := 2; i < 12; i++ { for i := 2; i < 12; i++ {
var index bool
if i%2 == 0 {
index = true
}
require.NoError(t, indexer.IndexBlockEvents(types.EventDataNewBlockHeader{ require.NoError(t, indexer.IndexBlockEvents(types.EventDataNewBlockHeader{
Header: types.Header{Height: int64(i)}, Header: types.Header{Height: int64(i)},
ResultBeginBlock: abci.ResponseBeginBlock{ ResultFinalizeBlock: abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{ {
Type: "begin_event", Type: "finalize_event",
Attributes: []abci.EventAttribute{ Attributes: []abci.EventAttribute{
{ {
Key: "proposer", Key: "proposer",
@@ -88,20 +69,6 @@ func TestBlockFuncs(t *testing.T) {
}, },
}, },
}, },
ResultEndBlock: abci.ResponseEndBlock{
Events: []abci.Event{
{
Type: "end_event",
Attributes: []abci.EventAttribute{
{
Key: "foo",
Value: fmt.Sprintf("%d", i),
Index: index,
},
},
},
},
},
})) }))
} }

View File

@@ -59,16 +59,9 @@ func (es *EventSink) IndexBlockEvents(h types.EventDataNewBlockHeader) error {
sqlStmt = sqlStmt. sqlStmt = sqlStmt.
Values(types.BlockHeightKey, fmt.Sprint(h.Header.Height), h.Header.Height, "", ts, es.chainID) Values(types.BlockHeightKey, fmt.Sprint(h.Header.Height), h.Header.Height, "", ts, es.chainID)
// index begin_block events // index finalize_block events
sqlStmt, err := indexBlockEvents( sqlStmt, err := indexBlockEvents(
sqlStmt, h.ResultBeginBlock.Events, types.EventTypeBeginBlock, h.Header.Height, ts, es.chainID) sqlStmt, h.ResultFinalizeBlock.Events, types.EventTypeBeginBlock, h.Header.Height, ts, es.chainID)
if err != nil {
return err
}
// index end_block events
sqlStmt, err = indexBlockEvents(
sqlStmt, h.ResultEndBlock.Events, types.EventTypeEndBlock, h.Header.Height, ts, es.chainID)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -130,10 +130,10 @@ func TestStop(t *testing.T) {
func getTestBlockHeader() types.EventDataNewBlockHeader { func getTestBlockHeader() types.EventDataNewBlockHeader {
return types.EventDataNewBlockHeader{ return types.EventDataNewBlockHeader{
Header: types.Header{Height: 1}, Header: types.Header{Height: 1},
ResultBeginBlock: abci.ResponseBeginBlock{ ResultFinalizeBlock: abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{ {
Type: "begin_event", Type: "finalize_event",
Attributes: []abci.EventAttribute{ Attributes: []abci.EventAttribute{
{ {
Key: "proposer", Key: "proposer",
@@ -144,20 +144,6 @@ func getTestBlockHeader() types.EventDataNewBlockHeader {
}, },
}, },
}, },
ResultEndBlock: abci.ResponseEndBlock{
Events: []abci.Event{
{
Type: "end_event",
Attributes: []abci.EventAttribute{
{
Key: "foo",
Value: "100",
Index: true,
},
},
},
},
},
} }
} }

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks

View File

@@ -1,4 +1,4 @@
// Code generated by mockery v0.0.0-dev. DO NOT EDIT. // Code generated by mockery 2.9.0. DO NOT EDIT.
package mocks package mocks
@@ -95,48 +95,6 @@ func (_m *Store) LoadConsensusParams(_a0 int64) (types.ConsensusParams, error) {
return r0, r1 return r0, r1
} }
// LoadFromDBOrGenesisDoc provides a mock function with given fields: _a0
func (_m *Store) LoadFromDBOrGenesisDoc(_a0 *types.GenesisDoc) (state.State, error) {
ret := _m.Called(_a0)
var r0 state.State
if rf, ok := ret.Get(0).(func(*types.GenesisDoc) state.State); ok {
r0 = rf(_a0)
} else {
r0 = ret.Get(0).(state.State)
}
var r1 error
if rf, ok := ret.Get(1).(func(*types.GenesisDoc) error); ok {
r1 = rf(_a0)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// LoadFromDBOrGenesisFile provides a mock function with given fields: _a0
func (_m *Store) LoadFromDBOrGenesisFile(_a0 string) (state.State, error) {
ret := _m.Called(_a0)
var r0 state.State
if rf, ok := ret.Get(0).(func(string) state.State); ok {
r0 = rf(_a0)
} else {
r0 = ret.Get(0).(state.State)
}
var r1 error
if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(_a0)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// LoadValidators provides a mock function with given fields: _a0 // LoadValidators provides a mock function with given fields: _a0
func (_m *Store) LoadValidators(_a0 int64) (*types.ValidatorSet, error) { func (_m *Store) LoadValidators(_a0 int64) (*types.ValidatorSet, error) {
ret := _m.Called(_a0) ret := _m.Called(_a0)

View File

@@ -110,13 +110,13 @@ func TestABCIResponsesSaveLoad1(t *testing.T) {
abciResponses := new(tmstate.ABCIResponses) abciResponses := new(tmstate.ABCIResponses)
dtxs := make([]*abci.ResponseDeliverTx, 2) dtxs := make([]*abci.ResponseDeliverTx, 2)
abciResponses.DeliverTxs = dtxs abciResponses.FinalizeBlock.Txs = dtxs
abciResponses.DeliverTxs[0] = &abci.ResponseDeliverTx{Data: []byte("foo"), Events: nil} abciResponses.FinalizeBlock.Txs[0] = &abci.ResponseDeliverTx{Data: []byte("foo"), Events: nil}
abciResponses.DeliverTxs[1] = &abci.ResponseDeliverTx{Data: []byte("bar"), Log: "ok", Events: nil} abciResponses.FinalizeBlock.Txs[1] = &abci.ResponseDeliverTx{Data: []byte("bar"), Log: "ok", Events: nil}
pbpk, err := cryptoenc.PubKeyToProto(ed25519.GenPrivKey().PubKey()) pbpk, err := cryptoenc.PubKeyToProto(ed25519.GenPrivKey().PubKey())
require.NoError(t, err) require.NoError(t, err)
abciResponses.EndBlock = &abci.ResponseEndBlock{ValidatorUpdates: []abci.ValidatorUpdate{{PubKey: pbpk, Power: 10}}} abciResponses.FinalizeBlock = &abci.ResponseFinalizeBlock{ValidatorUpdates: []abci.ValidatorUpdate{{PubKey: pbpk, Power: 10}}}
err = stateStore.SaveABCIResponses(block.Height, abciResponses) err = stateStore.SaveABCIResponses(block.Height, abciResponses)
require.NoError(t, err) require.NoError(t, err)
@@ -191,9 +191,9 @@ func TestABCIResponsesSaveLoad2(t *testing.T) {
for i, tc := range cases { for i, tc := range cases {
h := int64(i + 1) // last block height, one below what we save h := int64(i + 1) // last block height, one below what we save
responses := &tmstate.ABCIResponses{ responses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
DeliverTxs: tc.added, Txs: tc.added,
EndBlock: &abci.ResponseEndBlock{}, },
} }
err := stateStore.SaveABCIResponses(h, responses) err := stateStore.SaveABCIResponses(h, responses)
require.NoError(t, err) require.NoError(t, err)
@@ -206,9 +206,9 @@ func TestABCIResponsesSaveLoad2(t *testing.T) {
if assert.NoError(err, "%d", i) { if assert.NoError(err, "%d", i) {
t.Log(res) t.Log(res)
responses := &tmstate.ABCIResponses{ responses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
DeliverTxs: tc.expected, Txs: tc.added,
EndBlock: &abci.ResponseEndBlock{}, },
} }
assert.Equal(sm.ABCIResponsesResultsHash(responses), sm.ABCIResponsesResultsHash(res), "%d", i) assert.Equal(sm.ABCIResponsesResultsHash(responses), sm.ABCIResponsesResultsHash(res), "%d", i)
} }
@@ -275,7 +275,7 @@ func TestOneValidatorChangesSaveLoad(t *testing.T) {
power++ power++
} }
header, blockID, responses := makeHeaderPartsResponsesValPowerChange(state, power) header, blockID, responses := makeHeaderPartsResponsesValPowerChange(state, power)
validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates) state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates)
require.NoError(t, err) require.NoError(t, err)
@@ -451,10 +451,11 @@ func TestProposerPriorityDoesNotGetResetToZero(t *testing.T) {
block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(state, state.LastBlockHeight+1, new(types.Commit))
blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
updatedState, err := sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates) updatedState, err := sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates)
assert.NoError(t, err) assert.NoError(t, err)
@@ -566,10 +567,11 @@ func TestProposerPriorityProposerAlternates(t *testing.T) {
blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
// no updates: // no updates:
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
updatedState, err := sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates) updatedState, err := sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates)
@@ -629,7 +631,7 @@ func TestProposerPriorityProposerAlternates(t *testing.T) {
updatedVal2, updatedVal2,
) )
validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
updatedState3, err := sm.UpdateState(updatedState2, blockID, &block.Header, abciResponses, validatorUpdates) updatedState3, err := sm.UpdateState(updatedState2, blockID, &block.Header, abciResponses, validatorUpdates)
@@ -669,10 +671,11 @@ func TestProposerPriorityProposerAlternates(t *testing.T) {
// -> proposers should alternate: // -> proposers should alternate:
oldState := updatedState3 oldState := updatedState3
abciResponses = &tmstate.ABCIResponses{ abciResponses = &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
oldState, err = sm.UpdateState(oldState, blockID, &block.Header, abciResponses, validatorUpdates) oldState, err = sm.UpdateState(oldState, blockID, &block.Header, abciResponses, validatorUpdates)
@@ -685,10 +688,11 @@ func TestProposerPriorityProposerAlternates(t *testing.T) {
for i := 0; i < 1000; i++ { for i := 0; i < 1000; i++ {
// no validator updates: // no validator updates:
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
updatedState, err := sm.UpdateState(oldState, blockID, &block.Header, abciResponses, validatorUpdates) updatedState, err := sm.UpdateState(oldState, blockID, &block.Header, abciResponses, validatorUpdates)
@@ -743,10 +747,11 @@ func TestLargeGenesisValidator(t *testing.T) {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
// no updates: // no updates:
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit))
@@ -775,8 +780,9 @@ func TestLargeGenesisValidator(t *testing.T) {
validatorUpdates, err := types.PB2TM.ValidatorUpdates([]abci.ValidatorUpdate{firstAddedVal}) validatorUpdates, err := types.PB2TM.ValidatorUpdates([]abci.ValidatorUpdate{firstAddedVal})
assert.NoError(t, err) assert.NoError(t, err)
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: []abci.ValidatorUpdate{firstAddedVal}}, ValidatorUpdates: []abci.ValidatorUpdate{firstAddedVal},
},
} }
block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit))
blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
@@ -787,10 +793,11 @@ func TestLargeGenesisValidator(t *testing.T) {
for i := 0; i < 200; i++ { for i := 0; i < 200; i++ {
// no updates: // no updates:
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
block := sf.MakeBlock(lastState, lastState.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(lastState, lastState.LastBlockHeight+1, new(types.Commit))
@@ -823,8 +830,9 @@ func TestLargeGenesisValidator(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: []abci.ValidatorUpdate{addedVal}}, ValidatorUpdates: []abci.ValidatorUpdate{addedVal},
},
} }
block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit))
blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID := types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
@@ -838,12 +846,13 @@ func TestLargeGenesisValidator(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
removeGenesisVal := abci.ValidatorUpdate{PubKey: gp, Power: 0} removeGenesisVal := abci.ValidatorUpdate{PubKey: gp, Power: 0}
abciResponses = &tmstate.ABCIResponses{ abciResponses = &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: []abci.ValidatorUpdate{removeGenesisVal}}, ValidatorUpdates: []abci.ValidatorUpdate{removeGenesisVal},
},
} }
block = sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit)) block = sf.MakeBlock(oldState, oldState.LastBlockHeight+1, new(types.Commit))
blockID = types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID = types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
updatedState, err = sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates) updatedState, err = sm.UpdateState(state, blockID, &block.Header, abciResponses, validatorUpdates)
require.NoError(t, err) require.NoError(t, err)
@@ -857,10 +866,11 @@ func TestLargeGenesisValidator(t *testing.T) {
isProposerUnchanged := true isProposerUnchanged := true
for isProposerUnchanged { for isProposerUnchanged {
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
block = sf.MakeBlock(curState, curState.LastBlockHeight+1, new(types.Commit)) block = sf.MakeBlock(curState, curState.LastBlockHeight+1, new(types.Commit))
blockID = types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()} blockID = types.BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(testPartSize).Header()}
@@ -881,10 +891,11 @@ func TestLargeGenesisValidator(t *testing.T) {
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
// no updates: // no updates:
abciResponses := &tmstate.ABCIResponses{ abciResponses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
EndBlock: &abci.ResponseEndBlock{ValidatorUpdates: nil}, ValidatorUpdates: nil,
},
} }
validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.EndBlock.ValidatorUpdates) validatorUpdates, err := types.PB2TM.ValidatorUpdates(abciResponses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
block := sf.MakeBlock(updatedState, updatedState.LastBlockHeight+1, new(types.Commit)) block := sf.MakeBlock(updatedState, updatedState.LastBlockHeight+1, new(types.Commit))
@@ -947,7 +958,7 @@ func TestManyValidatorChangesSaveLoad(t *testing.T) {
// Save state etc. // Save state etc.
var validatorUpdates []*types.Validator var validatorUpdates []*types.Validator
validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates) state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates)
require.Nil(t, err) require.Nil(t, err)
@@ -1024,7 +1035,7 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) {
cp = params[changeIndex] cp = params[changeIndex]
} }
header, blockID, responses := makeHeaderPartsResponsesParams(state, &cp) header, blockID, responses := makeHeaderPartsResponsesParams(state, &cp)
validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.EndBlock.ValidatorUpdates) validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.FinalizeBlock.ValidatorUpdates)
require.NoError(t, err) require.NoError(t, err)
state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates) state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates)

View File

@@ -401,7 +401,7 @@ func (store dbStore) reverseBatchDelete(batch dbm.Batch, start, end []byte) ([]b
// //
// See merkle.SimpleHashFromByteSlices // See merkle.SimpleHashFromByteSlices
func ABCIResponsesResultsHash(ar *tmstate.ABCIResponses) []byte { func ABCIResponsesResultsHash(ar *tmstate.ABCIResponses) []byte {
return types.NewResults(ar.DeliverTxs).Hash() return types.NewResults(ar.FinalizeBlock.Txs).Hash()
} }
// LoadABCIResponses loads the ABCIResponses for the given height from the // LoadABCIResponses loads the ABCIResponses for the given height from the
@@ -445,13 +445,13 @@ func (store dbStore) SaveABCIResponses(height int64, abciResponses *tmstate.ABCI
func (store dbStore) saveABCIResponses(height int64, abciResponses *tmstate.ABCIResponses) error { func (store dbStore) saveABCIResponses(height int64, abciResponses *tmstate.ABCIResponses) error {
var dtxs []*abci.ResponseDeliverTx var dtxs []*abci.ResponseDeliverTx
// strip nil values, // strip nil values,
for _, tx := range abciResponses.DeliverTxs { for _, tx := range abciResponses.FinalizeBlock.Txs {
if tx != nil { if tx != nil {
dtxs = append(dtxs, tx) dtxs = append(dtxs, tx)
} }
} }
abciResponses.DeliverTxs = dtxs abciResponses.FinalizeBlock.Txs = dtxs
bz, err := abciResponses.Marshal() bz, err := abciResponses.Marshal()
if err != nil { if err != nil {

View File

@@ -225,10 +225,12 @@ func TestPruneStates(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
err = stateStore.SaveABCIResponses(h, &tmstate.ABCIResponses{ err = stateStore.SaveABCIResponses(h, &tmstate.ABCIResponses{
DeliverTxs: []*abci.ResponseDeliverTx{ FinalizeBlock: &abci.ResponseFinalizeBlock{
{Data: []byte{1}}, Txs: []*abci.ResponseDeliverTx{
{Data: []byte{2}}, {Data: []byte{1}},
{Data: []byte{3}}, {Data: []byte{2}},
{Data: []byte{3}},
},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
@@ -287,17 +289,17 @@ func TestPruneStates(t *testing.T) {
func TestABCIResponsesResultsHash(t *testing.T) { func TestABCIResponsesResultsHash(t *testing.T) {
responses := &tmstate.ABCIResponses{ responses := &tmstate.ABCIResponses{
BeginBlock: &abci.ResponseBeginBlock{}, FinalizeBlock: &abci.ResponseFinalizeBlock{
DeliverTxs: []*abci.ResponseDeliverTx{ Txs: []*abci.ResponseDeliverTx{
{Code: 32, Data: []byte("Hello"), Log: "Huh?"}, {Code: 32, Data: []byte("Hello"), Log: "Huh?"},
},
}, },
EndBlock: &abci.ResponseEndBlock{},
} }
root := sm.ABCIResponsesResultsHash(responses) root := sm.ABCIResponsesResultsHash(responses)
// root should be Merkle tree root of DeliverTxs responses // root should be Merkle tree root of DeliverTxs responses
results := types.NewResults(responses.DeliverTxs) results := types.NewResults(responses.FinalizeBlock.Txs)
assert.Equal(t, root, results.Hash()) assert.Equal(t, root, results.Hash())
// test we can prove first DeliverTx // test we can prove first DeliverTx

View File

@@ -122,9 +122,9 @@ func (b *EventBus) Publish(eventValue string, eventData TMEventData) error {
func (b *EventBus) PublishEventNewBlock(data EventDataNewBlock) error { func (b *EventBus) PublishEventNewBlock(data EventDataNewBlock) error {
// no explicit deadline for publishing events // no explicit deadline for publishing events
ctx := context.Background() ctx := context.Background()
events := append(data.ResultBeginBlock.Events, data.ResultEndBlock.Events...)
// add Tendermint-reserved new block event events := data.ResultFinalizeBlock.Events
events = append(events, EventNewBlock) events = append(events, EventNewBlock)
return b.pubsub.PublishWithEvents(ctx, data, events) return b.pubsub.PublishWithEvents(ctx, data, events)
@@ -133,9 +133,9 @@ func (b *EventBus) PublishEventNewBlock(data EventDataNewBlock) error {
func (b *EventBus) PublishEventNewBlockHeader(data EventDataNewBlockHeader) error { func (b *EventBus) PublishEventNewBlockHeader(data EventDataNewBlockHeader) error {
// no explicit deadline for publishing events // no explicit deadline for publishing events
ctx := context.Background() ctx := context.Background()
events := append(data.ResultBeginBlock.Events, data.ResultEndBlock.Events...)
// add Tendermint-reserved new block header event events := data.ResultFinalizeBlock.Events
events = append(events, EventNewBlockHeader) events = append(events, EventNewBlockHeader)
return b.pubsub.PublishWithEvents(ctx, data, events) return b.pubsub.PublishWithEvents(ctx, data, events)

View File

@@ -76,17 +76,12 @@ func TestEventBusPublishEventNewBlock(t *testing.T) {
block := MakeBlock(0, []Tx{}, nil, []Evidence{}) block := MakeBlock(0, []Tx{}, nil, []Evidence{})
blockID := BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(BlockPartSizeBytes).Header()} blockID := BlockID{Hash: block.Hash(), PartSetHeader: block.MakePartSet(BlockPartSizeBytes).Header()}
resultBeginBlock := abci.ResponseBeginBlock{ resultFinalizeBlock := abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{Type: "testType", Attributes: []abci.EventAttribute{{Key: "baz", Value: "1"}}}, {Type: "testType", Attributes: []abci.EventAttribute{{Key: "baz", Value: "1"}}},
},
}
resultEndBlock := abci.ResponseEndBlock{
Events: []abci.Event{
{Type: "testType", Attributes: []abci.EventAttribute{{Key: "foz", Value: "2"}}}, {Type: "testType", Attributes: []abci.EventAttribute{{Key: "foz", Value: "2"}}},
}, },
} }
// PublishEventNewBlock adds the tm.event compositeKey, so the query below should work // PublishEventNewBlock adds the tm.event compositeKey, so the query below should work
query := "tm.event='NewBlock' AND testType.baz=1 AND testType.foz=2" query := "tm.event='NewBlock' AND testType.baz=1 AND testType.foz=2"
blocksSub, err := eventBus.Subscribe(context.Background(), "test", tmquery.MustParse(query)) blocksSub, err := eventBus.Subscribe(context.Background(), "test", tmquery.MustParse(query))
@@ -98,16 +93,14 @@ func TestEventBusPublishEventNewBlock(t *testing.T) {
edt := msg.Data().(EventDataNewBlock) edt := msg.Data().(EventDataNewBlock)
assert.Equal(t, block, edt.Block) assert.Equal(t, block, edt.Block)
assert.Equal(t, blockID, edt.BlockID) assert.Equal(t, blockID, edt.BlockID)
assert.Equal(t, resultBeginBlock, edt.ResultBeginBlock) assert.Equal(t, resultFinalizeBlock, edt.ResultFinalizeBlock)
assert.Equal(t, resultEndBlock, edt.ResultEndBlock)
close(done) close(done)
}() }()
err = eventBus.PublishEventNewBlock(EventDataNewBlock{ err = eventBus.PublishEventNewBlock(EventDataNewBlock{
Block: block, Block: block,
BlockID: blockID, BlockID: blockID,
ResultBeginBlock: resultBeginBlock, ResultFinalizeBlock: resultFinalizeBlock,
ResultEndBlock: resultEndBlock,
}) })
assert.NoError(t, err) assert.NoError(t, err)
@@ -237,17 +230,12 @@ func TestEventBusPublishEventNewBlockHeader(t *testing.T) {
}) })
block := MakeBlock(0, []Tx{}, nil, []Evidence{}) block := MakeBlock(0, []Tx{}, nil, []Evidence{})
resultBeginBlock := abci.ResponseBeginBlock{ resultFinalizeBlock := abci.ResponseFinalizeBlock{
Events: []abci.Event{ Events: []abci.Event{
{Type: "testType", Attributes: []abci.EventAttribute{{Key: "baz", Value: "1"}}}, {Type: "testType", Attributes: []abci.EventAttribute{{Key: "baz", Value: "1"}}},
},
}
resultEndBlock := abci.ResponseEndBlock{
Events: []abci.Event{
{Type: "testType", Attributes: []abci.EventAttribute{{Key: "foz", Value: "2"}}}, {Type: "testType", Attributes: []abci.EventAttribute{{Key: "foz", Value: "2"}}},
}, },
} }
// PublishEventNewBlockHeader adds the tm.event compositeKey, so the query below should work // PublishEventNewBlockHeader adds the tm.event compositeKey, so the query below should work
query := "tm.event='NewBlockHeader' AND testType.baz=1 AND testType.foz=2" query := "tm.event='NewBlockHeader' AND testType.baz=1 AND testType.foz=2"
headersSub, err := eventBus.Subscribe(context.Background(), "test", tmquery.MustParse(query)) headersSub, err := eventBus.Subscribe(context.Background(), "test", tmquery.MustParse(query))
@@ -258,15 +246,14 @@ func TestEventBusPublishEventNewBlockHeader(t *testing.T) {
msg := <-headersSub.Out() msg := <-headersSub.Out()
edt := msg.Data().(EventDataNewBlockHeader) edt := msg.Data().(EventDataNewBlockHeader)
assert.Equal(t, block.Header, edt.Header) assert.Equal(t, block.Header, edt.Header)
assert.Equal(t, resultBeginBlock, edt.ResultBeginBlock) assert.Equal(t, resultFinalizeBlock, edt.ResultFinalizeBlock)
assert.Equal(t, resultEndBlock, edt.ResultEndBlock)
close(done) close(done)
}() }()
err = eventBus.PublishEventNewBlockHeader(EventDataNewBlockHeader{ err = eventBus.PublishEventNewBlockHeader(EventDataNewBlockHeader{
Header: block.Header, Header: block.Header,
ResultBeginBlock: resultBeginBlock, ResultFinalizeBlock: resultFinalizeBlock,
ResultEndBlock: resultEndBlock,
}) })
assert.NoError(t, err) assert.NoError(t, err)

View File

@@ -109,16 +109,14 @@ type EventDataNewBlock struct {
Block *Block `json:"block"` Block *Block `json:"block"`
BlockID BlockID `json:"block_id"` BlockID BlockID `json:"block_id"`
ResultBeginBlock abci.ResponseBeginBlock `json:"result_begin_block"` ResultFinalizeBlock abci.ResponseFinalizeBlock `json:"result_finalize_block"`
ResultEndBlock abci.ResponseEndBlock `json:"result_end_block"`
} }
type EventDataNewBlockHeader struct { type EventDataNewBlockHeader struct {
Header Header `json:"header"` Header Header `json:"header"`
NumTxs int64 `json:"num_txs"` // Number of txs in a block NumTxs int64 `json:"num_txs"` // Number of txs in a block
ResultBeginBlock abci.ResponseBeginBlock `json:"result_begin_block"` ResultFinalizeBlock abci.ResponseFinalizeBlock `json:"result_finalize_block"`
ResultEndBlock abci.ResponseEndBlock `json:"result_end_block"`
} }
type EventDataNewEvidence struct { type EventDataNewEvidence struct {

View File

@@ -79,6 +79,17 @@ func (txs Txs) Proof(i int) TxProof {
} }
} }
// Convert []Txs to [][]Byte
// This method should become obsolete once Txs is switched to [][]byte,
// ref #2603
func (txs Txs) ToSliceOfBytes() [][]byte {
txBzs := make([][]byte, len(txs))
for i := 0; i < len(txs); i++ {
txBzs[i] = txs[i]
}
return txBzs
}
// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree. // TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree.
type TxProof struct { type TxProof struct {
RootHash tmbytes.HexBytes `json:"root_hash"` RootHash tmbytes.HexBytes `json:"root_hash"`