Substrate入门课 Office Hour 演示项目。
本项目旨在介绍区块链基本原理,重点关注如何生成区块
和如何与其他节点达成共识
,会简化其他逻辑。
- 只有
转账
功能,不包含智能合约,也不包含Substrate相关内容 - 共识机制:
PoW
- 网络协议:使用
HTTP
模拟P2P - 存储:
文件
存储 - 账户管理:为了简化演示流程,
所有账户密码、地址、公私钥均存储在后端
,用户只持有account_id(UUID格式)。用户发送Tx(即Transaction)时不需要签署,节点在生成区块时自动签署。
src
├── database # 数据层
│ ├── block.rs # 区块相关
│ ├── genesis.rs # 区块链的初始状态
│ ├── mod.rs # 入口
│ ├── state.rs # 区块链的当前状态(所有账户的余额、Nonce,最新的区块,当前挖矿难度等)
│ └── tx.rs # Transaction相关
├── main.rs # 入口。命令行解析,执行对应的命令
├── node # TODO 生成区块、Peers管理、Peers间的共识、区块同步等
└── wallet # 钱包。账户管理、签名、验签
- clap: 命令行解析
cargo build
./target/debug/tinychain
./target/debug/tinychain new-account -h
./target/debug/tinychain run -h
- ethers-signers:账户管理
- ethers-core:只用到了Hash函数和Hash结果的类型
- once-cell:lazy static
- anyhow:错误处理
cargo build
./target/debug/tinychain new-account
演示账户说明:
Treasury
: "2bde5a91-6411-46ba-9173-c3e075d32100"Alice
: "3d211869-2505-4394-bd99-0c76eb761bf9"Bob
: "16d5e01e-709a-4536-a4f2-9f069070c51a"Miner
: "346b4cd8-10b6-47ba-a091-6a57bb1afcf9"
-
如果想定义
堆上
常量或运行时
才能确定值的常量,怎么办? -
如何优雅地处理错误?
cargo build
RUST_LOG=debug ./target/debug/tinychain run -m "346b4cd8-10b6-47ba-a091-6a57bb1afcf9"
-
builder模式(
node/mod.rs
) -
derive macro
派生宏怎么用?(几乎所有struct都用到了派生宏) -
如何从一个结构体实例中“拿走”一个字段的所有权?(
state.rs,block.rs
) -
Rust中如何使用
HashMap
?(state.rs
) -
slice的比较(
state.rs
) -
更精细的可见性控制(struct中的字段)
-
在iterator上执行
map/filter/take
等*操作(block.rs
) -
生命周期入门,思路同派生宏(
block.rs
)