Welcome to GoodChain, a blockchain platform designed for both beginners and experienced users, seeking simplicity and flexibility. Built with TypeScript
and LevelDB
, GoodChain offers a customizable environment for experimenting with consensus algorithms, including a default Simple Proof-of-Work (PoW) option.
GoodChain is a distributed ledger that enables secure and irreversible transactions across a peer-to-peer distributed network of nodes, ensuring the integrity of data.
- Pluggable Consensus: Experiment with your consensus algorithms or use the default PoW implementation
- RESTful API: Seamlessly integrate external systems with
GoodChain
's user-friendly API - Wallet Management: Efficiently manage digital wallets, track balances, and handle transactions
- Node Discovery and Synchronization: Discover and sync with other nodes in the network to maintain a consistent state across the blockchain
- Transaction Pool: Manage pending transactions with our built-in transaction pool
- Chain Validation: Verify the integrity of the blockchain by validating blocks and transactions
- EKVS:
Embeddable persistent key-value stores
are databases that can be embedded into your application. This meansno separate server
or process is needed to manage the database.LevelDB
is a popular example of anEKVS
.GoodChain
uses theLevel
library, aNode.js
wrapper forLevelDB
.
To embark on your GoodChain
adventure, simply clone the repository and install the dependencies:
# Clone the repository
git clone https://github.com/mlibre/GoodChain.git
cd GoodChain
# Install global dependencies
sudo npm install -g nodemon tsx typescript eslint vitest
# Install project dependencies
npm install
# Generate your miner keys for the first time
tsx src/test/generateKeys.ts
# Mine the very first block
tsx src/test/init.ts
# You may also run Node.js files directly
node dist/test/init.js
# Run the GoodChain node
npm run dev
Start the RESTful API
server:
npm run dev
# OR
npm start -- --host "https://localhost:3000" --nodes "https://localhost:3001" --dbPath "./assets/db/" --minerKeysFile "./assets/keys/miner.json" --name "GoodChain"
Run multiple nodes in the GoodChain network! Each node will have its own unique identity and contribute to the decentralized network. For example:
# Node 1
npm run 3000
# Node 2
npm run 3001
# Node 3
npm run 3002
Each node will have its own blockchain data, wallets, and nodes list, but they can communicate and synchronize with each other to maintain a consistent state.
GoodChain
provides a rich set of HTTP API endpoints for your blockchain interactions. Explore, experiment, and have fun building amazing applications!
Endpoint | Method | Description |
---|---|---|
/block |
GET | Retrieves information about a specific block or the latest block if no parameters are provided |
/block |
POST | Adds a new block to the blockchain |
/block/broadcast |
GET | Broadcasts the latest block to all nodes in the network |
/chain |
GET | Retrieves the entire blockchain |
/chain/update |
POST | Updates the local blockchain by fetching blocks from other nodes |
/mine |
GET | Mines a new block and adds it to the blockchain |
/node |
GET | Retrieves information about all nodes in the network |
/node |
POST | Adds a new node to the network |
/node/update |
POST | Updates the local node's knowledge of the network by fetching data from other nodes |
/node/broadcast |
GET | Introduces the local node to all other nodes in the network |
/transaction |
GET | Retrieves pending transactions |
/transaction |
POST | Adds a new transaction to the transaction pool |
/transaction/update |
GET | Updates the local transaction pool by fetching transactions from other nodes |
/transaction/sign |
POST | Signs a transaction with a private key |
/wallet |
GET | Retrieves information about wallets in the blockchain |
To ensure the reliability and correctness of the GoodChain
project, you can run tests.
Run the entire test suite using vitest
:
npm run test
# OR
vitest run
For an interactive testing experience, use the vitest
UI:
npm run test-ui
# OR
vitest --ui
To run a specific test file, for example, the blockchain tests:
npm run test src/test/blockchain.test.ts
Check out the Bruno collection in the assets
folder for a quick start with API requests. For further assistance, consider reaching out through our GitHub Issues page.
This project is licensed under the GNU General Public License.
The first version of GoodChain
was a simple blockchain implementation used to learn about blockchain technology. It used json
files to store the blockchain data. Check out the releases to see the code.
The second version of GoodChain
was built using Node.js
and Express.js
, and used git
to store the blockchain data. Check out the releases to see the code.
The third version of GoodChain
is built using TypeScript
, Express.js
, and LevelDB
.
If you find GoodChain
helpful and would like to support its development, you can donate ETH to the following address:
0xc9b64496986E7b6D4A68fDF69eF132A35e91838e