区块链技术

· 4759 words · 10 minute read

区块链技术与应用 🔗

肖臻

区块链不可能三角: 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和私钥数字kK=k*G 多次加法操作生成公钥点K。 已知K,G时极其困难推出私钥k

  公钥点 -- hash -> 钱包地址。

签名: 证明私钥持有者同意交易内容。

助记词, BIP39, 助记词 + salt --BIP39--》 seed 种子 --BIP32--> 生成多层的私钥。 BIP44.

以太坊的 P2P 网络 🔗

P2P 的点对点的传播是区块链的底层传输方式。

  1. 节点之间互相广播用于节点发现的 udp 网络
  2. 节点之间互相连接用于传输数据的 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
  • DApp 开发
    • 基于区块链进行开发(侧链,layer2, 跨链)
    • 基于 VM(以太坊的 EVM, solana 的 WASAM, JSVM)
    • 结合分布式存储,实现无服务器架构应用的搭建
    • MEV 套利,链的交易池监听