diff --git a/pkg/core/blockchainer/blockchainer.go b/pkg/core/blockchainer/blockchainer.go
deleted file mode 100644
index ab1fec6d5..000000000
--- a/pkg/core/blockchainer/blockchainer.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package blockchainer
-
-import (
-	"math/big"
-
-	"github.com/nspcc-dev/neo-go/pkg/config"
-	"github.com/nspcc-dev/neo-go/pkg/core/block"
-	"github.com/nspcc-dev/neo-go/pkg/core/interop"
-	"github.com/nspcc-dev/neo-go/pkg/core/mempool"
-	"github.com/nspcc-dev/neo-go/pkg/core/state"
-	"github.com/nspcc-dev/neo-go/pkg/core/transaction"
-	"github.com/nspcc-dev/neo-go/pkg/crypto/hash"
-	"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
-	"github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger"
-	"github.com/nspcc-dev/neo-go/pkg/util"
-)
-
-// Blockchainer is an interface that abstracts the implementation
-// of the blockchain.
-type Blockchainer interface {
-	AddBlock(block *block.Block) error
-	BlockHeight() uint32
-	GetConfig() config.ProtocolConfiguration
-	CalculateClaimable(h util.Uint160, endHeight uint32) (*big.Int, error)
-	InitVerificationContext(ic *interop.Context, hash util.Uint160, witness *transaction.Witness) error
-	HeaderHeight() uint32
-	GetBlock(hash util.Uint256) (*block.Block, error)
-	GetCommittee() (keys.PublicKeys, error)
-	GetContractState(hash util.Uint160) *state.Contract
-	GetContractScriptHash(id int32) (util.Uint160, error)
-	GetEnrollments() ([]state.Validator, error)
-	GetGoverningTokenBalance(acc util.Uint160) (*big.Int, uint32)
-	ForEachNEP11Transfer(acc util.Uint160, newestTimestamp uint64, f func(*state.NEP11Transfer) (bool, error)) error
-	ForEachNEP17Transfer(acc util.Uint160, newestTimestamp uint64, f func(*state.NEP17Transfer) (bool, error)) error
-	GetHeaderHash(int) util.Uint256
-	GetHeader(hash util.Uint256) (*block.Header, error)
-	CurrentBlockHash() util.Uint256
-	GetAppExecResults(util.Uint256, trigger.Type) ([]state.AppExecResult, error)
-	GetNativeContractScriptHash(string) (util.Uint160, error)
-	GetNatives() []state.NativeContract
-	GetNextBlockValidators() ([]*keys.PublicKey, error)
-	GetNEP11Contracts() []util.Uint160
-	GetNEP17Contracts() []util.Uint160
-	GetTokenLastUpdated(acc util.Uint160) (map[int32]uint32, error)
-	GetNotaryContractScriptHash() util.Uint160
-	GetNotaryServiceFeePerKey() int64
-	GetValidators() ([]*keys.PublicKey, error)
-	GetStateModule() StateRoot
-	GetStorageItem(id int32, key []byte) state.StorageItem
-	GetTestVM(t trigger.Type, tx *transaction.Transaction, b *block.Block) *interop.Context
-	GetTestHistoricVM(t trigger.Type, tx *transaction.Transaction, b *block.Block) (*interop.Context, error)
-	GetTransaction(util.Uint256) (*transaction.Transaction, uint32, error)
-	mempool.Feer // fee interface
-	SubscribeForBlocks(ch chan<- *block.Block)
-	SubscribeForExecutions(ch chan<- *state.AppExecResult)
-	SubscribeForNotifications(ch chan<- *state.ContainedNotificationEvent)
-	SubscribeForTransactions(ch chan<- *transaction.Transaction)
-	VerifyTx(*transaction.Transaction) error
-	VerifyWitness(util.Uint160, hash.Hashable, *transaction.Witness, int64) (int64, error)
-	GetMemPool() *mempool.Pool
-	UnsubscribeFromBlocks(ch chan<- *block.Block)
-	UnsubscribeFromExecutions(ch chan<- *state.AppExecResult)
-	UnsubscribeFromNotifications(ch chan<- *state.ContainedNotificationEvent)
-	UnsubscribeFromTransactions(ch chan<- *transaction.Transaction)
-	// Policer.
-	GetBaseExecFee() int64
-	GetMaxVerificationGAS() int64
-	FeePerByte() int64
-}
diff --git a/pkg/services/rpcsrv/server.go b/pkg/services/rpcsrv/server.go
index c0ae35b69..3d09fbc73 100644
--- a/pkg/services/rpcsrv/server.go
+++ b/pkg/services/rpcsrv/server.go
@@ -29,6 +29,7 @@ import (
 	"github.com/nspcc-dev/neo-go/pkg/core/fee"
 	"github.com/nspcc-dev/neo-go/pkg/core/interop"
 	"github.com/nspcc-dev/neo-go/pkg/core/interop/iterator"
+	"github.com/nspcc-dev/neo-go/pkg/core/mempool"
 	"github.com/nspcc-dev/neo-go/pkg/core/mempoolevent"
 	"github.com/nspcc-dev/neo-go/pkg/core/mpt"
 	"github.com/nspcc-dev/neo-go/pkg/core/native"
@@ -57,10 +58,61 @@ import (
 )
 
 type (
+	// Ledger abstracts away the Blockchain as used by the RPC server.
+	Ledger interface {
+		AddBlock(block *block.Block) error
+		BlockHeight() uint32
+		CalculateClaimable(h util.Uint160, endHeight uint32) (*big.Int, error)
+		CurrentBlockHash() util.Uint256
+		FeePerByte() int64
+		ForEachNEP11Transfer(acc util.Uint160, newestTimestamp uint64, f func(*state.NEP11Transfer) (bool, error)) error
+		ForEachNEP17Transfer(acc util.Uint160, newestTimestamp uint64, f func(*state.NEP17Transfer) (bool, error)) error
+		GetAppExecResults(util.Uint256, trigger.Type) ([]state.AppExecResult, error)
+		GetBaseExecFee() int64
+		GetBlock(hash util.Uint256) (*block.Block, error)
+		GetCommittee() (keys.PublicKeys, error)
+		GetConfig() config.ProtocolConfiguration
+		GetContractScriptHash(id int32) (util.Uint160, error)
+		GetContractState(hash util.Uint160) *state.Contract
+		GetEnrollments() ([]state.Validator, error)
+		GetGoverningTokenBalance(acc util.Uint160) (*big.Int, uint32)
+		GetHeader(hash util.Uint256) (*block.Header, error)
+		GetHeaderHash(int) util.Uint256
+		GetMaxVerificationGAS() int64
+		GetMemPool() *mempool.Pool
+		GetNEP11Contracts() []util.Uint160
+		GetNEP17Contracts() []util.Uint160
+		GetNativeContractScriptHash(string) (util.Uint160, error)
+		GetNatives() []state.NativeContract
+		GetNextBlockValidators() ([]*keys.PublicKey, error)
+		GetNotaryContractScriptHash() util.Uint160
+		GetNotaryServiceFeePerKey() int64
+		GetStateModule() blockchainer.StateRoot
+		GetStorageItem(id int32, key []byte) state.StorageItem
+		GetTestHistoricVM(t trigger.Type, tx *transaction.Transaction, b *block.Block) (*interop.Context, error)
+		GetTestVM(t trigger.Type, tx *transaction.Transaction, b *block.Block) *interop.Context
+		GetTokenLastUpdated(acc util.Uint160) (map[int32]uint32, error)
+		GetTransaction(util.Uint256) (*transaction.Transaction, uint32, error)
+		GetValidators() ([]*keys.PublicKey, error)
+		HeaderHeight() uint32
+		InitVerificationContext(ic *interop.Context, hash util.Uint160, witness *transaction.Witness) error
+		SubscribeForBlocks(ch chan<- *block.Block)
+		SubscribeForExecutions(ch chan<- *state.AppExecResult)
+		SubscribeForNotifications(ch chan<- *state.ContainedNotificationEvent)
+		SubscribeForTransactions(ch chan<- *transaction.Transaction)
+		UnsubscribeFromBlocks(ch chan<- *block.Block)
+		UnsubscribeFromExecutions(ch chan<- *state.AppExecResult)
+		UnsubscribeFromNotifications(ch chan<- *state.ContainedNotificationEvent)
+		UnsubscribeFromTransactions(ch chan<- *transaction.Transaction)
+		VerifyTx(*transaction.Transaction) error
+		VerifyWitness(util.Uint160, hash.Hashable, *transaction.Witness, int64) (int64, error)
+		mempool.Feer // fee interface
+	}
+
 	// Server represents the JSON-RPC 2.0 server.
 	Server struct {
 		*http.Server
-		chain  blockchainer.Blockchainer
+		chain  Ledger
 		config config.RPC
 		// wsReadLimit represents web-socket message limit for a receiving side.
 		wsReadLimit      int64
@@ -196,7 +248,7 @@ var invalidBlockHeightError = func(index int, height int) *neorpc.Error {
 var upgrader = websocket.Upgrader{}
 
 // New creates a new Server struct.
-func New(chain blockchainer.Blockchainer, conf config.RPC, coreServer *network.Server,
+func New(chain Ledger, conf config.RPC, coreServer *network.Server,
 	orc *oracle.Oracle, log *zap.Logger, errChan chan error) Server {
 	httpServer := &http.Server{
 		Addr: conf.Address + ":" + strconv.FormatUint(uint64(conf.Port), 10),