docs: enhance README with learning notes, tech stack, and author intro

This commit is contained in:
2026-08-19 20:15:28 +08:00
parent dce7693da7
commit 0086a41a02
+139 -3
View File
@@ -1,5 +1,141 @@
This is learning Smart Contract Built By Hoelee.
# ⚡ Ethers.js Simple Storage
https://www.hoelee.com
A hands-on learning project building, deploying, and interacting with a `SimpleStorage` smart contract using [ethers.js](https://docs.ethers.org/v5/) (v5) and the Solidity compiler (`solc`).
# crtl + shift + v To Preview This
This repo documents my first step from traditional Web2 development toward **Web3 / blockchain development** — writing Solidity, compiling it, and driving a contract on-chain *without* a heavyweight framework like Hardhat or Foundry. Just Node.js, `ethers.js`, and `solc`.
---
## 🧠 What I Learned
This project was built to learn the **fundamentals of smart-contract development**, one concept at a time:
- ✅ **Solidity basics** — state variables, `struct`, `array`, `mapping`, `function` visibility & purity (`public`, `view`).
- ✅ **Compiling Solidity manually** with `solc` to produce the ABI + bytecode (`.abi` & `.bin` files).
- ✅ **ethers.js Provider & Wallet** — connecting to an RPC endpoint and signing with a raw private key.
- ✅ **Deploying a contract** via a `ContractFactory` (ABI + bytecode + signer).
- ✅ **Reading & writing the blockchain** — calling a state-changing `store()` (sends a transaction, waits for confirmation) vs. reading with `retrieve()` (free, no gas).
- ✅ **Async JavaScript** — the `Promise` lifecycle (`pending` → `fulfilled` / `rejected`) that powers all on-chain interaction.
- ✅ **Environment variables (`dotenv`)** — keeping secrets out of the code.
- ✅ **Secure key handling** — `encryptKey.js` encrypts a private key into an encrypted JSON keystore (using `PRIVATE_KEY_PASSWORD`) for production-style deployment.
## 🛠️ Tech Stack
| Tool | Purpose |
|------|---------|
| [Solidity](https://soliditylang.org/) `0.8.7` | Smart contract language |
| [ethers.js](https://docs.ethers.org/v5/) `5.7.2` | Ethereum/blockchain library (Provider, Wallet, ContractFactory) |
| `solc` `0.8.7` | Solidity compiler (CLI) |
| `dotenv` | Environment variables / secrets |
| `fs-extra` | File system helpers (read ABI / bytecode, write keystore) |
| `prettier` + `prettier-plugin-solidity` | Code formatting |
## 📁 Project Structure
```
ethers-simple-storage/
├── SimpleStorage.sol # The smart contract
├── simpleStorage_*.abi / .bin # Compiled output (ABI + bytecode)
├── deploy.js # Compile → deploy → read/write on-chain
├── encryptKey.js # Encrypt a private key into a JSON keystore
├── package.json # Dependencies + scripts
└── .env # Local only (git-ignored): RPC_URL, PRIVATE_KEY
```
## 🚀 Getting Started
### 1. Install dependencies
```bash
yarn install
```
### 2. Set up environment variables
Create a `.env` file (git-ignored) at the project root:
```ini
RPC_URL=<your_ethereum_rpc_endpoint_here>
PRIVATE_KEY=<your_private_key_here> # TEST NETWORK ONLY
PRIVATE_KEY_PASSWORD=<your_keystore_password> # used by encryptKey.js
```
> ⚠️ **Security note:** never commit a real private key. Use a **test network** (e.g. Sepolia) or a local node (e.g. Ganache at `http://192.168.1.10:7545`). For production, prefer an encrypted keystore (see below).
### 3. Compile the contract
```bash
yarn compile
```
This runs `solcjs` and generates `SimpleStorage_sol_SimpleStorage.abi` and `.bin` in the project root.
### 4. Deploy & interact
```bash
node deploy.js
```
You'll see the contract address, the current favorite number, then the updated favorite number after calling `store(7)`.
### (Optional) Secure key storage
```bash
node encryptKey.js
```
Writes a password-encrypted keystore to `.encryptedKey.json` (git-ignored). Switch the commented-out code in `deploy.js` to use it instead of a raw private key.
---
## 💡 About the Contract — `SimpleStorage`
```solidity
contract SimpleStorage {
uint256 favoriteNumber;
struct People { uint256 favoriteNumber; string name; }
People[] public people;
mapping(string => uint256) public nameToFavoriteNumber;
function store(uint256 _favoriteNumber) public { ... } // write (costs gas)
function retrieve() public view returns (uint256) { ... } // read (free)
function addPerson(string memory _name, uint256 _favoriteNumber) public { ... } // write
}
```
- **`store()` / `retrieve()`** — a state variable you can write and read.
- **`addPerson()`** — demonstrates a `struct` pushed into a dynamic `array`, plus a `mapping` from name → favorite number (your first taste of more realistic on-chain data patterns).
## 🗺️ Roadmap / Next Steps
- [ ] Refactor to a production structure (separate compile / deploy scripts).
- [ ] Try a real framework like [Hardhat](https://hardhat.org/) or [Foundry](https://book.getfoundry.sh/) for testing & tooling.
- [ ] Add tests (e.g. with Foundry or Chai) to lock in contract behavior.
- [ ] Deploy to a real network and verify the contract on a block explorer.
---
## 👨💻 About the Author
Hello! I'm **Hoelee** — a hands-on developer and self-hoster based in Malaysia, currently making the leap from Web2 toward **Web3 / blockchain development**.
My Web2 background spans **PHP/CodeIgniter**, **Java/Spring**, **JavaScript/Node.js**, and WordPress (Kadence/Elementor) SME sites — and I run my own email hosting business at [SifuMail](https://sifumail.com) (my projects live at [hoelee.com](https://hoelee.com)).
I'm building real projects to learn, and I welcome comments, feedback, and contributions. This repo is part of my journey toward on-chain development, and I'm always happy to connect:
- 🌐 Portfolio: **https://hoelee.com**
- ✉️ Email: **[email protected]**
- 💬 WhatsApp: **012-797 2969**
> **💼 Open to remote opportunities** in Web3 / blockchain development (Solidity, ethers.js, Hardhat/Foundry, smart-contract security) and full-stack web. If you're hiring a self-taught, self-hosted developer who ships and learns fast — I'd love to talk.
---
## 📜 License
MIT — free to learn from, fork, and build on.
---
*Built for learning. Simple, honest, and incrementally improved — the same way I approach every new technology.*