区块链技术与应用 🔗
肖臻
区块链不可能三角: scalability, decentralization, security
技术分层 🔗
layer2: 应用层,合约层。
layer1: 底层区块链。激励层(发币和分配机制), 共识层(Pow, Pos, DPos),网络层(P2P), 数据层(Merkle 树,非对称加密)
layer0: 传输层。
BTC 🔗
proof of work: 做 hash 函数的蛮力运算来获取产生新区块的资格
出块时间 10min 左右。
coinmarketcap.com
<key=hash_value, value> 存在在 kv 数据库 leveldb 中。
ETH 以太坊 🔗
账户: 20 个字节。 在以太坊中的地址标识符是无法区分的
合约账户和外部账户的主要区别在于合约账户有关联的合约代码。
eth 的 eth_getCode 这个方法来判断代码哈希是否为空
交易,调用
费用 = gasUsed * gasPrice
EVM, Solidity, web3.js
《精通以太坊》 github.com/ethereumbook/ethereumbook
以太坊白皮书,黄皮书。
区块浏览器 etherscan.io
ghost 协议。
区块链中的树 🔗
Proof of Inclusion. 证明包含
一笔交易是否在链上。怎么证明? 如果交易存为数组,向轻节点提供完整的 array 才可以。 如果交易存为 map,也需要知道完整的。
merkle tree 是一种对 array 求 hash 的方法,把提供包含证明的复杂度降低了。
block:
block header (prev hash, Nonce, Root hash)
hash01 hash23
hash0 hash1 hash2 hash3
Txn0 Txn1 Txn2 Txn3
证明 Txn3 在区块链中: PoI(Txn3) = [(hash2, hash01), MerkleRoot, Index3]
Merkle Patricia Tree,根据 key 的前缀进行索引,对 map 算 hash。Radix tree, Trie。
挖矿 🔗
共识算法: Pow。 比特币和以太坊均采用。 为了避免 asci 芯片挖矿,以太坊加入 ethash 增加内存访问。
sol 语言 🔗
运用在 EVM 上,
contract 中的 mapping 不支持遍历, 用数组记录 map 中的 key 集合。
支持去中心化的合约(smart contract)。
proof of stake: 权益证明。
NPos:提名者通过质押投票产生提名池, 在提名池中产生验证者且均分奖励,验证者根据质押比例分配奖励。
公链开发的教程大纲 🔗
learnblockchain.cn/maps/Web3 制作的图谱
公链
- bitcoin
- 以太坊
- 以太坊的 layer2 方案
- 数据可用层,去中心化排序器,Rollup 模块(op rollup, zk rollup),op 的欺诈证明,零知识证明
- cosmos 解决链之间的互操作性和扩展性
- solana
- aptos,Sui 高性能的区块链平台,move 语言作为合约开发。
公链基础知识: 区块,交易,默克尔树,区块头,公钥加密算法,共识算法,智能合约,状态树,虚拟机,去中心化网络。
共识算法: pow,pos,poh(solana)
密码学: 零知识证明。 算法(Kzg, Groth16, Sonic, Fractal, Halo2, SuperSonic, Marlin, Plonk, Stark, SNARK)
数据库: leveldb, rocksdb, mongodb
以太坊: ethereum RPC 服务节点搭建, 使用的签名算法,各套带前缀 RPC 接口的作用,底层数据结构和算法, EVM 原理和 op-code, 区块重组和回滚机制, 重要的 EIP 协议分析,分片链 EIP4844 的原理和实现。
以太坊 layer2: 主流项目分析.
- Arbitrum Nitro, 架构解析,如何本地启动 Nitro devnet 网络, Rollup 流程
- Optimistim,Op-stack 结构解析,Op-stack 跨链调用过程,erc20 的充提过程, Rollup 流程,
- PolygonZkEVM
Rollup 模块: 数据 rollup, 证明 rollup Sequencer: 基于 geth 改进的适配 l2 的 EVM 客户端 证明和验证系统: zk proof(链下 zk prove 生成证明,链上 verifier 合约验证) 和 fraud proof()。
区块链钱包 🔗
银行卡是由中心化的银行发放和进行资产管理,用户密码丢失可以让银行找回。
区块链钱包是密钥的管理工具,包含成对的公私钥。
区块链钱包的教程大纲 🔗
为什么有不同类别的钱包? 私钥的管理方式不同导致的类别
-
中心化钱包,例如交易所钱包(充值,提现,归集,热转冷,冷转热,链路风控)
-
去中心钱包,私钥一般管理在用户的设备上,例如 TP,ImToken, MetaMask
- 一般都是确定性分层钱包: 先生成助记词,导出主私钥,主私钥扩展子私钥和公钥的方式,公钥再导出地址。
-
硬件钱包,私钥在离线的硬件设备上,例如 leger,onekey
-
确定性分层钱包(去中心化钱包,硬件钱包):使用 BIP 协议族开发的钱包,例如 TP,ImToken,MetaMask
-
多签钱包: EVM 链一般使用 gnosis safe 多签
-
托管钱包: MPC 算法,每个节点有一个密钥片, 算法 GG8,GG20。
-
社交恢复钱包: 密钥分片备份,守护者恢复
-
EVM 链的 AA 钱包: ERC4337 协议独有特性
私钥,公钥,地址,签名,助记词 🔗
在椭圆双曲线(伽罗瓦有限域)上指定生成点G和私钥数字k, K=k*G 多次加法操作生成公钥点K。
已知K,G时极其困难推出私钥k。
公钥点 -- hash -> 钱包地址。
签名: 证明私钥持有者同意交易内容。
助记词, BIP39, 助记词 + salt --BIP39--》 seed 种子 --BIP32--> 生成多层的私钥。 BIP44.
以太坊的 P2P 网络 🔗
P2P 的点对点的传播是区块链的底层传输方式。
- 节点之间互相广播用于节点发现的 udp 网络
- 节点之间互相连接用于传输数据的 tcp 网络
节点 NodeID 经过 hash 计算后的 256 个 byte 做 xor 比较数理上的距离(不是物理距离)
func (net *Network) loop() {
...
for {
select {
case pkt := <-net.read:
// 处理收到的 udp 消息
case timeout := <-net.timeout:
// 发送的 udp ping 消息超时未收到 pong 应答
case q := <-net.queryReq:
// 从table中查找距离某个target最近的n个节点
case f := <-net.tableOpReq:
// 操作table, 这个case主要是为了防止table被异步操作
case <-refreshTimer.C:
// 计时器到点,刷新table里的url
...
}
}
...
}
web3 🔗
DeFi (Decentralised Finance), MakerDao, AAVE, Compound, RWA。 主流质押协议。 去中心化交易所 dex。
DAO 去中心的组织。去中心化、自治、公开透明。例如比特币可以看作是一个 DAO。 DID 去中心化身份。
中心化交易所的业务: 现货,合约,做市商, OTC,量化。
ipfs
solidity 🔗
EVM 可以获取和存储数据的 6 个地方: (memory, storage, calldata)(data location 只能描述 array, struct, map), stack, code, logs.
从源码开始生产 solc 🔗
可能遇到的问题 🔗
系统里缺少Boost库。 需要指明Boost_INCLUDE_DIR。
➜ build git:(develop) cmake ..
-- The C compiler identification is AppleClang 15.0.0.15000309
-- The CXX compiler identification is AppleClang 15.0.0.15000309
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /opt/homebrew/Cellar/cmake/3.24.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Boost (missing: Boost_INCLUDE_DIR filesystem
unit_test_framework program_options system) (Required is at least version
"1.65.0")
Call Stack (most recent call first):
/opt/homebrew/Cellar/cmake/3.24.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
/opt/homebrew/Cellar/cmake/3.24.2/share/cmake/Modules/FindBoost.cmake:2376 (find_package_handle_standard_args)
cmake/EthDependencies.cmake:40 (find_package)
CMakeLists.txt:51 (include)
mac 上通过brew install boost
独有的语言特性 🔗
- 修饰器
modifier去给函数加限制。modifier onlyOwner { require(msg.sender == over, "not contract owner"); _;} - 事件
Event产生日志 log。 - 函数的参数为 struct,map, array 类型时需要加修饰符 memory or calldata。
- override, virtual
receive,fallback . msg.data is empty?
solidity compiler (solc 编译器) 🔗
x.sol --solc --> (ABI + 字节码) --web3.js --> 部署到网络中。
编译器源码地址:。
合约审计工具 🔗
slither
合约事件监听器 🔗
the graph
公链技术 🔗
Ethereum, Hyperledger 联盟链。
性能扩展: Conflux, Eth2.0 分片,Plasma 侧链, 跨链 Polkadot
Polygon 🔗
扩容的目的: 提升交易速度和交易吞吐量,而不影响去中心化和安全性 Polygon 是以太坊 layer2 扩容的主要解决方案。 zk rollup, Optimistic Rollups.
- on-chain, layer1 扩容
- 共识算法,中心化换性能, avalanche, solana
- 分片, 并行计算, eth2.0, Near
- off-chain, layer2 扩容, 链下计算,结果上链
- 各种扩容方案的区别在与 保证 State Validity 状态的正确性(SV) 和 Data Availablity 数据的可用性(DA)的方式不同。
- SV 作恶
- 如何保证 layer2 state 的正确的? zk proof, Fraud Proof, PoA 多签, Light client?
- 防止 layer2 的无效状态回传到主链
- DA 跑路
- 如何保证 layer2 state 的持久化, 存去中心化的 layer1?存中心化的 layer2?
- RollUp
- DA 上, layer2 的数据压缩后传到 layer1, 由 layer1 保证 DA
- SV 上, zk rollup() 兼容 EVM 不太好,zkEVM 需要开发;和 optimistic rollup(op,arbitrum)较好兼容 EVM, Fraud proof 保证,定期同步状态。
uniswap 🔗
DEX 赛道的头部协议,uniswap 是基于以太坊的去中心话交易协议,通过智能合约自动执行代币互换。
sushiswap, curve, Balancer
订单薄,自动做市商。
v1 🔗
恒定乘积曲线,引导 AMM 机制走向主流。
v2 🔗
sushiswap 的竞争。
v3 🔗
量化交易 🔗
- 跨平台搬砖
- 趋势交易
- 对冲
区块链资产场外交易(OTC 交易):不通过撮合成交,自己寻找交易。
合约 futures 现货 spot 杠杆 margin 🔗
杠杆不同: 现货 1 倍,合约 100 倍,杠杆 10 倍。
合约: 利用杠杆放大收益的金融工具。投入的本金作为仓位保证金,当仓位亏完时,就爆仓(强制平仓)。
NFT & GameFi & Metaverse 🔗
NFT 是遵循 ERC721 协议发行的代币。
NFT 起源于以太坊的智能合约, 在 EIP-721 中被提出, 在 EIP-1155 被改进。
NFT 发行的主流公链:eth, Polygon, BSC, SOL 等。 ETH 主流, NFT 代币标准 ERC721, ERC1155。
EOS, KOL
awesome-blockchain-rust 🔗
使用 rust 开发的 solana 与以太坊等区块链不同的公链。
Polkadot 跨链。
零知识证明 🔗
匿名币 Zcash
knowledge -> vector -> 多项式 🔗
zk-snark 多项式的零知识证明 🔗
程序计算 -> 算数电路 -> R1CS -> 多项式 -> 证明多项式
Proving Key, Verifying Key
程序到多项式的构造 🔗
数学表达 🔗
拉格朗日插值 🔗
通过点值对构造多项式。
$$ f_1(x) = \frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)} $$
f(x)在 x1 处,等于 y1,其他 x 处均为 0。
$$ f(x) = \sum_{i=1}^{n}y_i f_i(x) $$
钱包 🔗
HD(分层确定性钱包)wallet 的基础是 BIP32/BIP39/BIP44(BIP 协议族) 这三个协议。
图
BIP32: 一个助记词/种子,可以生成一个树形的结构
BIP39: 一个助记词-》关联确定性种子,种子生成确定性私钥
BIP44: 扩展 BIP32。多币种的基础,一个种子可以生成多个账户,每个账户有自己的地址空间,用户可以同一个钱包管理多种资产
得到助记词: 生成 128-256 位的一个随机数,通过 sha256 生成一个校验和+随机数长度/32,切割字符串为 11 段,从 2048 个字符数组中,选择助记词 得到私钥: 助记词+随机数-〉通过 PBKDF2 生成私钥, 这里因为 BIP39 协议所以固定助记词的私钥固定 得到公钥: 通过私钥*ecc 中的曲线上的一个点,生成一个公钥,这里曲线的点是一个固定的点,所以不会生成多个公钥
如何生成一个钱包, 助记词, 私钥,公钥。
钱包开发者: 扫块入账,交易回滚, 离线签名, L1 L2 跨链, BIP 钱包协议族。 Uniswap。 github《区块链钱包技术指南》 爬块服务。 用户,资产,交易,NFT, social = socialfi。
交易所充提币的解析, 热钱包地址,归集地址。
好项目 🔗
eth 上的 uniswap, bsc 上的 pancakeswap
最近发展 🔗
性能扩展 🔗
区块大小扩大,出块时间,扩容,隔离见证,树图,conflux
layer2 op rollup 的代表: optimism, arbitrum。 arbitrum 的 arb 排序器, 验证节点,争议解决,锁仓 7 天。
侧链: polygon, BNB chain。
layer2 zk-rollup 的代表:Linea, zksync, Scroll(zkstark)
性能: avalanche, solana
隐私匿名 🔗
门罗币,zk_sync,环形签名,交易隐私性,混币
跨链 🔗
多链: polkadot, Cosmos, Avalanche
铭文 🔗
Ordinals 协议为 BTC 的聪进行编码,也可把数据植入到聪。 Sats 币。
ordinals (2022.12) btc 生态上的 NFT, BRC-20(2023.03)铭文, Runes 符文(2024.04.20)
move 语言的生态链 🔗
sui, aptos。
ton 🔗
不看好区块链技术的观点 🔗
构造去中心化,获得公平和信任,牺牲了效率。
BTC 还是掌握在少部分人手里。
工作 jd 上的要求 🔗
前端 js,ts 🔗
因为智能合约开发框架 hardhat,使用了前端测试框架 Mocha,断言库 Chai
npx mocha a.test.js
nextjs.org/docs React
yarn create next-app .
yarn run dev -> localhost:3000
yarn add --dev hardhat yarn hardhat
公链开发 🔗
rust, go. 区块链底层,公链的架构, 底层协议,共识算法, 智能合约, 加密算法, p2p 网络
EVM = 执行引擎, 状态数据库, 高效状态树,P2P, 去中心化 sequencer 协议。
EIP 1559 交易费,拥堵。
zk 研发工程师 🔗
c++, rust, go. zk-snarks, zk-starks, ethereum, bitcoin. zkEVM 经验, 熟悉 GPU, asic, 有 cuda, openCL 经验。
- 智能合约编程语言 solidity
- 智能合约库 openzeppelin
- 智能合约开发框架(不推荐 remix) Hardhat, truffle
- js 开发的 npm 包。
- 全栈框架 Nextjs
- CSS 框架 Tailwindcss
- 智能合约交互库 Ethersjs
- 智能合约交互库 React Hooks, Wagmi
- 去中心化存储 IPFS, 固定服务 Pinata
cosmos 区块链开发 🔗
负责基于 Evmos(Cosmos SDK)公链开发。
资格: 拥有使用 cosmos sdk 开发区块链的经验, 有 EVM 的经验,掌握 solidity 语言,在 evm 链上部署合约。 参与过开源项目(ethereum, cosmos, optimism), zkSNARKS or zkSTARKS 的使用经验。
- 区块链基础
- 分布式账本,共识机制
- 最小链系统设计
- 数据层: Merkle Tree(验证数据的完整性,一致性), Merkle DAG, Merkle Patricia Trie(MPT), 账户管理(BTC 的 UTXO, cell 模型,以太坊 Account 模型,EOA, SCA), 世界状态
- 结点,区块(区块头,区块体),交易
- 执行层:交易结构,交易池,执行引擎
- 网络层: Peer 2Peer 对等网络通讯,P2P 覆盖网络(Gossip, Kademlia)
- 共识层: PoW, Pos, PBFT, RAFT
- 数据层: Merkle Tree(验证数据的完整性,一致性), Merkle DAG, Merkle Patricia Trie(MPT), 账户管理(BTC 的 UTXO, cell 模型,以太坊 Account 模型,EOA, SCA), 世界状态
- DApp 开发
- 基于区块链进行开发(侧链,layer2, 跨链)
- 基于 VM(以太坊的 EVM, solana 的 WASAM, JSVM)
- 结合分布式存储,实现无服务器架构应用的搭建
- MEV 套利,链的交易池监听