https://github.com/twiny/blockscan
a mini blockchain scanner
https://github.com/twiny/blockscan
blockchain blockchain-explorer golang microservices sqlite
Last synced: 5 months ago
JSON representation
a mini blockchain scanner
- Host: GitHub
- URL: https://github.com/twiny/blockscan
- Owner: twiny
- Created: 2022-10-13T08:26:24.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-10-13T08:46:25.000Z (over 3 years ago)
- Last Synced: 2024-06-20T02:13:23.577Z (over 1 year ago)
- Topics: blockchain, blockchain-explorer, golang, microservices, sqlite
- Language: Go
- Homepage:
- Size: 19.5 KB
- Stars: 8
- Watchers: 1
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Blockchain Explorer
mini blockchain explorer - composed of two services `Rest` & `Indexer`
### `Indexer`
Is the backend service for the chain explorer, it gets the details of a block along with the details of transactions in it then stores them in a DB.
### `Rest`
An HTTP server that read from a database and exposes public endpoints to view a range of block/transactions as well as statistics about the chain.
```
`GET /health` - health check endpoint
`GET /v1/index` - instruct Indexer to perform a scan
`GET /v1/block` - get latest block in db
`GET /v1/block/{id}` - get a specific block
`GET /v1/stats` - get stats total amount of transactions and all transaction hashes in DB.
`GET /v1/stats/{range}` - get stats for a range of blocks `start:end`
`GET /v1/tx` - get latest transaction id db.
`GET /v1/tx/{hash}` - get transaction by hash
```
#### `Indexer Store`
Persistence layer `StoreWriter` an interface expose below API.
```go
// StoreWriter
type StoreWriter interface {
Ping() error
HasScanned(ctx context.Context, id int64) bool
SaveBlock(ctx context.Context, block *chain.Block) error
SaveTx(ctx context.Context, tx *chain.Tx) error
}
```
#### `Rest Store`
`StoreReader` reads from a DB and an interface exposing these APIs.
```go
// StoreReader
type StoreReader interface {
Ping() error
//
GetLatestBlock(ctx context.Context) (*chain.Block, error)
GetBlock(ctx context.Context, n int64) (*chain.Block, error)
//
GetLatestTx(ctx context.Context) (*chain.Tx, error)
GetTx(ctx context.Context, hash string) (*chain.Tx, error)
//
GetStats(ctx context.Context, i, j int64) (*chain.Stats, error)
}
```
## Configuration
```yaml
# rest configuration
rest:
address: ":8080"
# indexer configuration
indexer:
address: ":8081"
host: "http://localhost"
token: "secret"
endpoint: "wss://mainnet.infura.io/ws/v3/{api_key}"
limiter:
rate: 3
duration: "1s"
workers: 5
timeout: "30s"
# store configuration
store:
path: "./tmp/"
```
## Run
rename file `config/example.config.yaml` to `config/config.yaml` and uodate config as per requirement.
Then, run `make inderxer` in one terminal to start the indexer service and run `make rest` in another terminal to start the rest service.
once both services are up
```
[rest service] 2022/10/02 19:50:05 starting http server on :8080
[indexer service] 2022/10/02 19:50:06 starting http server on :8081
```
Run in a 3rd terminal window, to instruct the indexer to start scanning the blockchain, from block 15661751 to the latest one.
```
curl -XGET -H "Content-type: application/json" 'http://localhost:8080/v1/index?scan=15661751'
```
A Success Response:
```
{"status":200,"payload":"indexer command executed"}
```
View Postman collection `postman/blockchain_explorer.postman_collection.json` for all `rest` service endpoints/APIs.
## TODO
- [ ] add more tests.
- [ ] add store mocks.
- [ ] -