├── .gitignore ├── .mdformat.toml ├── README-dev.md ├── README.md ├── application ├── Governance │ └── dao.md ├── Metaverse │ └── metaverse.md └── defi │ └── FlashLoan.md ├── bitcoin ├── bitcoin.md ├── bitcoin_account.md ├── bitcoin_dev.md ├── bitcoin_master.md ├── bitcoin_script.md ├── protocal │ ├── bitcoin_protocal.md │ └── ordinals │ │ ├── ordinals.md │ │ ├── ordinals_arc20.md │ │ ├── ordinals_brc20.md │ │ ├── ordinals_links.md │ │ ├── ordinals_nft.md │ │ └── ordinals_nft.webp └── scale │ ├── LightningNetwork.md │ └── bitcoin_scale.md ├── blockchain ├── analysis.md ├── bc-future.md ├── bc-layer1.md ├── bc-mine.md ├── bc-miningpool.md ├── bc-scale.md ├── bc-tech-1-cryto.md ├── bc-tech-2-network.md ├── bc-tech-3-consensus.md ├── bc-tech.md ├── bc_base.md └── picture │ ├── BTCMerkleTree.png │ └── bc_module.png ├── ethereum ├── EIP.md ├── README.md ├── contract-code │ ├── Coin.sol │ ├── Loot.sol │ ├── Merkle.sol │ ├── MyERC1155.sol │ ├── ether.html │ ├── metamask.html │ ├── simple.sol │ ├── web3_listener.js │ ├── web3_merkle.js │ └── web3_rpc.js ├── contract │ ├── ERC.md │ ├── cost.md │ ├── error.md │ ├── explorer.md │ ├── grammar.md │ ├── library.md │ ├── nft.md │ ├── solidity.md │ └── version.md ├── eth2.0.md ├── ethnode.md ├── evm.md ├── picture │ ├── eth2.0.png │ └── world-state-tree.png ├── protocal.md └── starknet │ └── starknet.md ├── infra ├── cross │ ├── cross.md │ └── cross.png ├── index │ └── thegraph.md ├── oracle │ ├── README.md │ ├── chainlink.md │ └── chainlink_framework.png ├── storage │ ├── destorage.md │ ├── fvm.md │ └── ipfs.md ├── vdf.md └── zkp │ ├── aleo │ ├── aleo.md │ ├── aleo_concept.md │ ├── aleo_credits.md │ ├── aleo_dapp_deploy.md │ ├── aleo_leo.md │ ├── aleo_leo_grammar_old.md │ ├── aleo_leo_grammer.md │ ├── aleo_link.md │ ├── aleo_sdk.md │ ├── aleo_sdk_grammer.md │ ├── essay │ │ ├── aleo_leo_helloworld.md │ │ ├── aleo_sdk_helloworld.md │ │ └── private_smart_contract.md │ └── picture │ │ ├── aleo_dapp_deploy_1.png │ │ ├── aleo_dapp_deploy_2.png │ │ ├── aleo_dapp_deploy_3.png │ │ ├── aleo_dapp_deploy_4.png │ │ ├── aleo_dapp_deploy_5.png │ │ ├── aleo_dapp_deploy_6.png │ │ └── aleo_dapp_deploy_7.png │ ├── privacy.jpeg │ ├── privacy.md │ ├── staknet │ └── cairo-lang.md │ ├── zkSNARK.md │ ├── zkp-LagrangeInterpolation.png │ ├── zkp-protocol.png │ └── zkp.md ├── math ├── math_python.md └── number.png ├── opsnode ├── 1 ETH.md ├── 10 Cardano-ada.md ├── 11 Nervos-CKB.md ├── 12 XLM-stellar.md ├── 13 TOMO.md ├── 14 Polkadot.md ├── 15 platon.md ├── 2 Qtum.md ├── 3 Ripple-XRP.md ├── 4-1 BTC.md ├── 4-2 BTC.md ├── 5 Blockstack-STX.md ├── 6 Tezos.md ├── 7 Vechain-Vet.md ├── 8 Iris.md ├── 9 Vsystems.md ├── BCH.txt ├── CYB.txt ├── ChainX.txt ├── LTC.txt ├── cosmos.txt ├── eos.txt ├── usdt.txt └── vsys.txt ├── others ├── bc_link.md ├── faucet.md └── grants.md ├── secure ├── secure.md └── solidity.md └── solana └── solana.md /.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | .DS_Store -------------------------------------------------------------------------------- /.mdformat.toml: -------------------------------------------------------------------------------- 1 | end_of_line = "crlf" 2 | number = true 3 | extensions = ["frontmatter"] -------------------------------------------------------------------------------- /README-dev.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2025-05-05 3 | --- 4 | 5 | [TOC] 6 | 7 | ```sh 8 | pip install mdformat==0.7.22 9 | pip install mdformat-frontmatter==2.0.8 10 | 11 | 12 | mdformat . 13 | ``` 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链技术层面笔记 3 | created_date: 2025-05-04 4 | --- 5 | 6 | ## 章节 7 | 8 | 1. [区块链](./blockchain) 9 | 2. [比特币网络](./bitcoin) 10 | 3. [以太坊网络](./ethereum) 11 | 4. [区块链基础设施](./infra) 12 | 5. [区块链应用](./app) 13 | 6. [区块链节点部署](./opsnode) 14 | 7. [区块链安全相关](./secure) 15 | 8. [其它](./others) 16 | -------------------------------------------------------------------------------- /application/Governance/dao.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: DAOs 去中心化自治组织 Decentralized Autonomous Organizations 3 | created_date: 2023-02-01 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 定义 9 | 10 | - DAOs 去中心化自治组织 Decentralized Autonomous Organizations 11 | 12 | 1. DAO 是基于区块链的组织形式,通过智能合约和社区共识实现去中心化决策,无需传统中心化领导。 13 | 2. DAO 的治理规则由智能合约编码,运行在区块链上,透明且不可篡改,广泛应用于资金分配、社区治理和项目协作。 14 | 15 | ## 相关项目 16 | 17 | ### Bankless DAO 18 | 19 | - 英文 20 | - https://www.bankless.community/ 21 | - https://www.banklessconsulting.com/ 22 | 23 | ### Seedao 24 | 25 | - 中文 26 | - https://seedao.xyz/ 27 | 28 | ## 学习资源 29 | 30 | - **DAO 治理工具**: 31 | - Aragon:用于创建和管理 DAO 的平台(https://aragon.org/)。 32 | - Snapshot:链下投票工具,降低治理成本(https://snapshot.org/)。 33 | - Tally:支持链上治理提案和投票(https://www.tally.xyz/)。 34 | - **推荐阅读**: 35 | - 《The DAO Handbook》:深入讲解 DAO 设计和治理。 36 | - Bankless 文章:https://www.bankless.community/learn 37 | - SeeDAO 博客:https://seedao.xyz/blog 38 | - **社区与论坛**: 39 | - DAOist:全球 DAO 社区活动平台(https://thedaoist.co/)。 40 | - Discourse:DAO 项目常用的讨论平台 41 | -------------------------------------------------------------------------------- /application/Metaverse/metaverse.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元宇宙 Metaverse 3 | created_date: 2022-03-21 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 定义 9 | 10 | - 元宇宙 Metaverse 11 | 12 | - metaverse: the term first appeared in Neal Stephenson’s 1992 sci-fi novel Snow Crash 13 | 14 | - 元宇宙是一个持久化的虚拟共享空间,整合了虚拟现实(VR)、增强现实(AR)、区块链和社交互动,用户可以在其中进行创作、交易和社交。 15 | 16 | - 区块链技术为元宇宙提供去中心化的所有权、身份和经济系统。 17 | 18 | ## 相关项目 19 | 20 | 1. Decentraland 21 | 2. The Sandbox 22 | 3. 基于AI的创作 23 | - 通过简单地描绘生成图画 gaugan 24 | - 通过多张图片生成一张新的图片 stylegan 25 | -------------------------------------------------------------------------------- /application/defi/FlashLoan.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 闪电贷 Flash Loan 3 | created_date: 2022-11-14 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 定义 9 | 10 | - 闪电贷 Flash Loan 11 | 12 | 1. 在极短的时间内(一个区块时间或者一笔交易内)完成贷款与还款的操作。 13 | 14 | 2. 例如一笔交易内,用户需要把借到的款项及手续费及时归还,否则该笔交易就会回滚。 15 | 16 | 3. 在DeFi领域,闪电贷为金融业务提供了免抵押借款服务,是DeFi世界的一款利器。 17 | 18 | 4. 用户在借到款之后,可以利用借到的资产进行其他操作,比如套利(Arbitrage)、更换抵押品(Swapping Collateral)、自清算(Self-Liquidation)等操作。 19 | 20 | ## 相关项目 21 | 22 | 1. Aave、dYdX、Uniswap 23 | 2. Aave合约要求借款人归还初始金额+0.09%的借款金额。0.09%这笔费用将会分给存款人和集成商,前者给出了可供借贷的资金,后者为使用Aave的闪电贷API提供便利。 24 | -------------------------------------------------------------------------------- /bitcoin/bitcoin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 比特币介绍 3 | created_date: 2023-05-08 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 概述 9 | 10 | - 简介 11 | 12 | - 比特币(Bitcoin)的概念最初由中本聪(Satoshi Nakamoto)在2008年11月1日匿名提出,并于2009年1月3日正式诞生。 13 | - 比特币是一个完全去中性化的电子现金系统。 14 | 15 | - 比特币代表了数十年的密码学和分布式系统的巅峰之作。 16 | 17 | - 通讯:点对点网络 18 | - 存储:区块链 19 | - 货币:挖矿机制 20 | - 交易验证:脚本程序 21 | 22 | - 特点 23 | 24 | - 比特币每个区块大小上限是1MB,1MB的数据空间大概可以包含2000~4000笔交易。 25 | - 比特币机制为平均10分钟打包一个块。因此平均每秒钟的交易量就是(2000~4000)/10/60 ~= 3.3~6.6 26 | - 每一个BTC代表1亿个聪。 100000000 27 | - 1 sat/vB = 253 sat/kw 28 | 29 | ## 重要升级 30 | 31 | 1. Segwit升级 32 | 33 | 1. 起源: 由于比特币的区块空间有限,为了增加区块容量、提高可扩展性和交易速度,比特币在2015年实现了Segwit(隔离见证)升级。 34 | 2. Segwit升级内容: 主要思想是通过引入一个区块字段来保存签名数据,从而将签名数据剥离,扩大比特币区块中的有效容量,提升交易速度。 35 | 3. 在Segwit之前,签名数据最多可以占据一个区块的65%,而实现了隔离见证之后,比特币的有效区块大小从1MB增加到了4MB,大幅提升了效率。 36 | 37 | 2. Taproot升级 38 | 39 | 1. 起源: 2021年,随着全球矿工的批准,Taproot在比特币网络上线激活。 40 | 2. Taproot升级内容: 引入Taproot、Tapscript和Schnorr签名方案,显著降低了比特币网络的交易费用,并极大地提升了交易的私密性和可扩展性,使比特币能够处理更加复杂的交易,从而扩展更多的比特币用例。 41 | 3. Taproot升级旨在解决比特币网络的隐私性、安全性和高昂的交易费用问题。 42 | 43 | 3. Segwit升级和Taproot升级,打开了比特币网络的想象空间,也为在比特币网络中写入NFT数据铺平了道路。 44 | -------------------------------------------------------------------------------- /bitcoin/bitcoin_account.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 比特币账户 3 | created_date: 2023-05-15 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 四种账户地址类型 9 | 10 | 1. Legacy Address(P2PK和P2PKH) 11 | 12 | 1. P2PK = IP Addresses: The Original Address for Bitcoin 13 | 2. 旧地址是以数字 1 开头的地址。例如 15e15hWo6CShMgbAfo8c2Ykj4C6BLq6Not 14 | 3. 旧地址只是公钥和私钥的散列。早在 2009 年比特币推出时,这是创建地址的唯一方法。今天,这在交易中使用最多的空间,因此交易时gas费很贵。 15 | 16 | 2. 支付脚本哈希(P2SH) 17 | 18 | 1. Pay-to-Script-Hash 是一个以数字 3 开头的地址。例如 35PBEaofpUeH8VnnNSorM1QZsadrZoQp4N 19 | 2. 与传统地址相比,支付脚本哈希地址不是公钥的哈希,而是涉及对发送者隐藏的某些支出条件的脚本的哈希。这些花费条件可以很简单(公钥 A 的拥有者可以花费这个比特币),也可以很复杂(如果公钥 B 的拥有者泄露了一个预定的秘密,他可以在 X 次之后花费这个比特币)。使用此脚本,P2SH 地址甚至可以利用 SegWit 并节省交易费用。 20 | 3. 发送到 P2SH 地址比使用旧地址的钱包便宜约 26% 的gas。 21 | 22 | 3. 本地隔离见证 (P2WPKH) 23 | 24 | 1. Native SegWit 是一个以 bc1q 开头的地址。例如 bc1q42lja79elem0anu8q8s3h2n687re9jax556pcc 25 | 2. 这类地址不在交易中存储签名和脚本,而是在见证中,进一步减少了交易中存储的信息量。 26 | 3. 使用这种类型,您可以比 P2SH 地址额外节省 16% 的gas,比传统地址节省 38% 以上。由于这些节省,这是当今最常用的地址标准。 27 | 4. 因为有些交易所和钱包还不支持 Bech32 地址,所以会提示用户向他们发送 P2SH 地址。这就是为什么大多数钱包仍然包含创建 P2SH 甚至旧地址钱包的选项。 28 | 29 | 4. Taproot(P2TR) 30 | 31 | 1. 地址以 bc1p 开头。例如 bc1pmzfrwwndsqmk5yh69yjr5lfgfg4ev8c0tsc06e 32 | 2. 未使用的主根地址。2023年11月,比特币网络将进行主根软分叉。这将为比特币地址启用许多新的智能合约功能,并提高花费此类交易的隐私性。 33 | 3. 常规的主根交易比原生 segwit 略大,但比传统地址小。这是因为它们与公钥而不是公钥散列相关联。对于涉及多重签名脚本等复杂交易,主根地址节省了大量空间,成本更低。 34 | 35 | ## 账户的相关提案 36 | 37 | - 账户生成标准是由比特币的3个提案组成 38 | 39 | 1. BIP-39 定义如何使用熵生成助记词,如何使用助记词生成种子 40 | 41 | - https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki 42 | - 类似标准 Electrum v2 Aezeed Muun SLIP39 43 | 44 | 2. BIP-32 定义 HD Wallet(Hierarchical Deterministic Wallet)的规则 45 | 46 | - https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki 47 | - 如何从一个seed生成多层的私钥 48 | - 没有私钥的情况下,私钥之间互相不能推导 49 | 50 | 3. BIP-44 51 | 52 | - https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki 53 | 54 | 1. 定义HD Wallet中生成子私钥的规范 55 | 2. 不同链的生成子私钥规范约定 https://github.com/satoshilabs/slips/blob/master/slip-0044.md 56 | 57 | ## 账户的生成过程 58 | 59 | - 熵是随机生成的一段二进制数据,通常是 128 到 256 位。常见的熵长度: 60 | 1. 128 位熵 → 12 个助记词 61 | 2. 160 位熵 → 15 个助记词 62 | 3. 192 位熵 → 18 个助记词 63 | 4. 224 位熵 → 21 个助记词 64 | 5. 256 位熵 → 24 个助记词 65 | 66 | 1. 生成熵:128位熵(16 字节) 67 | 1. 例如 f5 2c 3d 6b 9e 1a 84 cf b2 99 13 54 76 3f 5a 88 68 | 2. 计算校验和:对熵进行 SHA-256 哈希,取前 N 位(N = 熵长度 / 32)。 69 | 1. 例如 SHA-256(f52c3d6b9e1a84cfb2991354763f5a88),取前N位,则为 1001 70 | 3. 拼接:将校验和加到熵末尾,加起来共 132 位。 71 | 4. 生成助记词:将结果分成每11位一组,总共12组,每组映射到 BIP-39 词表中的一个单词(2048 个单词)。 72 | 1. 例如 vote nephew ring nut ocean voyage obscure mystery resist ripple trouble olive 73 | 5. 种子:助记词通过 PBKDF2-HMAC-SHA512(2048 次迭代)转换为 512 位种子: 74 | 1. 例如 seed = PBKDF2("vote nephew ring nut ocean voyage obscure mystery resist ripple trouble olive", "mnemonic", 2048, sha512) 75 | 6. 生成主密钥(BIP-32) 76 | 1. 例如 HMAC-SHA512("Bitcoin seed", seed),计算出 77 | 1. 主私钥(m):6a3c1e9d8b7f6e5a4d3c2b1a09182736... 78 | 2. 主链码:f5e2d3c4b7a6d9e8c3b2a1f001234567... 79 | 7. 私钥:使用主密钥并且根据BIP-44多币种派生路径标准进行计算,计算出派生私钥 80 | 1. 例如 EVM使用的派生路径是 ECDSA secp256k1 m/44'/60'/0'/0/x 81 | 2. 例如 SUI支持三种派生路径 Ed25519(默认方案) m/44'/784'/0'/0'/x' 、 ECDSA secp256k1 m/44'/60'/0'/0/x 、 ECDSA secp256r1 m/74'/784'/0'/0/x' 82 | 8. 公钥:通过 公钥=私钥×G 83 | 1. 例如 EVM使用的G是secp256k1椭圆曲线生成点(即签名方案),计算出公钥 84 | 2. 例如 Sui支持多种签名方案和路径,默认路径是 Ed25519 85 | 9. 地址:地址生成基于签名方案和公钥 86 | 1. 例如 EVM地址是公钥,进行Keccak-256哈希算法,取结果最后20个字节作为地址,如 0x7d5F987A3C2e5689b4C7A99D91f2A7B8d9E7fBd3 87 | 2. 例如 Sui地址是将签名方案标识(1 字节)与公钥拼接,进行BLAKE2b哈希算法,取结果(32个字节)作为地址。 88 | -------------------------------------------------------------------------------- /bitcoin/bitcoin_dev.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链开发者 3 | created_date: 2022-03-20 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 链接 9 | 10 | 1. 区块链浏览器 11 | 2. https://blockstream.info/ 12 | 3. https://mempool.space/ 13 | 4. https://live.blockcypher.com/ 14 | 5. 测试网区块链浏览器 15 | 6. https://blockchair.com/zh/bitcoin/testnet 16 | 7. https://live.blockcypher.com/btc-testnet/ 17 | 8. https://bitpay.com/insight/#/BTC/testnet/home 18 | 9. 比特币测试网钱包生成器 https://www.bitaddress.org/ 19 | 20 | ## 模拟工具 21 | 22 | - 区块链模拟工具 23 | 24 | ```bash 25 | nvm use v8.17.0 26 | npm install blockchain-cli 27 | blockchain help 28 | ``` 29 | 30 | ## bitcoin 31 | 32 | ### windows 编译环境 33 | 34 | ```powershell 35 | # 安装Windows 子系统 wls (Windows Subsystem for Linux)参考 https://learn.microsoft.com/en-us/windows/wsl/basic-commands#install 36 | # wsl --list --onlin 37 | # wsl --list 38 | # wsl --status 39 | # wsl -t ubuntu 关闭ubuntu 40 | # wsl --shutdown 关闭所有系统及虚拟机引擎 41 | # 安装子系统 # 默认安装Ubuntu子系统 42 | wsl --install 43 | # -d 指定使用的子系统 -u 指定用户 44 | wsl -d Ubuntu -u garysdevil 45 | ``` 46 | 47 | ### 编译 48 | 49 | ````bash 50 | ## 配置 51 | ```bash 52 | ./autogen.sh 53 | # No Wallet or GUI 54 | ./configure --without-wallet --with-gui=no 55 | 56 | # 编译 57 | make # use "-j N" here for N parallel jobs 58 | # 运行测试程序 59 | make check # Run tests if Python 3 is available 60 | ```` 61 | 62 | ```bash 63 | # 编译到指定目录 64 | make install DESTDIR=/mnt/c/workspace/bitcoin 65 | make deploy 66 | ``` 67 | 68 | ### bitcoin 编译报错 69 | 70 | ```bash 71 | # Windows 环境编译报错 We could not detect the boost libraries (version 1.73.0 or higher) 72 | # 可能是因为在Windows Subsystem for Linux (WSL)中未安装或未正确配置Boost库的版本 73 | # 解决办法 74 | # 安装Boost 75 | sudo apt install libboost-all-dev 76 | # 查看已安装的Boost版本 77 | dpkg -l | grep libboost 78 | ``` 79 | 80 | ## bitcoin-cli 环境 81 | 82 | ### Linux 83 | 84 | ```bash 85 | mkdir -p ~/.bitcoin 86 | cd ~/.bitcoin 87 | echo "rpcconnect=${IP}" >> bitcoin.conf 88 | echo "rpcuser=${username}" >> bitcoin.conf 89 | echo "rpcpassword=${password}" >> bitcoin.conf 90 | ``` 91 | 92 | ### Mac 93 | 94 | ```bash 95 | # bitcoin/src/bitcoin-cli 96 | mv bitcoin-cli /usr/local/bin/ 97 | mkdir -p "~/Library/Application Support/Bitcoin" 98 | cd "~/Library/Application Support/Bitcoin" 99 | echo "rpcconnect=${IP}" >> bitcoin.conf 100 | echo "rpcuser=${username}" >> bitcoin.conf 101 | echo "rpcpassword=${password}" >> bitcoin.conf 102 | ``` 103 | 104 | ## bitcoin-cli 指令 105 | 106 | ### 基本指令 107 | 108 | ```bash 109 | # 生成一个钱包 110 | bitcoin-cli createwallet $wallet_name 111 | 112 | # 列出所有的钱包 113 | bitcoin-cli listwallets 114 | 115 | # 生成一个新的地址 116 | bitcoin-cli -rpcwallet=$wallet_name getnewaddress 117 | 118 | 119 | # 获取区块的哈希 120 | bitcoin-cli getblockhash ${block_height} 121 | 122 | # 获取区块的详细信息 123 | bitcoin-cli getblock ${block_hash} 124 | 125 | # 获取原始交易数据(十六进制格式) # true 获取详细的交易信息(JSON 格式) 126 | bitcoin-cli getrawtransaction ${tx} true 127 | 128 | # 验证一条签名信息是否来自于指定的签名地址 129 | bitcoin-cli verifymessage $address $signature $message 130 | 131 | # 使用4个公钥创建一个 1-of-4 P2SH多签地址 132 | required_signatures=1 # 设置所需的签名数量 133 | bitcoin-cli createmultisig $required_signatures '[ "'$pubkey1'", "'$pubkey2'", "'$pubkey3'", "'$pubkey4'" ]' 134 | 135 | # 通过扩展公钥(Extended Public Key),获取钱包中的特定输出脚本描述符信息 descriptor 136 | bitcoin-cli getdescriptorinfo "wpkh(xpub6DJ2dNUysrn5Vt36jH2KLBT2i1auw1tTSSomg8PhqNiUtx8QX2SvC9nrHu81fT41fvDUnhMjEzQgXnQjKEu3oaqMSzhSrHMxyyoEAmUHQbY)" 137 | 138 | # 通过扩展公钥(Extended Public Key)生成3个派生地址 139 | # [d34db33f/84h/0h/0h]: 这是表示派生地址路径的一部分,指定了从根地址到目标地址的路径。d34db33f可能是一个硬件钱包或其他系统的标识符,84h表示目标地址的路径中使用的币种是Bitcoin(BTC),0h/0h表示BIP32路径的深度。 140 | bitcoin-cli deriveaddresses "wpkh([d34db33f/84h/0h/0h]xpub6DJ2dNUysrn5Vt36jH2KLBT2i1auw1tTSSomg8PhqNiUtx8QX2SvC9nrHu81fT41fvDUnhMjEzQgXnQjKEu3oaqMSzhSrHMxyyoEAmUHQbY/0/*)#cjjspncu" "[0,2]" 141 | 142 | 143 | ``` 144 | 145 | ### 用例 146 | 147 | ```bash 148 | # 签名与验证签名 149 | 150 | # Unlock the wallet for 30 seconds 151 | bitcoin-cli walletpassphrase "mypassphrase" 30 152 | # Create the signature 153 | bitcoin-cli signmessage "1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX" "my message" 154 | # Verify the signature 155 | bitcoin-cli verifymessage "1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX" "signature" "my message" 156 | ``` 157 | 158 | ```bash 159 | # 指定区块,输出未被开销的UTXO所在的钱包地址 160 | 161 | block_height=123321 162 | block_hash=$(bitcoin-cli getblockhash $block_height) 163 | block=$(bitcoin-cli getblock $block_hash) 164 | txids=$(echo "${block}" | jq -r '.tx[]') 165 | 166 | for txid in $(echo $block | jq -r ".tx[]"); do 167 | tx_details=$(bitcoin-cli getrawtransaction $txid true) 168 | vout_len=$(echo $tx_details | jq ".vout | length") 169 | for ((index=0; index<$vout_len; index++)); do 170 | utxo=$(bitcoin-cli gettxout $txid $index) 171 | if [ "$utxo" != "" ]; then 172 | echo $tx_details | jq ".vout[$index].scriptPubKey.address" 173 | exit 174 | fi 175 | done 176 | done 177 | ``` 178 | 179 | ```bash 180 | # Which tx in block 257,343 spends the coinbase output of block 256,128? 181 | 182 | # get the coinbase output txid of block 256,128 183 | block_256128hash=$(bitcoin-cli getblockhash 256128) 184 | block_256128=$(bitcoin-cli getblock $block_256128hash) 185 | coinbase_txid=$(echo "${block_256128}" | jq -r ".tx[0]") 186 | 187 | # get the details of block 257,343 188 | block_257343hash=$(bitcoin-cli getblockhash 257343) 189 | block_257343=$(bitcoin-cli getblock $block_257343hash) 190 | 191 | 192 | for txid in $(echo $block_257343 | jq -r ".tx[]"); do 193 | tx_details=$(bitcoin-cli getrawtransaction "${txid}" true) 194 | for vin_txid in $(echo $tx_details | jq -r ".vin[] | .txid"); do 195 | if [ $vin_txid == $coinbase_txid ]; then 196 | echo "Transaction $txid in block 257,343 spends the Coinbase output of block 256,128." 197 | exit 198 | fi 199 | done 200 | done 201 | ``` 202 | 203 | ## 术语 204 | 205 | - 描述符(descriptors) 206 | - 是一种用于描述如何从密钥派生地址的格式。 207 | - 基本形式 `wpkh(/0/*)` 208 | - wpkh 是一个函数,表示要生成一个支付到公钥哈希的隔离见证类型(witness public key hash,简称wpkh)的地址。 209 | - sh(表示统的支付到公钥哈希(P2PKH)地址) 210 | - wsh(表示隔离见证脚本哈希地址) 211 | - multi(表示多签名地址) 212 | - /0/\*: 这部分指定了要派生的子地址的索引,/0表示索引为0,/\*表示可以生成更多的子地址。 213 | -------------------------------------------------------------------------------- /bitcoin/bitcoin_master.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 读书笔记 Mastering Bitcoin 3 | created_date: 2024-01-25 4 | --- 5 | 6 | [TOC] 7 | 8 | 1. 数字货币的三大问题 9 | 2. 真币,假币? 纸币通过复杂纸张和印刷技术,不断与伪造问题作斗争。 10 | 3. 这笔钱只能被花费一次吗(双花问题)? 纸币只有一张,也就不会同时出现在两个地方。比特币通过POW机制解决双花问题。 11 | 4. 这笔钱只能被我拥有吗? 纸币,在谁手里就是谁的。比特币通过数字签名解决所有权问题。 12 | 5. 随着加密技术的发展,在比特币之前,也存在数字货币,但都是中心化的。 13 | 14 | - four key innovations 15 | 1. A decentralized peer-to-peer network (the Bitcoin protocol) 16 | 2. A public transaction journal (the blockchain) 17 | 3. A set of rules for independent transaction validation and currency issuance (consensus rules) 18 | 4. A mechanism for reaching global decentralized consensus on the valid block‐ chain (proof-of-work algorithm) 19 | 20 | 3. 比特币提案 Bitcoin Improvement Proposals (BIPs). 21 | 22 | The Bitcoin transaction script language contains many operators, but is deliberately 23 | limited in one important way—there are no loops or complex flow control capabili‐ 24 | ties other than conditional flow control. 25 | -------------------------------------------------------------------------------- /bitcoin/bitcoin_script.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 比特币脚本语言 3 | created_date: 2024-09-13 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 定义 9 | 10 | 1. 比特币脚本语言是一种基于堆栈的编程语言,用于定义如何花费特定的交易输出。 11 | 2. 比特币脚本语言不是图灵完备的,它没有循环和递归等复杂的编程结构。 12 | 3. 比特币脚本语言中的操作码(OP-Codes)是指在脚本中执行特定操作的命令。 13 | 14 | - 概念 15 | 1. 堆栈:比特币脚本主要通过堆栈操作来完成各种验证。堆栈是一种后进先出(LIFO)的数据结构。 16 | 2. 锁定脚本(ScriptPubKey):定义了如何花费一个输出,它被嵌入在交易输出中。 17 | 3. 解锁脚本(ScriptSig):提供解锁锁定脚本所需的数据,它被嵌入在交易输入中。 18 | 19 | ## 操作码 20 | 21 | 1. 基本操作码 22 | 1. OP_0 (0x00) 堆栈作用: 将数值0(false)压入堆栈。 堆栈用途: 通常用于标记或填充空位。 23 | 2. OP_1 (0x51) 到 OP_16 (0x60) 堆栈作用: 将数值 1 到 16 压入堆栈。 堆栈用途: 用于条件语句和多重签名验证。 24 | 2. 堆栈操作 25 | 1. OP_DUP (0x76) 堆栈作用: 复制堆栈顶部的项。 堆栈用途: 常用于重复使用堆栈顶部的值。 26 | 2. OP_DROP (0x75) 堆栈作用: 移除堆栈顶部的项。 堆栈用途: 删除不再需要的值。 27 | 3. OP_SWAP (0x7c) 堆栈作用: 交换堆栈顶部的两项。 堆栈用途: 改变堆栈中项的顺序。 28 | 3. 算术和逻辑操作 29 | 1. OP_ADD (0x93) 堆栈作用: 将堆栈顶部的两个数相加并将结果压入堆栈。 堆栈用途: 执行简单的加法操作。 30 | 2. OP_EQUAL (0x87) 堆栈作用: 比较堆栈顶部的两个值,如果相等则返回true(压入1),否则返回false(压入0)。 堆栈用途: 比较两个值是否相等。 31 | 3. OP_EQUALVERIFY (0x88) 堆栈作用: 运行OP_EQUAL,然后根据结果决定是否继续执行脚本。如果结果为false,则脚本失败。 堆栈用途: 常用于验证签名等条件。 32 | 4. 加密和哈希操作 33 | 1. OP_SHA256 (0xa8) 堆栈作用: 对堆栈顶部的项执行SHA-256哈希运算,并将结果压入堆栈。 堆栈用途: 生成数据的哈希值。 34 | 2. OP_HASH160 (0xa9) 堆栈作用: 对堆栈顶部的项先执行SHA-256哈希运算,再执行RIPEMD-160哈希运算,并将结果压入堆栈。 堆栈用途: 生成比特币地址的哈希值。 35 | 3. OP_CHECKSIG (0xac) 堆栈作用: 验证堆栈顶部的签名是否有效。 堆栈用途: 确认交易的有效性。 36 | 4. OP_CHECKMULTISIG (0xae) 堆栈作用: 验证多个签名是否有效。 堆栈用途: 多重签名验证。 37 | 5. 条件操作 38 | 1. OP_IF (0x63) 堆栈作用: 如果堆栈顶部的值为true,则执行接下来的操作码,直到遇到OP_ELSE或OP_ENDIF。 堆栈用途: 用于条件执行。 39 | 2. OP_ELSE (0x67) 堆栈作用: 与OP_IF配合使用,执行OP_IF条件为false时的操作码。 堆栈用途: 用于条件执行。 40 | 3. OP_ENDIF (0x68) 堆栈作用: 结束条件执行块。 堆栈用途: 用于条件执行。 41 | 42 | ## 操作码实践 43 | 44 | ```bash 45 | 2 3 OP_ADD 6 OP_EQUAL 46 | ``` 47 | 48 | - 代码会从左到右顺序执行 49 | 1. 2 和 3 会先后被 push 进栈,3 处在栈的最顶端。 50 | 2. OP_ADD 会把 2 和 3 从栈里面 pop 出来,然后把 5 push 进栈,现在栈里面只有一个 5 了。 51 | 3. 6 会被 push 进栈,现在栈里面有 5 和 6。 52 | 4. OP_EQUAL 会把 6 和 5 都 pop 出来,然后把比较结果 false push 进栈。 53 | 54 | ```json P2PKH脚本 55 | { 56 | "version": 1, 57 | "locktime": 0, 58 | "vin": [ 59 | { 60 | "txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18", 61 | "vout": 0, 62 | "scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf", 63 | "sequence": 4294967295 64 | } 65 | ], 66 | "vout": [ 67 | { 68 | "value": 0.01500000, 69 | "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG" 70 | }, 71 | { 72 | "value": 0.08450000, 73 | "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG", 74 | } 75 | ] 76 | } 77 | ``` 78 | 79 | - scriptSig 80 | 81 | - 格式: $signature $publicKey 82 | - 内容: 一项是数字签名,另一项是公钥(比特币地址)。 83 | - 功能: 设置解锁条件,接收方满足这个条件,才能花费这个UTXO。 84 | 85 | - scriptPubKey 86 | 87 | - 格式: OP_DUP OP_HASH160 $pubKeyHash OP_EQUALVERIFY OP_CHECKSIG 88 | - 内容: 包含操作码 和 公钥的哈希(比特币地址)。 89 | - 功能: 满足 scriptPubKey 中提出的条件,把UTXO花掉。 90 | 91 | - 代码执行过程 92 | 93 | - 解锁脚本和锁定脚本的连接 $signature $publicKey OP_DUP OP_HASH160 $pubKeyHash OP_EQUALVERIFY OP_CHECKSIG 94 | 95 | 1. OP_DUP 把栈最顶端的一项 $publicKey 复制一下,然后把结果 push 回栈。 96 | 1. $signature $publicKey $publicKey OP_HASH160 $pubKeyHash OP_EQUALVERIFY OP_CHECKSIG 97 | 2. OP_HASH160 把栈最顶端的一项 $publicKey 取出并对其进行双重哈希运算 RIPEMD160(SHA-256($publicKey)) ,然后把结果 push 回栈。 98 | 1. $signature $publicKey $pubKeyHash $pubKeyHash OP_EQUALVERIFY OP_CHECKSIG 99 | 3. OP_EQUALVERIFY 比较堆栈顶部的两项是否相等,并删除它们,如果不相等则脚本失败。 100 | 1. [signature, publicKey] OP_CHECKSIG 101 | 4. OP_CHECKSIG:验证签名是否与提供的公钥匹配。 102 | 1. 如果验证通过,脚本执行成功 103 | 104 | ## 被禁止的操作码 105 | 106 | - OP_CAT是一种操作码,由匿名创建者中本聪在比特币存在的早期引入。 107 | - OP_CAT 堆栈作用: 将堆栈顶部的两项连接成一项。 108 | - OP_CAT 尝试再次使用 https://opcat.wtf/ 109 | -------------------------------------------------------------------------------- /bitcoin/protocal/bitcoin_protocal.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 比特币协议扩展(Protocol Extensions) 3 | tags: [blockchain, bitcoin, ordinals, atomicals, runes, rgb] 4 | created_date: 2023-11-10 5 | --- 6 | 7 | [TOC] 8 | 9 | ## Ordinals 10 | 11 | ### 定义 12 | 13 | - Ordinals 是一种比特币协议,通过为每个聪(Satoshi)分配唯一编号并附加铭文(Inscriptions),实现类似 NFT 的功能。铭文可存储文本、图片等数据,依赖 SegWit 和 Taproot 升级。 14 | 15 | ### 应用 16 | 17 | 1. BRC721 https://twitter.com/poyo_eth 18 | 2. [更多的相关信息](./ordinals) 19 | 20 | ## Atomical 21 | 22 | ### 链接 23 | 24 | - 官方推特 https://twitter.com/atomicalsxyz 25 | - 官方文档 https://docs.atomicals.xyz/ 26 | - 支持 Atomical 协议的钱包 https://atomicalswallet.com/ https://atomicals-1.gitbook.io/atomicals-wallet-1/ 27 | - 交易市场 https://atomicalmarket.com 28 | 29 | ### 定义 30 | 31 | - Atomicals Protocol 是另一个在 UTXO 上刻入数据实现 Token 的衍生协议。 32 | 33 | - 不同于最初为 NFT 设计的 Ordinals,它从底层重新思考了如何在 BTC 上中心化的、不可篡改、公平地发行 token。 34 | 35 | - Atomicals 以比特币的最小单位 sat 作为基本「原子」,每一个 sat 的 UTXO 用来代表这个 Token 本身,1 token = 1 sat。 36 | 37 | - 当验证一个 Atomicals 交易时,只需要在 BTC 链上查询对应 sat 的 UTXO 即可。ARC20 Token 的原子性和 BTC 本身的原子性保持一致,ARC20 的转账的计算完全由 BTC 基础网络处理。 38 | 39 | ### 应用 40 | 41 | - ARC20 42 | - Realms 43 | 44 | ## Runes 45 | 46 | ### 定义 47 | 48 | - Casey 提出了一种专门用于发行 NFT 的铭文实现方式即 Rune。 49 | - Rune 的设计可能也受到了 ARC20 的影响,选择直接在 UTXO 的脚本中写入 Token 数据,这包含了 Token 的 ID、输出与数量。 50 | - Rune 的实现与 ARC20 非常相似,将 token 转账直接交给 BTC 主网处理。区别在于, Rune 在脚本数据中写入了 Token 数量,这让他比 ARC20 具备更高的精度。 51 | - #Trac 的创始人基于此构想编写了第一个标准,并发行了 $pipe 52 | 53 | ## RGB 54 | 55 | ### 链接 56 | 57 | - https://rgb-org.github.io/ 58 | - https://rgb.tech/ 59 | 60 | ### 定义 61 | 62 | - RGB(Really Good Bitcoin) 63 | 64 | - RGB Protocol 是一种在比特币主链上发行和管理资产(如代币、NFT)的协议,通过在交易中嵌入元数据(通常使用 OP_RETURN 或见证数据)并结合链下客户端验证(Client-Side Validation, CSV)实现复杂逻辑。 65 | 66 | - RGB旨在为比特币带来类似以太坊的智能合约功能,同时保持比特币的安全性和去中心化特性。 67 | 68 | - 时间线 69 | 70 | - 2016 年,RGB 协议最初由 Peter Todd 提出。 71 | - 2023 年,在比特币上智能合约生态的开发热潮中,RGB 协议再次得到关注。 72 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-05-15 3 | --- 4 | 5 | [TOC] 6 | 7 | ## Ordinals协议 8 | 9 | - Ordinals 协议是一种可以在比特币的最小单位(即sats或satoshis)上刻入数据的协议。 10 | - Ordinals 协议本质上就是将这一段代码序列化到见证脚本里面。 11 | - Ordinals 协议将每一个比特币中最小单位(聪)编号,并将其与一个元数据链接起来,形成一个独特且可追溯的 NFT ,从而达到NFT的效果。 12 | - Ordinals 让用户能够将图像、文本、视频和音频等数据写入sats(聪),利用了比特币网络上隔离见证(SegWit)和 Taproot3 的技术特性,实现了在比特币链上直接铸造、转移和销毁 NFT 。 13 | - Ordinals 2022年12月 Casey 推出于 Ordinals 协议,并在2023年2月逐渐被大家所了解。 14 | 15 | ## Emblem跨链协议 16 | 17 | - 这是一个把BTC上的NFT跨链到ETH的一个桥,跨链过去后,会在vault合约下面生成一个子类给持有者,该操作相当于把NFT托管在保险库,因为目前BTC网络的marketplace交互不流畅,所以这也是退而求其次的一种交易方式。比如bitcoinpunks就是使用这个桥然后跨链至以太坊网络进行交易。 18 | 19 | ## 参与Ordinals协议的三种方式。 20 | 21 | 1. 第一种方式是使用ord wallet和bitcoin core搭建比特币全节点,但该方法需要占用大量的硬盘空间,参与门槛较高。 22 | 2. 第二种方式是使用unisat、ordbot等节点机器人,机器人会收取一定的手续费,但会帮助同步您上传的图片或者文字到ordinals上面,方便快捷。但是,费用较高,同等大小的图片全节点需要3U,而机器人需要5U。 23 | 3. 第三种方式是通过二级市场购买,ordinals.markrt、ordswap和ordwallet是目前BTC上的主流交易市场,可以通过购买NFT的方式参与进来。但是,这种方式需要溢价购买NFT,需要付出一定的成本。 24 | 25 | ## Inscribe时注意事项 26 | 27 | - 文本不要低于546,图片不要低于1000。 28 | - 如果低于这个数,你的交易就容易被矿工判定为粉尘,不给打包。 29 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals_arc20.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2024-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | - 链接 8 | - Atomicals-JS部署及私有节点搭建 https://mirror.xyz/cyberscavenger.eth/rayhn9RT1VMUMo4Iios3g0A6G6AtZ-EXfQ8F_kj8HhQ 9 | 10 | ## 本地打铭文 11 | 12 | ### atomicals-js 打铭文 13 | 14 | ```bash 15 | # https://github.com/atomicals/atomicals-js 16 | 17 | # --satsbyte gas。设置的gas,与实际上链的gas是1.8~2倍的关系,比如这里设置30,实际上链gas是54~60sats/vB。 18 | satsbyte=30 19 | # --bitworkc 算力难度。每个FT币 的难度都可能不同 20 | bitworkc=3165 21 | 22 | # 生成钱包 23 | yarn cli wallet-init 24 | 25 | # 导入私钥和钱包地址 26 | yarn cli wallet-import ${wif} ${alias} 27 | 28 | # 铸造FT币指令 29 | yarn cli mint-dft dmint --satsbyte ${satsbyte} 30 | # --funding 指定alias作为gas地址的钱包 31 | 32 | # 铸造Realm域名指令 33 | yarn cli mint-realm "btc" --satsbyte ${satsbyte} --satsoutput 1000 --bitworkc ${bitworkc} 34 | 35 | # 铸造图片NFT指令 36 | yarn cli mint-nft "E:\Crypto\NFT\CryptoPunks\punk0000.png" --satsbyte ${satsbyte} --satsoutput 1000 --bitworkc ${bitworkc} 37 | 38 | # 查询余额命令 39 | yarn run cli balances 40 | 41 | ``` 42 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals_brc20.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-05-15 3 | --- 4 | 5 | [TOC] 6 | 7 | ## brc20 8 | 9 | - 2023年3月8日,推特用户 @domodata 提出利用 JSON 数据格式的 Ordinals 铭文,来部署代币合约、铸币以及转账,并命名这种格式为 BRC-20 。 10 | 11 | - @domodata 强调 BRC-20 只是一个实验,代币本身并无价值。 12 | 13 | - 首个 BRC-20 代币合约部署的是“ordi”代币,每次铸币限制为1000个,总量为2100万个,先到先得,每个人都可以免费铸造。 14 | 15 | - Ordinal理论关注聪(satoshis),赋予它们独特的身份,使它们可以被跟踪、转移和赋予意义。 16 | 17 | ## 结构 18 | 19 | ```json 20 | { 21 | "p": "brc-20", 22 | "op": "deploy", 23 | "tick": "ordi", 24 | "max": "21000000", 25 | "lim": "1000" 26 | } 27 | ``` 28 | 29 | ```json 30 | { 31 | "p": "brc-20", 32 | "op": "mint", 33 | "tick": "ordi", 34 | "amt": "1000" 35 | } 36 | ``` 37 | 38 | ```json 39 | { 40 | "p": "brc-20", 41 | "op": "transfer", 42 | "tick": "ordi", 43 | "amt": "100", 44 | "to": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" 45 | } 46 | ``` 47 | 48 | - 系统运作方式 49 | - brc20依赖一个前端页面用来检索和查看账户余额,重点是账户余额实时记录,需要一直检索区块,并且标记所有的铸造领取转账行为。 50 | - 部署: 信息里包含铭文的代号、供应量、领取限制。 51 | - 领取: 直接从总账户划转余额到领取账户。 52 | - 转移: 分两个步骤,第一步铸造一个转移函数铭文到发送地址,第二步将该铭文发送到接受账户,然后前端系统进行记录余额。 53 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals_links.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-05-15 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 参考 8 | 9 | - Ordinals协议机制 https://mirror.xyz/quentangle.eth/zRV-TCg62FGhee89fTgAYUqywcc6x9wpTG6gVdMrEp0 10 | - Ordinals Inscription铸造过程解析 https://mirror.xyz/quentangle.eth/2NYOJN4G-S7LV_HJqUPQE_YHc692Gcy9Y4ZeOIKf-w8 11 | - BRC20和unisat讲解 https://twitter.com/CG_BRC20/status/1653803094545932288 12 | - BRC20讲解与交易 https://twitter.com/BiteyeCN/status/1651821269019668480 13 | - 24个比特币生态项目和工具全盘点 https://foresightnews.pro/article/detail/32533 14 | 15 | ## Ordinals协议 16 | 17 | - 白皮书 18 | 19 | 1. https://bitcoin.org/bitcoin.pdf 20 | 2. https://bitcoin.org/files/bitcoin-paper/bitcoin_zh_cn.pdf 21 | 3. https://github.com/xiaolai/bitcoin-whitepaper-chinese-translation 22 | 4. https://github.com/GammaGao/bitcoinwhitepaper 23 | 24 | - 区块链游览器 25 | 26 | 1. https://explorer.btc.com/ 27 | 2. https://ordiscan.com/ 28 | 3. https://blockstream.info/ 29 | 30 | - gas查询 31 | 32 | - 时时 https://mempool.space/ 33 | - 趋势($单位) https://ycharts.com/indicators/bitcoin_average_transaction_fee 34 | 35 | ## 钱包 36 | 37 | - 各个钱包生成的地址可能会不同 38 | 39 | 1. unisat 40 | 41 | - 浏览器插件钱包;支持Ordinals协议。 42 | - https://unisat.io/download 43 | 44 | 2. ordinalswallet 45 | 46 | 1. Ordinals协议原生钱包,网页钱包。 47 | 2. https://ordinalswallet.com/wallet 48 | 49 | 3. Hiro Wallet 50 | 51 | 1. 浏览器插件钱包,桌面客户端钱包;支持Ordinals协议。 52 | 2. wallet.hiro.so 53 | 54 | 4. Xverse Wallet 55 | 56 | - 安卓、IOS系统钱包,支持Ordinals协议。 57 | - xverse.app 58 | 59 | 5. Sparrow Wallet 60 | 61 | - 支持 Ordinals 协议。 62 | - sparrowwallet.com 63 | 64 | ## BRC20 65 | 66 | - brc20讲解 https://domo-2.gitbook.io/brc-20-experiment/ 67 | - brc20生态和行情 https://brc-20.io/ 68 | - brc20生态和行情 https://chaineye.tools/ord 69 | - 交易市场 https://unisat.io/market 70 | - 交易市场 https://ordswap.io/ 71 | - 查看钱包持仓市值 https://ordspace.org/brc20 72 | - 代打平台 73 | 1. https://unisat.io/inscribe 最佳工具 74 | 2. https://idclub.xyz/index 中文 75 | 3. https://ordinalsbot.com/ 历史记录检索有误 76 | 4. https://bitpunks.io/Punk/Insbot 历史记录检索有误 77 | 5. https://ordinalsbot.com/ 历史记录检索有误 78 | 6. https://looksordinal.com/ 操作界面复杂 79 | 7. https://ordichef.xyz/inscribe 80 | 8. https://runealpha.xyz/ 81 | 82 | ## ARC20 83 | 84 | 1. ARC20 代币总览 https://www.coinglass.com/zh/arc20 85 | 2. 代打平台 86 | - https://atomicalmarket.com/inscribe?ticker=electron 87 | - https://satsx.io/inscribe/atomicals 88 | 89 | ## LRC20 90 | 91 | - LTC钱包 92 | 93 | 1. http://electrum-ltc.org 94 | 2. http://atomicwallet.io/litecoin-wallet 95 | 96 | - 两个铸造工具 97 | 98 | 1. http://ordinalslite.xyz 99 | 2. https://inscribe.ordieverse.wtf 100 | 1. https://discord.com/invite/earlyordies 101 | 2. https://twitter.com/earlyordies 102 | 103 | - 生态网站 https://litescribe.io/ltc20 104 | 105 | ## ORC20 106 | 107 | - 官推 https://twitter.com/orcdao 108 | - 官方文档 https://docs.orc20.org/ 109 | - orc20代币列表 https://loveords.com/orc20 110 | - 浏览器 111 | - https://bitpunks.io/Explorer/Inscriptions 112 | - https://preturnio.com 113 | - 统计 https://dune.com/ordinalstats/orc-20 114 | - mint工具 115 | - https://bitpunks.io/Punk/Insbot 116 | - https://unisat.io/inscribe 117 | - https://idclub.io/inscribe 118 | - 铸造教程 https://mirror.xyz/0lscan.eth/lA9eZlYr8FADBnnt_QeTf9fRB_64lCDeZzJtxb-wi0c 119 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals_nft.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-05-15 3 | --- 4 | 5 | [TOC] 6 | 7 | 1. TwelveFold 是 Yuga Labs 推出的一个比特币NFT项目,由 300 件独特的生成艺术作品组成的系列。这些作品是使用 3D 建模和算法构造以及高端渲染工具创建的,并且含有 3D 及手绘元素,皆存储在 12 x 12 网格定位的 12 基础艺术系统中。TwelveFold使用了Ordinals协议,将每件作品刻入到比特币区块链上的一定数量的聪(satoshis)上,使其具有不可篡改和永久保存的特性。该项目在2023年3月4日开始拍卖,筹集了1650万美元。这一项目在盲拍的方式下进行,最终的最高出价为10 BTC,最低出价为0.01 BTC。前288名成功竞拍者将获得他们所购买的作品。 8 | -------------------------------------------------------------------------------- /bitcoin/protocal/ordinals/ordinals_nft.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/bitcoin/protocal/ordinals/ordinals_nft.webp -------------------------------------------------------------------------------- /bitcoin/scale/bitcoin_scale.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 比特币网络扩容方案 3 | created_date: 2024-01-30 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 增大区块 9 | 10 | - 内容: 2017 年 8 月,比特币实施隔离见证(SegWit)升级。 11 | - 优点: 通过交易信息与签名信息的分离,将有效区块大小从 1M 提升到了 4M,一定程度缓解了拥堵问题。 12 | - 缺点: 由于比特币区块本身大小的限制,无法对一个区块的存储信息无限扩容,因而通过对区块存储信息扩容提高效率的方式便到此为止。 13 | 14 | ## 闪电网络 15 | 16 | - 闪电网络 Taproot Assets (Taro) 17 | 18 | - https://lightning.network/lightning-network-paper.pdf 19 | 20 | - 内容: 闪电网络是基于比特币的二层扩容方案,允许在不访问区块链的情况进行下交易。 21 | 22 | - 优点: 极大提高了吞吐量。 23 | 24 | - 缺点: 较大的中心化风险。 25 | 26 | - 现有的闪电网络解决方案有 OmniBOLT,Stacks 等。 27 | 28 | - 闪电网络一直在尝试扩展其用例,BRC20 的火热促使了 Lightning Labs 发布了 Taproot Assets,这着也是一个 BTC 上发行 Token 的协议。 29 | 30 | - 与 Brc20 等都不相同,Taproot Assets 仅仅在 BTC 主网的 UTXO 输出脚本中写入了 Token 的信息,没有存储这个 Token 的转账、mint 等功能代码。 31 | 32 | - Taproot Assets 仅将 BTC 主网看作 Token 的注册表,并不是完全依赖 BTC 主网运行,因此这些资产必须被存入闪电网络中才能进行交易。 33 | 34 | - 因此 Taproot Assets 的 Token 必须依赖第三方的存储索引器,离开了存储索引器这些 Token 即将永远地丢失。 35 | 36 | - 因此用户要么自己运行一个 BTC 的全节点和 Taproot Assets 客户端,要么完全依赖一个中心化的服务器交易 Taproot Assets Token,这可能是目前 BTC Token 协议中最中心化的方案。 37 | 38 | - aproot Assets 的打新方式:用户不能直接在 BTC 主网中发送交易自助地铸造 Token,而是有一个项目方地址一次性发行 ( 或者叫注册 ) 所有的 Token,然后再由项目方转入闪电网络进行分发。 39 | 40 | ## 侧链技术 41 | 42 | - 内容: 侧链技术是在比特币网络之外搭建一条侧链,侧链上的资产按 1:1 与 BTC 锚定。 43 | - 优点: 提高了吞吐量。 44 | - 缺点: 永远无法达到 BTC 主网的安全性。 45 | 46 | ## L2区块链 47 | 48 | - Stacks 是一个比特币 Layer 2 区块链,通过 Proof of Transfer(PoX)机制与比特币主链锚定,支持智能合约和去中心化应用(DApps)。 49 | -------------------------------------------------------------------------------- /blockchain/analysis.md: -------------------------------------------------------------------------------- 1 | - 链上数据分析 2 | - 参考 https://mp.weixin.qq.com/s/UzeL6y8iKN4am6xgPlj3wA 3 | ## 数据类型 4 | - 跳过~ 5 | 6 | ## 指标 7 | 1. TVL: 表示在一个协议或整个区块链生态系统中被锁定的加密资产的总价值,包括流动性、抵押贷款和收益聚合中的总资产价值。 8 | 2. 活跃地址数: 在一定时间段内至少执行过一次交易的钱包地址数量。 9 | 3. 交易数: 是在一定时间段内链上发生的所有交易的数量。 10 | 4. 交易量: 是在一定时间段内链上这些交易涉及资产价值的总额。 11 | 5. 交易费用 12 | 13 | ## 链上数据分析流程及工具 14 | 1. 数据ETL 15 | 1. 数据抽取 Extract 16 | 2. 清洗转换 Transform 17 | 3. 加载到数据仓库 Load 18 | 4. 依据不同业务线及观测指标分析数据 19 | 5. 输出量化结果 20 | 2. 数据源 21 | 1. 数据源提供对原始区块链数据的索引,它们通过节点和API访问不同的区块链网络,提取链上的交易、事件日志、合约信息等原始数据。 22 | 2. 相关产品: The Graph、Alchemy、区块链浏览器API 23 | 3. 数据开发工具 24 | 1. 面向开发者,将原始数据进行解析存储,使其可以使用SQL或GraphQL等语言进行查询,自由定制程度高,不提供分析结果。 25 | 2. 相关产品: Dune、Footprint、GeniiData、Flipside 26 | 4. 数据应用 27 | 1. 面向普通用户,一般会以数据可视化看板等提供预先分析好的结果。 28 | 2. 相关应用: Nansen、Debank、Defilamma、区块链浏览器 29 | 30 | - 目前主流的链上数据分析工具多处于从Web2向Web3过渡的阶段,未来面向DeFi的数据分析服务一定是根植于Web3原生数据特性的。特别是基于智能合约代码逻辑的数据洞察能力,将会成为链上数据分析平台最重要的护城河。 -------------------------------------------------------------------------------- /blockchain/bc-future.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的发展 3 | created_date: 2022-03-20 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 发展 9 | 10 | - 去中心化 11 | 12 | 1. Bitcoin 13 | 14 | - 去中心化 + 隐私性 15 | 16 | 1. Zcash 使用了 SCIPR 实验室的零知识证明库 libsnark ,在此基础上做了修改。 17 | - SCIPR 实验室的 libsnark https://github.com/scipr-lab/libsnark 18 | - libsnark实现参考的论文 https://eprint.iacr.org/2013/507.pdf 19 | - Zcash 修改后的 libsnark https://github.com/zcash/libsnark 20 | 21 | - 去中心化 + 可编程性 22 | 23 | 1. Ethereum 24 | 25 | - 去中心化 + 可编程性 + 隐私性 26 | 27 | 1. Aleo 28 | 29 | ## 区块链的不同时代 30 | 31 | ### 区块链1.0时代 32 | 33 | - 区块链1.0可以简单地说是货币应用,是与转账、汇款和数字化支付相关的密码学货币应用。 34 | 35 | 1. 概念提出: 2008年11月1日,一个自称中本聪(Satoshi Nakamoto)的人在一个隐秘的密码学讨论组上贴出了一篇研究报告《Bitcoin: A Peer-to-Peer Electronic Cash System》,报告阐述了他对电子货币的新构想,勾画了比特币系统的基本框架。 36 | 37 | - https://bitcoin.org/bitcoin.pdf 38 | 39 | 2. 落地项目: 比特币。 40 | 41 | ### 区块链2.0时代 42 | 43 | - 区块链2.0是合约应用,是经济、市场和金融的区块链应用的基石,例如股票、债券、期货、贷款、抵押、产权、智能财产和智能合约。 44 | 45 | - 以太坊诞生,维塔利克·布特林(Vitalik Buterin) 46 | 47 | - https://ethereum.org/en/whitepaper/ 48 | 49 | ## 历史 50 | 51 | 1. 008 年 10 月 31 日,中本聪(Satoshi Nakamoto)在一个密码朋克的邮件 列表中发布了比特币的白皮书。 52 | 2. 2009 年 1 月 3 日,中本聪挖到了比特币的创世区块。 53 | 3. 2014 年 1 月 24 日,维塔利克·布特林(Vitalik Buterin)在迈阿密比特币大会上正式 宣布了以太坊项目的诞生。 54 | 4. 2017 年 11 月,基于以太坊运行的 MakerDAO 推出超额抵押贷款稳定币 Dai, 用户可 以在 Maker 抵押 ETH,铸造锚定美元的稳定币 Dai, 使用户第一次通过数字货币获得 融资。 55 | 5. 2018 年 9 月,第一个去中心化资产借贷协议 Compound 上线。 56 | 6. 2018 年 11 月,目前交易量最大的去中心化交易所 Uniswap 上线,创造性地推出自动做市商机制。 57 | 7. 58 | 59 | ## 其它 60 | 61 | 1. 零工经济即采用众包方式来标注数据 62 | 2. 共享经济即帮助参与数据贡献的人获取数据变现收 63 | -------------------------------------------------------------------------------- /blockchain/bc-layer1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 一层网络 3 | created_date: 2022-08-03 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 公链与联盟链 9 | 10 | - 公链是完全开放的区块链网络,任何节点均可自由加入或退出,无需许可。 11 | - 联盟链是部分去中心化的区块链网络,由特定组织或联盟控制,节点需获得许可才能加入。 12 | 13 | ## Substrate 14 | 15 | - Substrate 是一个构造区块链的“轮子”。 16 | - 在Substrate之前,如果大家想要快速构造一条链,选择是非常少,而且可定制化程度也很低。基本上公链会fork Bitcoin,联盟链会直接使用Hyperledger。 17 | - Substrate是一个开箱即用的构造区块链的SDK,从简单的智能合约,到中层的链上逻辑,或者底层的p2p网络、数据库、共识,都可以自由定制。 18 | -------------------------------------------------------------------------------- /blockchain/bc-mine.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的挖矿 3 | created_date: 2022-03-20 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 链接 9 | 10 | - 芯片与算力 https://hashrate.no/GPUcalculator? 11 | - 矿池列表 https://miningpoolstats.stream/ 12 | 13 | ## POW 14 | 15 | 1. 通过对等节点,下载最新的块高(网络资源) 16 | 2. 完成下载一个块高后,进行块高的验证(CPU资源) 17 | 3. 检查本地块高是否最新,若否,继续同步;若是,评估出块条件。 18 | 4. 计算数学题,获取出块资格(CPU资源) 19 | 5. 生成一个块高(CPU资源) 20 | 6. 将块高进行广播(网络资源) 21 | 22 | ## 术语 23 | 24 | 1. Difficulty Target: 当计算出来的值小于等于这个值,则可以将交易封装成块高。 25 | 26 | 2. weight: 当前block的weight,往往和POW所付出的计算量相关,取决于项目的具体实现细节。 27 | 28 | 3. Cumulative Weight: 链上所有weight总合。当出现分叉时,最终会选择Cumulative Weight更大的一条链。 29 | 30 | 4. 比特币的出块时间 `出块时间(单位:秒) ≈ Difficulty_Target * 2^32 / 全网算力(单位:H/s)` 31 | 32 | 5. coinbase transaction 33 | 34 | - coinbase transaction 是矿工自己构建的,用于把出块奖励和手续费奖励给自己。 35 | - 区块里的第一个交易就叫做 coinbase transaction。 36 | - 每个交易都会包含一个 input 和一个 output 。 37 | - coinbase transaction 的 input 就是 coinbase 。 38 | - coinbase transaction 的 output 指向矿工的地址,总金额等于 coinbase 加上区块中全部交易的手续费。 39 | 40 | 6. nTime 区块中nTime表示该区块产生的近似时间。 41 | 42 | - 如果当前区块的时间戳大于前11个区块的的平均时间戳,并且小于“网络调整时间(Network-Adjusted Time)”+2小时,则认为该时间戳是有效的。 43 | - “网络调整时间”是指与你相连接的所有节点的平均时间。当节点A连接到节点B时,A从B处得到一个UTC标准的时间戳,A先转换成本地UTC标准时间保存起来,”网络调整时间“等于所有节点的本地UTC时间+所有相连节点的偏移量平均值。 44 | - ”网络调整时间“永远不会调整到超过本地系统时间70分钟以上。 45 | 46 | 7. nBits 区块中nBits(算法难度目标值)表示区块中的难度目标,该值被存为 系数/指数 16进制格式,前2位为指数,接下来6位为系数。 47 | 48 | 1. 难度目标计算的公式: `目标值 = 系数 * 2^(8 * (指数– 3))` 49 | 2. 假如一个难度为0x1903a30c,则`Target=0x03a30c * 2^(0x08 * (0x19 - 0x03))` 50 | 51 | 8. 全网难度调整 52 | 53 | 1. 比特币的全网难度调整公式 `New Difficulty = Old Difficulty * (Actual Time of Last 2016 Blocks / 20160 minutes)` 54 | 55 | 9. nNonce 区块中nNonce(工作量证明算法的计数器) 56 | 57 | 1. Nonce随机数通常不同,但是它以严格的线性方式增长,从0开始,每次HASH时都会增长,当Nonce溢出时(此事经常发生),生产交易的extraNonce项会增长,将改变Merkle树的根节点。 58 | 59 | ## 区块整体结构 60 | 61 | | 字节 | 字段 | 说明 | 62 | | :--- | :--------- | :----------------------------------------------------------- | 63 | | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 | 64 | | 80 | 区块头 | 组成区块头的几个字段 | 65 | | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 | 66 | | 不定 | 交易 | 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致 | 67 | 68 | - 块头 Block header 69 | 1. Block version, nbits, hash of previous block in the blockchain and some padding bytes, which are constants. 70 | 2. Nonce and ntime, which miner can modify already. 71 | 3. Merkle root hash, which is created by hashing of bitcoin transactions included in the particular mining job. 72 | 73 | ## 算力的单位 74 | 75 | - 1H/s=每秒1次哈希碰撞 76 | - 1KH/s=1024H/s 77 | - 1MH/s=1024KH/s 78 | - 1GH/s=1024MH/s 79 | - 1TH/s=1024GH/s 80 | - 1PH/s=1024TH/s 81 | - 1EH/s=1024PH/s 82 | -------------------------------------------------------------------------------- /blockchain/bc-miningpool.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的矿池 3 | created_date: 2022-06-07 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 矿池 9 | 10 | - 矿池在2010年诞生 11 | 12 | - 矿池协议 13 | 14 | 1. getwork 15 | 2. BetterHash 16 | 3. Stratum协议 https://braiins.com/stratum-v2 17 | 18 | - 一般矿池协议会带来的问题,矿池可以拥有矿工所没有的权利 19 | 20 | 1. 确定哪些交易可被纳入区块,或者不执行这些交易。 21 | 2. 在适当的条件下被贿赂重组区块链。 22 | 3. 积压交易mempool,以提高交易费率。 23 | 4. 未经矿工同意直接使用算力挖取竞争分叉链。 24 | 5. 非诚实挖矿,这样做的动机应该是别有用心的。 25 | 6. 使用矿工的算力为某提案提供信号支持。 26 | 27 | ## 矿池模式工作流程 28 | 29 | 1. sync程序负责同步广播块高。(挖矿可优化地方:加速同步与广播块高速度) 30 | 2. miner程序负责进行计算挖矿。(挖矿可优化地方:计算速度) 31 | 3. pool程序负责接收miner的计算结果(shared)。(挖矿可优化地方:pool和miner间的通讯机制等) 32 | 4. pool程序判断miner计算结果是否符合难度值,符合则将其发送给sync程序。 33 | 5. sync程序生成块并且广播。 34 | 35 | ## 矿池奖励分配方式 36 | 37 | - 参考链接 https://en.bitcoin.it/wiki/Comparison_of_mining_pools 38 | 39 | 1. PPS: 矿池每隔一个固定的时间区间就向矿工发放一笔固定金额的收益(算力占比没有变化的情况下)。 40 | 2. FPPS: FPPS与PPS很类似,唯一不同的是,它不仅支付预期的出块奖励,还给与矿工预期的交易手续费。 41 | 3. PPLNS 矿池每实际爆块一次,矿工按照算力占比分配收益。 42 | 4. PPS+: 是PPS和PPLNS的混合体。出块奖励按PPS模型向矿工发放理论预期值。交易手续费则按照PPLNS方式向矿工分配矿池实际收到的交易手续费。 43 | 44 | ## Stratum 协议 45 | 46 | - 参考链接 https://braiins.com/stratum-v1/docs#/ 47 | 48 | - stratum协议于2012年被引入来解决比特币行业的挖矿问题,是目前最常用的挖矿程序和矿池之间的TCP通讯协议。 49 | 50 | - 改进 51 | 52 | 1. vs getwork协议 53 | - Stratum协议将 miner程序 轮训 pool程序 获取挖矿任务改为 pool程序 广播挖矿任务给 miner程序。 54 | 2. vs 其它协议 55 | - 之前 miner程序 只能更改区块头的 nonce and ntime,Stratum协议引入 extranonce 字段,让 miner程序 也能创建区块头。 56 | 3. 使用json载体传递数据 57 | 58 | - 缺点: 不使用getblocktemplate协议的一个重要缺点是,stratum协议中矿工失去了构建自己 block templates 的能力(即选择哪些交易在他们开采的区块中)。 59 | 60 | - 流程 61 | 62 | 1. 任务订阅 63 | 2. 登入验证 64 | 3. 任务分配 65 | 4. 提交挖矿结果 66 | 5. 难道调整 67 | 68 | - Coinbase= Coinb1 + Extranonce1 + Extranonce2 + Coinb2 69 | 70 | - Extranonce2 由矿工生成。 71 | - 其它 矿池生成。 72 | 73 | ### 任务订阅 74 | 75 | 1. miner程序 通过 mining.subscribe 方法连接 pool程序,用来订阅工作。 76 | ```json 77 | // param参数可以填写 miner程序的相关信息,例如 矿机类型,版本号等。 78 | { 79 | "id":1, 80 | "method":"mining.subscribe", 81 | "params":[ 82 | "S9/4.0" 83 | ] 84 | } 85 | ``` 86 | 2. pool程序 通过 mining.notify 方法返回订阅ID、ExtraNonce1和ExtraNonce2_size给 miner程序 。 87 | ```json 88 | // subscription_id 订阅ID: ae6812eb4cd7735a302a8a9dd95cf71f 89 | // ExtraNonce1 用于构造coinbase交易: 08000002 90 | // Extranonce2_size miner程序生成ExtraNonce2时的期待长度: 4 字节 91 | { 92 | "id":1, 93 | "result":[ 94 | [ 95 | [ 96 | "mining.set_difficulty", 97 | "b4b6693b72a50c7116db18d6497cac52" 98 | ], 99 | [ 100 | "mining.notify", 101 | "ae6812eb4cd7735a302a8a9dd95cf71f" 102 | ] 103 | ], 104 | "08000002", 105 | 4 106 | ], 107 | "error":null 108 | } 109 | ``` 110 | 111 | ### 登入验证 112 | 113 | 1. miner程序 通过 mining.authorize 方法传递帐号和密码登录矿池。 114 | ```json 115 | { 116 | "params":[ 117 | "username_1", 118 | "password" 119 | ], 120 | "id":2, 121 | "method":"mining.authorize" 122 | } 123 | ``` 124 | 2. pool程序 返回true表示登录成功。 125 | ```json 126 | { 127 | "error":null, 128 | "id":2, 129 | "result":true 130 | } 131 | ``` 132 | 133 | ### 任务分配 134 | 135 | 1. pool程序 通过 mining.notify 方法定期给 miner程序 委派任务。 136 | ```json 137 | // job_id 任务ID: bf 138 | // prevhash 上一个区块哈希值: 4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000 139 | // Coinb1 coinbase交易初始化部分,包含区块高度: 010000000100000000000000000000000000000000000000000000000000000000000000 00ffffffff20020862062f503253482f04b8864e5008 140 | // Coinb2 coinbase交易最后的部分,包含矿工的收益地址和收益额等信息: 072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000 141 | // merkle_branch 部分交易ID哈希列表: ["c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12"] 142 | // version 区块版本号: 00000002 143 | // nBit 编码后的网络难度: 1c2ac4af 144 | // ntime 当前时间: 504e86b9 145 | // clean_jobs 清理任务: 如果为true,则停止miner程序所有任务,马上开始新任务;如果是false则等当前任务结束才开始新任务。 146 | { 147 | "params":[ 148 | "bf", 149 | "4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", 150 | "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff20020862062f503253482f04b8864e5008", 151 | "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000", 152 | [ 153 | "c5bd77249e27c2d3a3602dd35c3364a7983900b64a34644d03b930bfdb19c0e5", 154 | "049b4e78e2d0b24f7c6a2856aa7b41811ed961ee52ae75527df9e80043fd2f12" 155 | ], 156 | "00000002", 157 | "1c2ac4af", 158 | "504e86b9", 159 | false 160 | ], 161 | "id":null, 162 | "method":"mining.notify" 163 | } 164 | ``` 165 | 166 | ### 提交挖矿结果 167 | 168 | 1. miner程序 找到符合难度的结果时,通过 mining.submit 方法向 pool程序 提交share。 169 | ```json 170 | // 用户名:username_1 171 | // job_id 任务号:bf 172 | // ExtraNonce2 交易计数器,包含的交易数量,coinbase交易: 00000001 173 | // nTime 当前时间: 504e86ed 174 | // nonce: b2957c02 175 | {"params":["username_1","bf","00000001","504e86ed","b2957c02"],"id":4,"method":"mining.submit"} 176 | ``` 177 | 2. pool程序 返回true表示提交成功,如果失败则error中有具体原因。 178 | ```json 179 | {"error":null,"id":4,"result":true} 180 | ``` 181 | 182 | ### 难度调整 183 | 184 | 1. pool程序 通过 mining.set_difficulty 方法 调整难度。 185 | ```json 186 | // params参数里填写难度值 187 | {"id":null,"method":"mining.set_difficulty","params":[2]} 188 | ``` 189 | -------------------------------------------------------------------------------- /blockchain/bc-scale.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的扩容 3 | created_date: 2023-11-01 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 链接 9 | 10 | - 参考 https://www.8btc.com/article/6790168 11 | 12 | ## 扩容 13 | 14 | - 链上扩容: 通过改变一层主网协议达到扩容效果的解决方案。 15 | - 链下扩容: 不改变现有一层主网协议的扩容解决方案。 16 | 17 | ## 链上扩容 18 | 19 | 1. 方案一: 扩大区块空间,即增加每个区块打包的交易数量,但这会提高对高性能节点设备的要求,提高节点的加入门槛,降低了「去中心化」程度。 20 | 2. 方案二: 分片,将区块链账本分成若干部分,不再是每个节点参与所有记账,而是由不同分片即不同节点负责不同记账,并行计算可以同时处理多个交易;这样可降低节点计算压力和加入门槛,提高交易处理速度和去中心化程度;但这意味着全网算力被分散,会降低整个网络的「安全性」。 21 | 22 | ## 链下扩容_Layer2 23 | 24 | - L2是一系列链下扩容方案的总称,位于(并依赖于)L1网络之上,通过将交易放在L1网络之外进行处理,将交易的执行和资产结算分离,同时继承主网的共识和强大的去中心化和安全性,最后将数据可用性Data Availability(取决于不同L2的解决方案)和最终结算的状态上链。 25 | 26 | ### State Channel 27 | 28 | - 状态通道(State Channel): 利用多签智能合约,先将一定量的资金存入智能合约里,支持用户在链下进行无数次的免费交易,最后在主网进行最终结算。 29 | 30 | - 状态通道规定只有在通道打开、关闭或解决纠纷时,用户才需要与主网进行交互,并把用户与用户的交互放在链下进行,以此来降低用户交易的时间和金钱成本,并且实现交易次数不受限制。 31 | 32 | - 相关项目:Rainden、Celer。(闪电网络 利用的技术就是 状态通道) 33 | 34 | ### Rollup 35 | 36 | - Rollup: 在主网外执行交易(计算过程和状态存储),然后将原始数据压缩后发布到主网。 37 | - 优点: 通过仅仅在链上存储交易数据,从而减少目前存在的网络拥堵问题,提升速度,尽可能的降低Gas费用。 38 | 39 | ### Optimistic Rollup 40 | 41 | - 原理: 通过提出欺诈证明,确保链下状态的正确性。 42 | 43 | - 优点:有验证、交易数据完整性、数据压缩性。返回给Layer1的有交易结果和交易的信息,这些数据被压缩后返回给Layer1。 44 | 45 | - 缺点:提款到链上需要等待一定的周期。 46 | 47 | - 相关项目 48 | 49 | 1. Arbitrum 50 | 2. Optimism 51 | 1. 代币 OP 52 | 2. 与以太坊虚拟机(EVM)等效的Optimism虚拟机(OVM). 53 | 3. 2021年12月,Optimism主网正式上线。 54 | 3. Metis Andromeda 55 | 1. 分叉自Optimism 56 | 4. Boba Network 57 | 1. 分叉自Optimism,支持快速提款 58 | 2. 2021年9月,Boba主网公开上线。 59 | 3. Boba的特点是,借由一部分用户通过质押代币提供的流动性池,允许用户快速提款,而不必等待7天左右的反欺诈期结束。相应地,选择快速提款的用户需要向提供流动性的用户缴纳一定的费用 60 | 61 | ### ZK Rollup 62 | 63 | - 原理: 通过上传零知识证明,确保链下状态的正确性。 64 | 65 | - ZK Rollup 是基于零知识证明的二层扩容方案(layer2), ZK Rollup方案起源于18年下半年,由Barry Whitehat和Vitalik先后提出。Rollup顾名思义有“卷起”和“汇总”的意思,将大量的交易“卷起/汇总”打包成一个交易。原理为链下进行复杂的计算和证明的生成,链上进行证明的校验并存储部分数据保证数据可用性。 66 | 67 | - 优点:有验证、匿名性、数据压缩性。 68 | 69 | - 相关项目 70 | 71 | - zkSync 72 | - StarkNet 73 | - DEX Loopring 74 | - DEX dYdX 75 | - DEX zkSpace 76 | 77 | - 主流的 ZK Rollup 如StarkWare等,主要包含两大核心角色 78 | 79 | 1. Sequencer 排序器 80 | 1. 负责执行 Layer2 网络内的交易,将这些交易事件排序,打包成Batch(交易批次)。 81 | 2. 定期将 Batch 发布到Layer1上的指定智能合约(App State Smart Contract). 82 | 3. 耗时短,一台家用电脑,每秒可以生成4000笔交易。 83 | 2. Prover(Aggregator) 证明者 84 | 1. 监听读取 Batch ,为其生成一个 ZK Proof,发布到Layer1上的指定智能合约进行验证(Varifier Smart Contract)。 85 | 2. 耗时长,一台家用电脑,生成一个 Proof 需要1.5~2s。 86 | 87 | - 安全: 链下的每一次交易都需要提供零知识证明。 88 | 89 | 1. Sequencer 每次将很多个交易打包成一个 Batch ,存储进 App State Smart Contract 。 90 | 2. Prover 读取 Batch ,生成一个 ZK Proof , 给予 Varifier Smart Contract 进行验证。 91 | 3. 验证通过,链下的交易执行成功。 92 | 93 | ## 链下扩容_其它 94 | 95 | - 安全性并不是来源于主网的链下扩容解决方案。 96 | 97 | ### Sidechains侧链 98 | 99 | - 原理: 和主网并行独立运行的区块链,和主网通过双向桥进行通讯,通过改变区块参数和共识机制进行扩容。 100 | 101 | - 特性: 有自己的验证者、共识计算,通过桥接和主链进行通讯和交易。 102 | 103 | - 优点:减轻主网的负担。 104 | 105 | - 缺点:侧链是独立运行的,如果侧链上出现问题,比如侧链节点作恶或遭到攻击,会导致侧链执行交易有误,也就导致返回给Layer1的结果也是错误的。侧链的安全性不够。 106 | 107 | - 相关项目:POA,Loom,Skale Network,Ronin Network,xDai Chain。 108 | 109 | ### Plasma 110 | 111 | - 原理: 一个独立运行的区块链,通过把Merkle Root发布到主网的方式与主网进行瞄定,通过欺诈证明,确保链下状态的正确性。 112 | 113 | - Plasma是一种特殊的侧链。利用智能合约和默克尔树依附主链建立无数的子链。链外进行签名;需要结算时将一笔笔交易生成默克尔树根,将默克尔树根传进 Plasma 协议链上,... 114 | 115 | - 优点:有验证。Plasma不是完全被托管的,它使用了欺诈性证明的退出机制,当检测到plasma链上出现错误时,用户可以安全的从plasma链上退出,因此plasma具有更高的安全性。 116 | 117 | - 缺点:Plasma返回给Layer1的仅有交易结果、没有交易信息。侧链资产锁定期为7~14天才能提取到以太坊主链上。 118 | 119 | - 相关项目:OMG Network,Polygon(Matic) 120 | 121 | ### Validium 122 | 123 | - 与ZKRollup 类似,不同点在于交易数据(如状态变化)在链下。 124 | - 相关项目: DeversiFi、ZKSwap(支付、交易平台)、Sorare(足球NFT游戏)和Immutable X(NFT 市场) 125 | 126 | ### Volition 127 | 128 | - 给用户提供两种方案的选择,使用zkRollup或Validium。 129 | 130 | ## 以太坊 131 | 132 | - 以太坊扩容方案分为两个基本类别 133 | - 一类是将以太坊网络的工作任务拆分给节点,也就是ETH2要实现的链上分片。 134 | - 一类是让用户把大部分交易都放在以太坊链下的Layer2协议里,通过打包汇总交易提交到以太坊网络。 135 | 136 | ## 项目与方案 137 | 138 | 1. Scroll提出了名为PipeZK的ZK加速解决方案,该方案可以在普通消费级硬件上将ZK Proof的生成过程提高接近200倍。如果未来再结合FPGA和ASIC等专用硬件,加速效果或将进一步提升。 139 | 140 | 2. Polygon的Hermez项目组提出了一个新的构想,Proof Of Efficiency(POE),主要思想为允许多个Prover无需许可的参与到ZK Proof生成过程,并让这些Prover节点展开竞争,最终的Proof奖励只会分配给第一个成功的节点。 141 | -------------------------------------------------------------------------------- /blockchain/bc-tech-1-cryto.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的加密算法 3 | created_date: 2022-08-03 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 有限域运算 9 | 10 | ### 域定义 Field 11 | 12 | 1. 在抽象代数中,域是一种可进行加、减、乘和除运算的代数结构。 13 | 14 | 2. 域(Field)的定义是有如下特性的集合 15 | 16 | 1. 定义了加法和乘法 17 | 2. 集合内的元素经过加法和乘法计算,结果仍然在集合内 18 | 3. 计算符合交换率、结合率、分配率 19 | 4. 加法和乘法有单位元素(所有的集合内的值都有对应的负数,所有集合内非零值都有倒数) 20 | 21 | ### 有限域 Galois Field 22 | 23 | 1. 具有有限个元素的域就是有限域 Galois Field。 24 | 25 | 1. Galois Field这个名字纪念发明者Evariste Galois。 26 | 27 | 2. 有限域(Galois Field)的定义是有如下特性的集合 28 | 29 | 1. **定义模p加法和模p乘法(加或乘的结果超过p时,模p取余数。p为素数)** 30 | 2. 集合内的元素经过加法和乘法计算,结果仍然在集合内 31 | 3. 计算符合交换率、结合率、分配率 32 | 4. 加法和乘法有单位元素(所有的集合内的值都有对应的负数,所有集合内非零值都有倒数) 33 | 34 | 3. 一切有限域都有加法和乘法两种运算,并必须满足以下条件 35 | 36 | 1. 封闭性:若任意两元素a·b∈GF(q),则有`a+b∈GF(q) a·b∈GF(q)` 37 | 2. 结合律:若任意a、b、c∈GF(q),则有`(a+b)+c=a+(b+c),(a·b)c=a(b·c)` 38 | 3. 交换律,若任意a、b∈GF(q),则有`a+b=b+a,a·b=b·a` 39 | 4. 有乘法恒等元e和加法恒等元0,使任意元素a->∈GF(q)都有:`a+0=a, a·e=a` 40 | 5. 任意元素a->∈GF(q)都有乘法逆元素 和加法负元素(-a),使 `a+(-a)=0` 41 | 6. 乘对加分配律:任意a、b、c∈GF(q)有`a(b+c)=a·b+a·c` 42 | 43 | ## 椭圆曲线 44 | 45 | - 参考 https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/ 46 | 47 | - 椭圆曲线是满足如下方程的点 48 | 49 | ```python 50 | # 该方程称为椭圆曲线的Weierstrass方程 51 | y**2 = x**3 + a*x + b 52 | 4*a**3 + 27*b**2 != 0 53 | ``` 54 | 55 | - 特点 56 | 57 | - x轴上下的点,相互对称。 58 | - 加法同态。 59 | - 乘法同态。 60 | 61 | - 加法群 62 | 63 | - 加法群的定义: 一根直线穿过椭圆曲线的3个点,P、Q、R,则 P+Q=-R。 64 | - 椭圆曲线上的加法群属于阿贝尔群。 65 | 66 | - 椭圆曲线与密码学 67 | 68 | - 利用椭圆曲线来加密的就叫椭圆曲线密码学 Elliptic Curve Cryptography (ECC) 69 | - 比特币中使用的椭圆曲线算法是ECDSA,属于ECC范畴。 70 | 71 | - 非对称加密 72 | 73 | - 私钥 K 随机生成 74 | - 公钥 P = K * G (G可以是一个常数) 75 | 1. 如果知道G,也很难求出 K 76 | 2. 通过K和G,很容易求出 P 77 | 78 | ## 高深数学 79 | 80 | - 世界七大数学难题 81 | 82 | - NP完全问题、霍奇猜想、庞加莱猜想、黎曼假设、杨-米尔斯存在性和质量缺口、纳卫尔-斯托可方程、BSD猜想。 83 | 84 | - 什么是多项式时间求解 85 | 86 | - 如果1个算法时间复杂度是 O(n) 或 O(n^2)等,n在底数位置那么称之为可以多项式时间内求解。 87 | - 如果1个算法时间复杂度是 O(n!) 或 O(2^n)等,n在指数位置那么称之为不能在多项式时间内求解。 88 | 89 | - P问题和NP问题 90 | 91 | - P问题: 1个问题可以在多项式时间内求解。 92 | - NP问题: 1个问题可以在多项式时间内通过解进行验证。 93 | - 既然求解那么一定可以进行验证,P问题属于NP问题。 94 | 95 | - NPC问题: 存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。 96 | 97 | - 电路是1个经常被采用来描述1个NPC问题的方案。而且逻辑电路本身就是1个NPC问题。 98 | - 画电路不是真正的用绘图方式表达,而是用电路语言进行编写。 99 | 100 | - QSP/QAP 问题的思想来源: https://eprint.iacr.org/2012/215.pdf 101 | 102 | - SP - Span Program ,采用多项式形式实现计算的验证。 103 | 104 | - QSP - Quadratic Span Program,QSP 问题,实现基于布尔电路的 NP 问题的证明和验证。 105 | 106 | - QAP - Quadratic Arithmetic Program,QAP 问题,实现基于算术电路的 NP 问题的证明和验证,相对于 QSP,QAP 有更好的普适性。 107 | 108 | - QAP是一种非常适合于计算机进行表达和运算的形式。一个QAP问题包含一系列的算数表达式,这些算数表达式都是具有最多两个输入和一个输出的形式。例如 y=x+z 。 109 | - QAP问题可以让验证者在多项式时间内验证一个解是否正确,但在一个有限的时间内,使用有限的资源是很难在多项式时间内推出一个正确的解的。 110 | 111 | - PCP - Probabilistically Checkable Proof ,在 QSP 和 QAP 理论之前,学术界主要通过 PCP 理论实现计算验证。PCP 是一种基于交互的,随机抽查的计算验证系统。 112 | 113 | - NIZK - Non-Interactive Zero-Knowledge,统称,无交互零知识验证系统。NIZK 需要满足三个条件:1/ 完备性(Completeness),对于正确的解,肯定存在相应证明。 2/可靠性 (Soundness) ,对于错误的解,能通过验证的概率极低。3/ 零知识。 114 | 115 | - SNARG - Succinct Non-interactive ARGuments,简洁的无须交互的证明过程。 116 | 117 | - SNARK - Succinct Non-interactive ARgumentss of Knowledge,相比 SNARG,SNARK 多了 Knowledge,也就是说,SNARK 不光能证明计算过程,还能确认证明者“拥有”计算需要的 Knowledge(只要证明者能给出证明就证明证明者拥有相应的解)。 118 | 119 | - zkSNARK - zero-knowledge SNARK,在 SNARK 的基础上,证明和验证双方除了能验证计算外,验证者对其他信息一无所知。 120 | 121 | - Statement - 对于 QSP/QAP,和电路结构本身(计算函数)相关的参数。比如说,某个计算电路的输入/输出以及电路内部门信息。Statement 对证明者和验证者都是公开的。 122 | 123 | - Witness - Witness 只有证明者知道。可以理解成,某个计算电路的正确的解(输入)。 124 | 125 | - 同态与加密 126 | 127 | - 同态 128 | - 抽象代数中,同态是两个代数结构(例如群、环、或者向量空间)之间的保持结构不变的映射。 129 | - 乘法同态或加法同态可以理解为不同方式的映射。 130 | - 半同态加密 131 | - 如果一个密码学算法只满足乘法同态或加法同态,我们就称其为半同态加密。 132 | - 英文称为SHE(Somewhat Homomorphic Encryption)或PHE(Partially Homomorphic Encryption)。 133 | - 常见的乘法同态算法有RSA,ElGamal等,常见的加法同态算法有Pallier、Schorr协议等 134 | - 全同态加密 135 | - 如果一个密码学算法同时满足乘法同态和加法同态,我们就称其为全同态加密。 136 | - 英文称为FHE(Fully Homomorphic Encryption, FHE)。 137 | 138 | ## 密码学 139 | 140 | ### 术语 141 | 142 | 1. 密码学中加法或乘法运算的含义不局限于我们熟悉的实数域上加法或乘法运算的含义。 143 | 144 | ### 密码学的发展 145 | 146 | 1. 古典密码学 147 | 1. 维吉尼亚密码 148 | 2. 近代密码学 149 | 1. DES加密,只能通过穷举法进行破解。 150 | 2. 香农在 20 世纪 40 年代末发表的一系列论文,特别是 1949 年的「Communication Theory of Secrecy Systems (保密系统通信理论)」,把已有数千年历史的密码学推向了基于信息论的科学轨道,密码学终于从艺术转向科学。 151 | 3. 现在密码学 152 | 1. 1976年。 153 | 2. 1977年RSA,公钥加密。麻省理工学院的 Ron Rivest、Adi Shamir、Leonard Adleman 提出的非对称加密算法 RSA,有效的解决了密钥传送的问题,标志着密码学进入了百家争鸣的现代阶段。 154 | 3. 1978年HE,同态加密。人物:Rivest、Adleman、Dertouzos。 155 | 4. 1982年MPC,安全多方计算。人物:Yao。 156 | 5. 1989年ZKP,零知识证明。人物:Goldwasser、Micali、Rackoff。 157 | 158 | ### 哈希 159 | 160 | - 哈希(Hash) 161 | - 定义:也称为散列、哈希。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。 162 | - 特性:确定性、统一性、不可逆性 163 | - 比特币里使用到的哈希函数, SHA256(内容) 164 | - 常见的哈希算法 165 | 1. MD5 被用于文件防篡改 166 | 2. SHA256 被用于比特币挖矿 167 | 3. Merkle root 被用于证明数据片段 168 | 4. SimHash 被用于文本去重 169 | 170 | ### 数字签名 171 | 172 | - 签名 173 | 174 | - Sign(内容 + Private_Key) = Signature 175 | 176 | - 验证 177 | 178 | - Verify(内容 + Signature + Public_Key) 179 | 180 | - 在区块链网络中,进行交易时,私钥持有人需要进行一次签名。 181 | 182 | - 签名算法 183 | 184 | 1. ECDSA:最基础,不支持签名聚合,多签的时候必须依次验证。(使用案例:早期的Bitcoin公链) 185 | 2. Schnorr(Bitcoin Taproot):支持聚合签名,但有一些不足,主要是signer要进行交互。(使用案例:Bitcoin公链) 186 | 3. BLS:支持聚合签名,解决signer交互问题。(使用案例:ETH2、Filecoin) 187 | 188 | ## 数据结构-树 189 | 190 | - Trie树,又经常叫前缀树,字典树 191 | 192 | - 性质 193 | - 根节点不包含字符,除根节点外每个节点都只包含一个字符 194 | - 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 195 | - 每个节点的所有子节点包含的字符都不相同 196 | 197 | - Radix树,又经常叫基数树,压缩前缀树 198 | 199 | - 它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩(即这个节点将包含多个字符)。 200 | 201 | - Patricia树,又经常叫Patricia trie,crit bit tree,压缩前缀树 202 | 203 | - 它对Radix树进行了空间优化,对于Radix树的每个节点,如果该节点是唯一的儿子的话,就和父节点合并。 204 | 205 | - Merkle Tree 206 | 207 | - 存储hash值的一棵树。Merkle树的叶子节点存储数据块,非叶节点是其对应子节点串联字符串的哈希值。 208 | 209 | - MPT(Merkle Patricia Tree),又经常叫梅克尔帕特里夏树 210 | 211 | ### 默克尔树 212 | 213 | - 默克尔树(Merkle tree,MT)是一种哈希二叉树,是存储数据的一种数据结构,1979年由Ralph Merkle发明。 214 | 215 | - 链下默克尔树的生成 https://github.com/miguelmota/merkletreejs 216 | 217 | - 链上默克尔树的验证/合约 https://github.com/miguelmota/merkletreejs-solidity 218 | 219 | - 链上默克尔树的验证/库 https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol 220 | 221 | - 默克尔树在线工具 https://lab.miguelmota.com/merkletreejs/example/ 222 | 223 | - keccak256 224 | 225 | - https://www.npmjs.com/package/keccak256 226 | -------------------------------------------------------------------------------- /blockchain/bc-tech-2-network.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的网络协议 3 | created_date: 2022-08-03 4 | --- 5 | 6 | [TOC] 7 | 8 | ## P2P通信协议 9 | 10 | - DHT(Distributed Hash Table) 11 | - Libp2p 12 | - Gossip Protocol 13 | 14 | ### DHT 15 | 16 | - 用于传统的P2P网络中。例如BT网络。 17 | - 网络中,每个节点并不保存所有的数据。 18 | 19 | ### Libp2p 20 | 21 | - 定义: Libp2p 是一个模块化的网络栈,用于构建去中心化的点对点(P2P)网络通信。它提供了节点发现、连接管理、数据传输、加密等功能。 22 | - 作用: 提供底层网络支持,确保节点间的通信畅通,是一种通用的网络基础设施 23 | 24 | ### Gossip Protocol 25 | 26 | - 定义: Gossip 协议是一种用于消息传播的去中心化算法。节点通过与邻居交换消息和元数据,以分布式的方式传播信息。 27 | 28 | - 作用: 高效地传播数据或元数据,确保去中心化网络中消息可以快速扩散到所有节点。 29 | 30 | - 在分布式网络中 31 | 32 | - 每个节点保存全量的数据。 33 | - 每个节点从peer拉取数据达到和peer数据一致。 34 | - 每个节点收到或产生新数据的时候,会转发给peer,最终经过Multi-hop之后到达全网。 35 | 36 | - 优点: 37 | 38 | - 抗单点故障。 39 | - 抗网络阻隔。 40 | 41 | - 问题与解决方案 42 | 43 | 1. Multi-hop产生的消息延迟 44 | - 方式一:增加节点保的Peer数量,减少消息的跳转次数,使消息在更少的跳转次数下进行传递。 45 | - 方式二:排除恶意的Peer节点,通过打分机制。 46 | 2. 应对网络峰值,并发性引起的问题 47 | - 方式一:分批有序进行广播;例如先发送给打分机制里获取分数高的节点。 48 | 3. 数据不一致的问题,产生孤块 49 | - 方式一:通过多轮询问,并以与其中大多数Peer保持一致。(例如Avalance公链网络) 50 | 4. 消息隐私性 51 | - 方式一:改变消息的起点,消息通过几跳之后才开始广播。(例如Dandelion网络) 52 | - 方式二:改变消息的终点,消息进入加密池后才广播给其它节点。(例如Nym公链网络) 53 | - 方式三:改变消息通道。 54 | 55 | ## 加密协议 56 | 57 | ### Noise protocol 58 | 59 | 1. 官网 https://noiseprotocol.org/ 60 | 2. Rust版本的实现 https://github.com/mcginty/snow 61 | 3. 中文介绍 https://zhuanlan.zhihu.com/p/96944134 62 | 63 | ## 节点间的通信 64 | 65 | - 区块链网络中两个节点建立连接,发送握手信息 66 | 1. 区块高度 67 | 2. 创世hash 68 | 3. 最新区块Hash 69 | 4. 网络ID 70 | -------------------------------------------------------------------------------- /blockchain/bc-tech-3-consensus.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链的共识机制 3 | created_date: 2022-08-03 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 共识机制 9 | 10 | - 目的:保障分布式系统各个节点的数据一致性 11 | 12 | ### 传统可信任节点间的共识算法 13 | 14 | - Paxos和Raft算法 15 | 16 | ### 不可信任节点间的共识机制 17 | 18 | - 中本聪共识算法 19 | 20 | - 最长链的规则。 21 | - 当节点看到提议的区块拥有最多的工作量证明,那就接受它,所以它也是一种概率性的规则,确认的区块深度越长,交易就越难被逆转。 22 | 23 | - 经典共识算法 24 | 25 | - PBFT共识算法,当系统中的大多数参与者对提议区块投赞成票,系统中参与者将其接受为正确区块,且一旦投票通过,区块具有最终性,不存在回滚的可能。 26 | 27 | ## 提议区块机制(出块机制) 28 | 29 | 01. 工作量证明 POW(Proof of Work) 30 | 31 | 1. 达到可以打包出块的条件 32 | 2. 节点通过( 交易记录 + 上一个区块的哈希值 + 时间搓 + ... + Nonce ) 计算Hash值 33 | 3. Hash值满足系统规定的条件,则将数据进行打包出块;否则改变Nonce值,继续计算Hash值 34 | 4. 向一些节点发送区块,向其它节点节点发送区块Hash值 35 | 5. 当节点收到新的区块Hash值后,验证Hash值,诺正确则停止计算Hash值,并且主动去同步此区块 36 | 6. 当节点接收到新区块时,它将依据规则列表对其进行验证,验证成功则接受此区块 37 | 38 | - 安全的前提:不会出现某个节点的算力大于全网算力的50%。 39 | 40 | 02. 权益证明 PoS(Proof of Stake) 41 | 42 | - 根据节点持有代币的数量和时长决定账户获取出块权的概率。 43 | - 安全的前提:持币多者不会去篡改账本,破坏系统的信用。 44 | 45 | 03. 委托权益证明 DPoS(Delegated Proof-of-Stake) 46 | 47 | - 节点投票选出N个候选人,每次出块时,出块权随机分配给某个候选人。 48 | - 根据节点持有代币的数量和时长决定账户投票时的权重。 49 | 50 | 04. 权威证明 PoA(Proof of Authority) 51 | 52 | 05. 容量证明 (Proof-of-space,PoSpace,又称 Proof-of-Capacity,PoC) 53 | 54 | 06. 存储证明 (Proof-of-Storage, PoS) 55 | 56 | 1. 为存储空间提供的证明机制。 57 | 58 | 07. 数据持有性证明 PDP(Provable Data Possession) 59 | 60 | 1. 用户发送数据给矿工进行存储,矿工证明数据已经被自己存储,用户可以重复检查矿工是否还在存储自己的数据。 61 | 62 | 08. 可检索证明 (Proof-of-Retrievability,PoRet) 和PDP过程比较类似,证明矿工存储的数据是可以用来查询的。 63 | 64 | 09. 复制证明 (Proof-of-Replication,PoRep) 存储证明PoS的一个实际方案,用以证明数据被矿工独立地保存,可以防止女巫攻击,外源攻击和生成攻击。 65 | 66 | 10. 空间证明 (Proof-of-Space,PoSpace) 存储量的证明,PoSpace是PoW的一种,不同的是PoW使用的计算资源,而PoSpace使用的是存储资源。 67 | 68 | 11. 时空证明 (Proof-of-Spacetime,PoSt) 证明在一段时间内,矿工在自己的存储设备上实际的存储了特定的数据。 69 | 70 | 12. 活跃证明(Proof of Activity,PoA) 是一种PoW+PoS混合共识机制 71 | 72 | ## 拜占庭将军问题 73 | 74 | - 拜占庭将军问题是 Leslie Lamport (2013年的图灵讲得主)在1982年用来为描述分布式系统一致性问题(Distributed Consensus)时在[论文中](http://lamport.azurewebsites.net/pubs/byz.pdf) 抽象出来一个著名的例子。 75 | 76 | - 拜占庭容错 BFT (Byzantine Fault Tolerance) 77 | 78 | - 是这解决拜占庭将军问题的所有算法的一个总称。 79 | 80 | - 联邦拜占庭协议(FBA,Federated Byzantine Agreement) 81 | 82 | - 授权拜占庭容错算法(dBFT,Delegated Byzantine Fault Tolerance) 83 | 84 | ### 实用拜占庭容错算法 85 | 86 | - 名称: 实用拜占庭容错算法 PBFT(Practical Byzantine Fault Tolerance) 87 | - 来源: Miguel Castro和Barbara Liskov在1999年发表的论文中首次提出PBFT算法。 88 | - 功能: 是一种在信道可靠的情况下解决拜占庭将军问题的实用方法。 89 | - 算法要求 90 | 1. 总节点数N > 3F+1(其中F代表作恶节点) 91 | 2. 系统的失效节点数量不得超过全网节点的1/3 92 | 93 | ## Quorum机制 94 | 95 | - 为了保持数据冗余与一致性,需要对应的投票机制进行维持,这就是Quorum机制。 96 | 97 | ## DAG(Directed Acyclic Graph)有向无环图 98 | 99 | - DAG区块链的与传统区块链的区别 100 | 101 | 1. 单元:传统区块链组成单元是Block(区块),DAG组成单元是TX(交易)。 102 | 2. 拓扑:传统区块链是由Block区块组成的单链,只能按出块时间同步依次写入,类似于单核单线程CPU;DAG是由交易单元组成的网络,可以异步并发写入交易,类似于多核多线程CPU。 103 | 3. 粒度:区块链每个区块单元记录多个用户的多笔交易,DAG 每个单元记录单个用户交易。 104 | 105 | - 最早在区块链中引入DAG概念作为共识算法的是2013年,http://bitcointalik.org 上由ID为avivz78的以色列希伯来大学学者提出,也就是GHOST协议,作为比特币的交易处理能力扩容解决方案;Vitalik在以太坊紫皮书描述的POS共识协议Casper,也是基于GHOST POW协议的POS变种。 106 | -------------------------------------------------------------------------------- /blockchain/bc-tech.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链技术 3 | created_date: 2022-08-03 4 | --- 5 | 6 | [TOC] 7 | 8 | - 参考 9 | - 以太坊状态树 https://www.bcskill.com/index.php/archives/1253.html 10 | - 以太坊状态树 https://blog.csdn.net/shn111/article/details/122558968 11 | - 以太坊系统架构 https://www.graduate.nu.ac.th/wp-content/uploads/2019/05/4_Ethereum_Archiecture.pdf 12 | 13 | ## 区块链 14 | 15 | - 区块链技术是由分布式数据存储、点对点传输、共识机制、加密算法等计算机技术组成的新型应用模式。 16 | 17 | - 通过区块链技术可以实现一个去中心化的系统。 18 | 19 | - trustless 20 | 21 | - 系统中的共识节点可以达成一致的共识,不需要一个第三方的权威机构。 22 | 23 | - decentralized 24 | 25 | - 是trustless的子集。 26 | - 任意的计算机节点都有机会成为系统中的共识节点。 27 | 28 | - 分布式账本 29 | 30 | 1. 去中心化 31 | 2. 透明性性 32 | 3. 不可篡改性 33 | 34 | ## 区块链系统的层级结构 35 | 36 | 1. 数据层 37 | 38 | - 从还没有记录交易信息的创世区块起,直到现在仍一直在新添加的区块,构成的链式结构,里面包含了区块链的交易数据、哈希函数、merkel树、非对称公私钥、时间戳等。 39 | - 保存了系统的所有状态。 40 | 41 | 2. 网络层 42 | 43 | - 包含P2P网络、数据传输机制、数据验证机制。 44 | - 保证了系统是去中心化的,人人都有机会参与进来。 45 | 46 | 3. 共识层 47 | 48 | - 通过P2P网络从交易池下载交易数据,将交易进行排序与打包,执行交易,通过共识机制确认哪一个节点的区块能被保存进系统内。(状态转换的有效性达成共识,交易的排序和最终确定性。) 49 | - 共识算法: PoW、PoS、DPoS、PBFT、dBFT 等。 50 | - 保证了系统状态的一致性。 51 | 52 | 4. 激励层 53 | 54 | - 通过奖励系统代币的方式鼓励计算机节点参与系统的交易验证和记账打包成区块。 55 | - 保证了系统的正常运行。 56 | 57 | 5. 合约层 58 | 59 | - 包括各种脚本、代码、算法机制及智能合约。 60 | - 保证了系统的可编程性。 61 | 62 | 6. 应用层 63 | 64 | - 区块链的展示层,封装了区块链的各种应用场景和案例。 65 | - 保证了普通用户也能使用区块链系统。 66 | 67 | ## 区块链系统的账本模型 68 | 69 | ### 比特币系统与UTXO模型 70 | 71 | - UTXO全称为 unspent transaction outputs(未被花费的交易输出)。 72 | 73 | - 比特币系统与UTXO模型 74 | 75 | - UTXO是指关联比特币地址的比特币金额的集合,是一个包含数据和可执行代码的数据结构。 76 | - 一个UTXO的基本单位是“聪”,“聪”是比特币的最小计量单位,一个比特币等于10^8聪。 77 | - 只要全网保留了所有未被花费的交易,比特币链就能运行。 78 | 79 | - coinbase交易 80 | 81 | - 也称为创币交易,是区块的第一笔交易。 82 | - 比特币挖矿节点获得新区块的挖矿奖励,比如 12.5 个比特币,这时,它的钱包地址得到的就是一个 UTXO,这就是coinbase交易的输出。coinbase交易是一个特殊的交易,它没有输入,只有输出。 83 | 84 | - UTXO的创建与销毁 85 | 86 | 1. wallet_address_A 爆块奖励获取到了12.5枚比特币,则这12.5枚比特币都在一个UTXO里。 87 | 2. 现在 wallet_address_A 把 10 枚比特币转给 wallet_address_B。 88 | - 转账流程是: wallet_address_A 转 10 枚比特币给 wallet_address_B ,同时转 2.5 枚比特币给 wallet_address_A 。 89 | - UTXO机制里执行的流程是:wallet_address_A 原来的拥有12.5枚比特币金额集合的UTXO被销毁, wallet_address_B 获取一个新的拥有10枚比特币金额集合的UTXO, wallet_address_A 获取一个新的拥有2.5枚比特币金额集合的UTXO。 90 | 91 | - 防止双花 92 | 93 | - 定义:同一笔钱进行了两次交易 94 | - 生成新区块的时候,矿工会从以前的区块链中追溯,查看付款地址这次消费的比特币是不是以前没有被消费过。(即查看UTXO是否被销毁过) 95 | - 在比特币中,使用工作量证明算法的共识机制,负责出块的矿主检验每笔交易合法性,其它挖矿节点验证区块里交易的合法性。 96 | 97 | - 缺点 98 | 99 | - 需要计算某个地址中的余额时,需要遍历整个网络中的全部相关区块。 100 | - 可编程性差。 101 | 102 | - 优点 103 | 104 | - UTXO 模型是无状态的。即状态都被保存在每个UTXO里面,并不需要在网络里维护一个全局的状态。 105 | 106 | ### 以太坊系统与Account模型 107 | 108 | - 以太坊系统与Account模型 109 | 110 | - Account模型态通过默克尔树的结构保存了所以状态。链的状态在区块中以 StateRoot 和 ReceiptRoot 等形式进行共识。 111 | - 太坊系统就像一个状态机,它接受一个又一个的 Transaction 并不停改变自己的状态。 112 | - 只要全网保留了最新的状态,以太坊链就能运行。 113 | 114 | - 太坊系统为什么不像比特币系统一样直接使用哈希表存储数据,然后将哈希表组织成一棵Merkle tree用来证明交易的合法性? 115 | 116 | - 比特币系统中没有账户概念,交易由区块管理,而区块包含上限为4000个交易左右,每次发布一个区块对应一棵新的Merkle tree,一旦发布是不会改变的,所以Merkle Tree不是无限增大的。 117 | - 以太坊系统中,Merkle Tree用来组织账户信息,是要把所有的以太坊账户一起构建一个Merkle tree,这个数目比Bitcoin中的Merkle tree会大好几个数量级。 118 | - 以太坊系统中,实际上发生变化的仅仅为很少一部分数据,我们每次重新构建Merkle Tree代价很大。 119 | 120 | - 以太坊账户的数据结构 121 | 122 | - nonce (通过这个关键字防止双花) 123 | - ether_balance 124 | - contract_code 125 | - storage 126 | 127 | - 以太坊交易的数据结构 128 | 129 | - nonce(通过这个关键字防止双花) 130 | - from 131 | - to 132 | - input 133 | - value 134 | 135 | - addr:账户地址,以太坊中用的账户地址是160位,也就是20个字节,一般表示成40个十六进制的数(0~f)。 136 | 137 | - state:外部账户和合约账户的状态,包括余额、交易次数、合约账户还包括代码、存储。 138 | 139 | - 以太坊中采用什么数据结构来管理所有账户地址对应的状态的呢? 140 | 141 | - 采用的是MPT(Merkle Patricia Trie)树,即默克尔前缀树。 142 | - MPT是由 Merkle Tree、Patricia Tree(Trie) 和一些改进发明的 143 | 144 | - Patricia Trie 是一种升级版的 Trie,不同之处在于: 145 | 146 | - 非根节点可以存储字符串,而不是只能存储字符。 147 | - 因此当一个非根节点仅有一个子节点,则将其子节点与该节点合并,也就是路径压缩了的 Trie。 148 | - 节省了在内存空间的开销。 149 | - 增加了存储空间的开销。 150 | 151 | - 以太坊账户余额这样的数据并不直接保存在以太坊区块链的区块中。区块中只保存三种树的根节点哈希值。 152 | 153 | - 交易树 Transaction Trie 154 | - 世界状态树 World State Trie, 世界状态树是地址和帐户状态之间的映射。账户存储树(account storage contents trie)在世界状态树中构造叶节点。 155 | - 收据树 Receipt Trie 156 | 157 | ## 区块链系统的分叉问题 158 | 159 | 1. 分叉的原因: 160 | 161 | - 产生孤块(orphant block)。 162 | 163 | 2. 孤块的原因:去中心化、区块间隔、数据一致性 164 | 165 | - 去中心化程度越高,网络环境越差,将导致block和tx的全网同步速度变慢和节点间的状态难以时刻保持同步。 166 | - 区块间隔越短,节点越容易在非最新的高度上出块。 167 | 168 | 3. 分叉的结果 169 | 170 | - 区块链系统网络从此一分为二。 171 | 172 | 4. 分叉的缓解 173 | 174 | - Bitcoin网络,平均每10分钟产生一个块,区块链间隔时间比较长,在网络比较差的情况下各个节点状态也能保持同步,所以比较难产生孤块。 175 | - Ethereum ETH1.0网络,平均15秒产生一个块,通过特殊的机制去激励新产生的块去包含孤块,让新块和孤块都可以获得奖励,以此来缓解分叉的产生。 176 | - Filecoin网络,通过预期共识机制进行选举,在指定回合中可以选举多个矿工作为领导者,每个区块集合(tipset)包含1个或多个有效的同级区块。 177 | 178 | 5. 解决分叉 179 | 180 | - Bitcoin网络,通过最长链原则解决分叉。 181 | - Ethereum ETH1.0网络,通过最长链原则解决分叉。 182 | - Filecoin网络,通过tipset权重解决分叉。 183 | 184 | ## 区块链系统的不可能三角问题 185 | 186 | - Blockchain Trilemma 187 | - 不可能三角问题,是指目前没有任何一个区块链系统可以同时实现这三个特性。 188 | 189 | 1. Secure 安全性: 获得网络控制权需要花费的成本巨大以至于无法实现。 190 | 2. Throughput 可扩展性: 每秒钟可以处理大量的交易。 191 | 3. Decentralization 去中心化: 大量的参与者参与区块的生成和验证,不会受到一小群大型中心化参与者的控制。 192 | 193 | ## 区块链系统的模块化 194 | 195 | - 将单体的区块链系统转变为由多个独立的服务组成的区块链系统。 196 | - ![](./picture/bc_module.png) 197 | 198 | 1. 执行层 Execution 199 | 200 | - 交易和状态的改变首先会在这里进行处理,最后才会更新进共识层。通常用户也会通过执行层与系统进行交互,包括签名交易、部署智能合约以及转移资产。 201 | 202 | 2. 结算层 Settlement 203 | 204 | - 结算层用于验证 rollup 的执行结果以及解决争议。它不存在于单一型链中,是模块化堆栈的可选部分。类比一下,对于美国法院系统来说,结算层就好比它的最高法院,在争议问题上提供最终裁决结果。 205 | 206 | 3. 共识层 Consensus 207 | 208 | - 共识是指节点就区块链上的哪些数据可以验证为真实和准确的达成协议的机制。共识协议决定了交易的排序方式以及如何将新区块添加到链中。 209 | 210 | 4. 数据可用层 Data Availability 211 | -------------------------------------------------------------------------------- /blockchain/bc_base.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 区块链常识 3 | created_date: 2020-11-16 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 链常识 9 | 10 | 1. 区块链一条链是如何组成的? 11 | 12 | - 很多个全节点相互同步块高,组成一条链。 13 | 14 | 2. 全节点是什么,块高是什么? 15 | 16 | - 全节点可以比喻为一个数据库,是一个进程。 17 | - 块高为数据库里面的数据。 18 | 19 | 3. 共识节点的功能是什么? 20 | 21 | - 全节点可以是共识节点或非共识节点。 22 | - 共识节点具有生成块高的权限,让其它节点来同步块高。 23 | 24 | ## 合约常识 25 | 26 | 1. 区块链的智能合约是什么? 27 | 28 | 1. 运行在区块链上的程序。 29 | 2. 智能合约 通过调用区块链的接口,读写数据。 30 | 3. 外部程序 通过调用区块链的接口并且传递区合约地址,来调用智能合约的方法。 31 | 32 | 2. 编译合约 33 | 34 | 1. 通过 编译器 将 合约代码 编译为 符合运行在链上规格的 文件格式。 35 | 36 | ## 账户 37 | 38 | 1. EOA 外部账户 Externally Owned Accounts 39 | 2. AA 抽象账户 Account Abstraction 40 | -------------------------------------------------------------------------------- /blockchain/picture/BTCMerkleTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/blockchain/picture/BTCMerkleTree.png -------------------------------------------------------------------------------- /blockchain/picture/bc_module.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/blockchain/picture/bc_module.png -------------------------------------------------------------------------------- /ethereum/EIP.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-10-17 3 | --- 4 | 5 | [TOC] 6 | 7 | - EIP-1559 8 | - Vitalik Buterin于2019年提出的EIP-1559 (Ethereum Improvement Proposals 1559),描述了以太坊收费模式的变化。 9 | - 特点 10 | - 使gas价格更透明。 11 | - 销毁 baseFee,增加通缩机制。 12 | -------------------------------------------------------------------------------- /ethereum/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-06-11 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 以太坊 8 | 9 | 01. [以太坊节点部署与指令操作](./ethnode.md) 10 | 02. [以太坊虚拟机](./evm.md) 11 | 03. [Solidity-总览](./contract/solidity.md) 12 | 04. [Solidity-语法](./contract/grammer.md) 13 | 05. [Solidity-Gas费用](./contract/cost.md) 14 | 06. [Solidity-ERC标准](./contract/ERC.md) 15 | 07. [Solidity-日志错误](./contract/error.md) 16 | 08. [Solidity-区块链游览器](./contract/explorer.md) 17 | 09. [Solidity-常用第三方库](./contract/library.md) 18 | 10. [Solidity-NFT](./contract/library.md) 19 | 11. [Solidity-代码案例](./contract-code/) 后续都迁移进[mysolidity](https://github.com/garysdevil/mysolidity)代码仓库里,主要在 mytruffle/contracts/ 目录下 20 | -------------------------------------------------------------------------------- /ethereum/contract-code/Coin.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0 2 | pragma solidity ^0.8.4; 3 | 4 | contract Coin { 5 | // The keyword "public" makes variables 6 | // accessible from other contracts 7 | address public minter; 8 | mapping (address => uint) public balances; 9 | 10 | // Events allow clients to react to specific 11 | // contract changes you declare 12 | event Sent(address from, address to, uint amount); 13 | 14 | // Constructor code is only run when the contract is created 15 | constructor() { 16 | minter = msg.sender; 17 | } 18 | 19 | // Sends an amount of newly created coins to an address 20 | // Can only be called by the contract creator 21 | function mint(address receiver, uint amount) public { 22 | require(msg.sender == minter); 23 | balances[receiver] += amount; 24 | } 25 | 26 | // Errors allow you to provide information about 27 | // why an operation failed. They are returned 28 | // to the caller of the function. 29 | error InsufficientBalance(uint requested, uint available); 30 | 31 | // Sends an amount of existing coins 32 | // from any caller to an address 33 | function send(address receiver, uint amount) public { 34 | if (amount > balances[msg.sender]) 35 | revert InsufficientBalance({ 36 | requested: amount, 37 | available: balances[msg.sender] 38 | }); 39 | 40 | balances[msg.sender] -= amount; 41 | balances[receiver] += amount; 42 | emit Sent(msg.sender, receiver, amount); 43 | } 44 | 45 | // 获取余额 46 | function balance(address account) public view returns (uint) { 47 | return balances[account]; 48 | } 49 | } -------------------------------------------------------------------------------- /ethereum/contract-code/Merkle.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | // 参考 https://github.com/miguelmota/merkletreejs-solidity 3 | 4 | pragma solidity ^0.8.0; 5 | 6 | contract MerkleProof_1 { 7 | 8 | function verify( bytes32 leaf, bytes32[] memory proof ) public pure returns (bool){ 9 | // 将默克尔树的根节点存在链上 10 | bytes32 root = 0x1b404f199ea828ec5771fb30139c222d8417a82175fefad5cd42bc3a189bd8d5; 11 | bytes32 computedHash = leaf; 12 | 13 | for (uint256 i = 0; i < proof.length; i++) { 14 | bytes32 proofElement = proof[i]; 15 | 16 | if (computedHash < proofElement) { 17 | // Hash(current computed hash + current element of the proof) 18 | computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); 19 | } else { 20 | // Hash(current element of the proof + current computed hash) 21 | computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); 22 | } 23 | } 24 | 25 | // Check if the computed hash (root) is equal to the provided root 26 | return computedHash == root; 27 | } 28 | } 29 | 30 | contract MerkleProof_2 { 31 | 32 | function verify( bytes32[] memory proof ) public view returns (bool){ 33 | // 将默克尔树的根节点存在链上 34 | bytes32 root = 0x7691f40213397d36faeb13d0980ab0da02cad8647d5b71ba2a66faa0f932a7a3; 35 | // 取合约调用者作为叶子节点的哈希值 36 | bytes32 computedHash = keccak256(abi.encodePacked(msg.sender)); 37 | 38 | for (uint256 i = 0; i < proof.length; i++) { 39 | bytes32 proofElement = proof[i]; 40 | 41 | if (computedHash < proofElement) { 42 | // Hash(current computed hash + current element of the proof) 43 | computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); 44 | } else { 45 | // Hash(current element of the proof + current computed hash) 46 | computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); 47 | } 48 | } 49 | 50 | // Check if the computed hash (root) is equal to the provided root 51 | return computedHash == root; 52 | } 53 | } -------------------------------------------------------------------------------- /ethereum/contract-code/MyERC1155.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | 3 | pragma solidity ^0.8.0; 4 | 5 | import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol'; 6 | // import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; 7 | 8 | contract MyERC1155 is ERC1155 ('GGWorld'){ 9 | function mint(address to, uint256 id, uint256 amount) internal virtual { 10 | bytes data; 11 | _mint(to, id, amount, data); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /ethereum/contract-code/ether.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /ethereum/contract-code/metamask.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 35 | 36 | 37 | 38 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ethereum/contract-code/simple.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0 //指定开源协议 2 | pragma solidity >=0.6.0 <0.9.0; //指定编译版本在0.6.0到0.9.0范围内 // ^0.6.0;指定编译版本为0.6.*系列 3 | 4 | // 5 | contract HelloWorld { 6 | function helloWorld() external pure returns (string memory) { 7 | return "Hello, World!"; 8 | } 9 | function double(uint num) public pure returns (uint) { 10 | return num*2; 11 | } 12 | } 13 | 14 | // 15 | contract SimpleStorage { 16 | uint storedData; 17 | 18 | function set(uint x) public { 19 | storedData = x; 20 | } 21 | 22 | function get() public view returns (uint) { 23 | return storedData; 24 | } 25 | } -------------------------------------------------------------------------------- /ethereum/contract-code/web3_listener.js: -------------------------------------------------------------------------------- 1 | const Web3 = require('web3') 2 | const fs = require('fs') 3 | 4 | const wsURL = "ws://127.0.0.1:8544" 5 | 6 | const web3 = new Web3(); 7 | var eventProvider = new Web3.providers.WebsocketProvider(wsURL); 8 | (() => { 9 | eventProvider.on('error', e => { 10 | console.error('WS Infura Error', e); 11 | }); 12 | eventProvider.on('connect', function () { 13 | console.log('WS Connected'); 14 | setupListeners(); 15 | }); 16 | eventProvider.on('end', e => { 17 | console.log('WS closed'); 18 | }); 19 | web3.setProvider(eventProvider); 20 | })() 21 | // 或者 // const web3 = new Web3(wsURL) 22 | 23 | const setupListeners = async _ =>{ 24 | eventWatch(); 25 | } 26 | 27 | 28 | const eventWatch = async _ =>{ 29 | const source = fs.readFileSync("./mytruffle/build/contracts/Coin.json", 'utf8'); 30 | abi = JSON.parse(source).abi 31 | const contractAddress = '0xdc64ae94db27325cdf53b9c336bbe5484100e177' 32 | const contractInstance = new web3.eth.Contract(abi, contractAddress) 33 | 34 | // 监听某个事件 35 | await contractInstance.events.Sent({}, '', (error, result) => { 36 | console.log('------', new Date()) 37 | if (!error) { 38 | amount = result.returnValues.amount 39 | from = result.returnValues.from 40 | to = result.returnValues.to 41 | console.log("Coin transfer: " + amount + " coins were sent from " + from + " to " + to + "."); 42 | console.log("Balances now:"); 43 | contractInstance.methods.get(from).call( (err, result) => { console.log("Sender: ", result) }) 44 | contractInstance.methods.get(to).call((err, result) => { console.log("Receiver: ", result) }) 45 | }else{ 46 | console.log(error) 47 | } 48 | }) 49 | // 监听所有事件 50 | await contractInstance.events.allEvents({}, '', (error, result) => { 51 | console.log('------', new Date()) 52 | if (!error) { 53 | console.log("result", result); 54 | }else{ 55 | console.log("error", error) 56 | } 57 | }) 58 | 59 | // 监听一个事件的一次触发 60 | await contractInstance.once(事件名称, {}, (error, result) => {}) 61 | // 获取所有的历史事件 62 | await contractInstance.getPastEvents(事件名称, {fromBlock: 0, toBlock: 'latest'}, (error, result) => {}) 63 | 64 | 65 | } 66 | 67 | -------------------------------------------------------------------------------- /ethereum/contract-code/web3_merkle.js: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // 4 | // 5 | // 6 | // 8 | // 9 | // 10 | const { MerkleTree } = require('merkletreejs') 11 | const keccak256 = require('keccak256') 12 | // const SHA256 = require('crypto-js/sha256') 13 | 14 | initTree = (stringArrayVar) => { 15 | const leaves = stringArrayVar.map(v => keccak256(v)) 16 | return new MerkleTree(leaves, keccak256, { sort: true }) 17 | } 18 | 19 | getData = _ => { 20 | return ['addrees1', 'addrees2', 'addrees3', 'addrees4'] 21 | } 22 | 23 | getProof = ( tree, stringVar ) => { 24 | const leaf = keccak256(stringVar) 25 | return tree.getHexProof(leaf) 26 | } 27 | 28 | // 链上验证数据是否属于默克尔树 29 | verifyOnline = async( tree ) => { 30 | const Web3 = require('web3') 31 | const fs = require('fs') 32 | const rpcURL = "以太坊节点的RPC地址端口" 33 | const web3 = new Web3(rpcURL) 34 | const source = fs.readFileSync("abi文件路径", 'utf8'); 35 | abi = JSON.parse(source).abi 36 | const contractAddress = '合约地址' 37 | const contractInstance = new web3.eth.Contract(abi, contractAddress) 38 | 39 | leave = keccak256('addrees1') 40 | proof = getProof(tree, 'addrees1') 41 | // 方式一 42 | await contractInstance.methods.verify(leave, proof).call((err, result) => { 43 | console.log('result', result) 44 | console.log('err', err) 45 | }) 46 | // 方式二,链上取调用者地址作为叶子节点 47 | await contractInstance.methods.verify( proof ).call({from: 'addrees1'},(err, result) => { 48 | console.log('result', result) 49 | console.log('err', err) 50 | }) 51 | 52 | } 53 | 54 | (async _ =>{ 55 | const tree = initTree(getData()) 56 | const root = tree.getHexRoot() 57 | // MerkleTree.print(tree) 58 | // console.log(root) 59 | 60 | // 链下验证数据是否属于默克尔树 61 | // const data = 'a' 62 | // console.log(tree.verify(getProof(data), keccak256(data), root)) // false 63 | 64 | 65 | 66 | })() 67 | -------------------------------------------------------------------------------- /ethereum/contract-code/web3_rpc.js: -------------------------------------------------------------------------------- 1 | // - web3.js库是一个javascript库,可以执行很多与区块链进行交互的任务 2 | // - 下载web3.js库 npm install web3 -g 3 | 4 | 5 | const Web3 = require('web3') 6 | const fs = require('fs') 7 | const rpcURL = "http://127.0.0.1:8545" // 连接节点的地址 8 | const web3 = new Web3(rpcURL) // 创建Web3连接 9 | 10 | const accountArr = ["0x03118E2c88676d31ee397E1eEf7789fECfbC40b9", 11 | ""] 12 | 13 | // 创建账户/解锁账户 14 | // 非私链上,请务必不要进行解锁操作,否则任何第三方都可以直接通过你的账户地址进行相关操作 15 | const createAccount = _ =>{ 16 | // 方式一 17 | // var newAccount = web3.eth.accounts.create(); 18 | // var address = newAccount.address 19 | // var privateKey = newAccount.privateKey 20 | // // console.log("address=" + address,"\nprivateKey=" + privateKey) 21 | // web3.eth.accounts.privateKeyToAccount(privateKey) // 解锁账户 22 | // return address 23 | 24 | // 方式二 25 | password="123456" 26 | web3.eth.personal.newAccount(password,(err, address)=>{ 27 | console.log(address) 28 | web3.eth.personal.unlockAccount(address, password, 14400).then(console.log('Account unlocked!')); 29 | }); 30 | // 返回账户列表;web3.eth.accounts.create() 创建的账户不会被添加到这个列表中 31 | web3.eth.personal.getAccounts().then(console.log); 32 | } 33 | 34 | // 获取账户余额 35 | const getBalance = async address =>{ 36 | await web3.eth.getBalance(address, (err, wei) => { 37 | if (err){ 38 | throw new Error('Function getBalance:' + err) 39 | // exit(1) 40 | } 41 | // 余额单位从wei转换为eth 42 | balance = web3.utils.fromWei(wei, 'ether') 43 | console.log("balance: " + balance) 44 | // return balance 45 | }) 46 | } 47 | 48 | // 私链转账以太坊 49 | const sendTransaction = async (addressFrom, addressTo) =>{ 50 | await web3.eth.sendTransaction({ 51 | from: addressFrom, 52 | to: addressTo, 53 | value: "1000000000000000000" //1 eth 54 | }) 55 | .then(function(receipt){ 56 | console.log(receipt); 57 | }); 58 | } 59 | 60 | // 查看当前块高 61 | const getBlockNumber = _ =>{ 62 | web3.eth.getBlockNumber().then(console.log); 63 | } 64 | 65 | const keystore = _ =>{ 66 | // 通过keystore解密出私钥 67 | keystoreJsonV3 = {"address":"907cc33c0b606f75836b6818beff2a926645b9ba","crypto":{"cipher":"aes-128-ctr","ciphertext":"704ac767d5e8eee15719095941ce81f16a7bca11e500e5b44ba9044f08fcc8d4","cipherparams":{"iv":"3986def9537641a6e39f13cfe95a9ecd"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":4096,"p":6,"r":8,"salt":"74f2d73f157386f0623d6dd957b4f777d08a608ec8e854bb04549520bc6deb96"},"mac":"a049bec1d55115b830233f4861428c9c7874dbde575e8944b6d0892de8fd5040"},"id":"91a56a11-6259-4a2c-b77e-06f57ba81381","version":3} 68 | console.log( web3.eth.accounts.decrypt(keystoreJsonV3, '密码') ); 69 | 70 | // 通过私钥生成keystore 71 | privateKey='0x3ecd8ed343b61c028e612eb9f7149e2d88df51719c4ef7acf787b68a4f2bd44e' 72 | password='123456' 73 | console.log( web3.eth.accounts.encrypt(privateKey, password) ); 74 | } 75 | 76 | 77 | const contract = _ =>{ 78 | // 获取合约实例 79 | const source = fs.readFileSync("./Coin.json", 'utf8'); 80 | abi = JSON.parse(source).abi 81 | const contractAddress = '0xdc64ae94db27325cdf53b9c336bbe5484100e177' 82 | const contractInstance = new web3.eth.Contract(abi, contractAddress) 83 | 84 | // 查看abi接口 85 | console.log(contractInstance.options.jsonInterface) 86 | 87 | // 合约函数gas费评估 88 | // contractInstance.methods.方法名(参数).estimateGas({value: 如果合约函数需要收取一定的以太坊费用,则需要填写}) 89 | contractInstance.methods.buy(1,["0x"]).estimateGas({value: 100000000000000000}) 90 | .then(function(gasAmount){ 91 | console.log("Function estimateGas", gasAmount); 92 | }) 93 | .catch(function(error){ 94 | console.log("Function estimateGas", error); 95 | }); 96 | 97 | // 执行一次调用,并不会改变链上的状态 98 | contractInstance.methods.方法名(参数).call((err, result) => { console.log("error="+err+"\n"+"result="+result) }) 99 | 100 | // 发送一次交易,会改变链上的状态 101 | contractInstance.methods.方法名(参数).send({from: 账户地址},(err, result) => { console.log("error="+err+"\n"+"result="+result) }) 102 | contractInstance.methods.方法名(参数).send( 103 | { from: accountArr[0], 104 | gasLimit: 3000000, 105 | gas: 400000, 106 | gasPrice: 21000, 107 | value: 1000000000000000000 108 | }, 109 | (err, result) => { 110 | console.log("result=", result) 111 | console.log("error=", err) 112 | } 113 | ) 114 | 115 | // 查看合约之前的所有事件 116 | contractInstance.getPastEvents( 117 | 'AllEvents', // 过滤事件参数,这里获取全部事件 118 | { 119 | fromBlock: 0, // 起始块 120 | toBlock: 'latest' // 终止块 121 | }, 122 | (err, events) => { console.log(events) } // 回调函数 123 | ) 124 | } 125 | 126 | 127 | // web3.js 获取metamask签名进行交易 https://www.cxyzjd.com/article/xilibi2003/82700542 128 | // const tx = { 129 | // // nonce: 账户地址的第n笔交易, // nonce值必须=(此账户已完成的交易数+1) 130 | // // 合约地址 或 账户地址 131 | // to: contractAddress, 132 | // // gasLimit,指定gas的限制;以太坊程序内部设置了矿工打包块交易的gas费不能超过8百万,因此可以设置的最大值为8000000 133 | // gas: 8000000, 134 | // // optional if you are invoking say a payable function 135 | // value: 100000000000000000, 136 | // // this encodes the ABI of the method and the arguements;如果进行转账操作则设置data为空字符串 137 | // data: contractInstance.methods.buy(1, ["0x"]).encodeABI() 138 | // }; 139 | const signTransaction = async (tx, privateKey) =>{ 140 | const signPromise = web3.eth.accounts.signTransaction(tx, privateKey); // 对交易进行签名 141 | await signPromise.then(async (signedTx) => { 142 | // 对交易进行广播 143 | return await web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction); 144 | }).then(async (receipt,err) => { 145 | if (err){ 146 | console.log("Function signTransaction:", err) 147 | }else{ 148 | console.log("Function signTransaction:", receipt) 149 | } 150 | }).catch((err) => { 151 | console.log("Function signTransaction:", err) 152 | }); 153 | } 154 | 155 | module.exports = { 156 | sendTransaction 157 | }; -------------------------------------------------------------------------------- /ethereum/contract/ERC.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | - EIP (Ethereum Improvement Proposal) 8 | - EIP 是以太坊改进提案,主要用于描述以太坊平台的技术规范和潜在变化。 9 | - ERC (Ethereum Request for Comments) 10 | - ERC 是以太坊请求评论,实际上是 EIP 的一个子集,主要用于对以太坊应用层面的标准进行定义,特别是智能合约的标准。 11 | 12 | ## 以太坊提案 13 | 14 | - 提案 https://eips.ethereum.org/EIPS/eip-20 15 | 16 | 1. eip-20 17 | 18 | - Token Standard 同质化代币标准 19 | - Vitalik Buterin于2015年6月提 20 | 21 | 2. eip-165 22 | 23 | - 标准接口检测协议;创建一个标准方法以发布和检测智能合约实现了哪些接口 24 | 25 | 3. eip-223 26 | 27 | - 兼容EIP20,保护投资者以防意外的合约转账 28 | 29 | 4. eip-721 30 | 31 | - Non-Fungible Token Standard 非同质化代币标准 简写为NFT 32 | - 可以作为产权进行交易 33 | 34 | 5. eip-1155 Multi Token Standard 35 | 36 | - 介于同质化代币与非同质化代币之间可以相互切换的代币标准 37 | - 并不是某一种代币标准,而是操作多个erc20,erc721合约的标准(实现同时查询多种Token余额, 同时转账多种Token) 38 | 39 | 6. eip-4626‌ 40 | 41 | 1. 货币化资金库标准 42 | 2. EIP-4626 标准的实施,可以有效减少 DeFi 协议之间的摩擦,并增加可组合性 43 | 44 | 7. eip-6551 Non-fungible Token Bound Accounts 45 | 46 | 1. - 47 | 48 | 8. eip-2612 49 | 50 | 1. 通过链下签名授权实现更少 Gas 的 ERC20标准代币 51 | 52 | ## ERC165 53 | 54 | - 兼容 ERC-165的合约应该实现以下接口 55 | ```js 56 | interface ERC165 { 57 | /// @notice 查询一个合约时实现了一个接口 58 | /// @param interfaceID 参数:接口ID, 参考上面的定义 59 | /// @return true 如果函数实现了 interfaceID (interfaceID 不为 0xffffffff )返回true, 否则为 false 60 | function supportsInterface(bytes4 interfaceID) external view returns (bool); 61 | } 62 | ``` 63 | 64 | ## ERC20 65 | 66 | - 解读ERC20合约的实现 67 | 68 | - https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol 20210620版本 69 | 70 | - 对一些概念进行定义 71 | 72 | - 用户:账户地址 73 | - 操作员:被授权操作某个账户地址上一定数量Token的账户地址 74 | 75 | - 当我们自定义的合约继承ERC20合约时,则需要调用_mint函数来获取自己发行的同质化代币。 76 | 77 | ### 状态变量 78 | 79 | 1. mapping(address => uint256) private \_balances; 80 | - 记录某用户拥有Token的数量 81 | 2. mapping(address => mapping(address => uint256)) private \_allowances; 82 | - 记录某操作员可以操作某用户的Token数量 83 | 3. uint256 private \_totalSupply; 84 | - 记录当前合约Token的总量 85 | 4. string private \_name; 86 | - Token的名称 87 | 5. string private \_symbol; 88 | - Token名称的简写 89 | 90 | ### 函数 91 | 92 | 01. name() 93 | - 返回Token的名字 94 | 02. symbol() 95 | - 返回Token名字的简称 96 | 03. decimals 97 | - 展示时显示多少位小数 98 | 04. totalSupply() 99 | - 返回Token的总供应量 100 | 05. balanceOf 101 | - 返回用户拥有的Token数量 102 | 06. transfer 103 | - 用户转账给另一个用户 104 | 07. allowance 105 | - 返回被操作员拥有操作指定账户地址的Token数量 106 | 08. approve 107 | - 用户授权操作员可以操作自己的Token数量 108 | 09. transferFrom 109 | - 指定发送方和接收方,进行转账 110 | 10. increaseAllowance 111 | - 用户增加操作员可操作自己Token的数量 112 | 11. decreaseAllowance 113 | - 用户减少操作员可操作自己Token的数量 114 | 12. \_mint 115 | - 指定用户获取指定数量的Token 116 | 13. \_burn 117 | - 指定用户烧毁掉指定数量的Token 118 | 119 | ## ERC721 120 | 121 | - 对一些角色进行定义 122 | 123 | - 用户:账户地址 124 | - 操作员:拥有操作指定Token权利的账户地址(一枚Token只能拥有一位操作员) 125 | - 代理人:拥有操作指定用户所有Token的账户地址(一位用户可以拥有多位代理人) 126 | 127 | - 当我们自定义的合约继承ERC721合约时,则需要调用_mint函数来获取自己发行的非同质化代币。 128 | 129 | ### 状态变量 130 | 131 | 1. string private \_name; 132 | 133 | - 记录Token的名字 134 | 135 | 2. string private \_symbol; 136 | 137 | - 记录Token名字的简称 138 | 139 | 3. mapping(uint256 => address) private \_owners; 140 | 141 | - 记录某个Token归属于哪位用户 142 | 143 | 4. mapping(address => uint256) private \_balances; 144 | 145 | - 记录某个用户拥有Token的数量 146 | 147 | 5. mapping(uint256 => address) private \_tokenApprovals; 148 | 149 | - 记录某个Token被授权给哪位操作员 150 | 151 | 6. mapping(address => mapping(address => bool)) private \_operatorApprovals; 152 | 153 | - 记录某位用户的所有Token授权给了哪位代理人 154 | 155 | ### 函数 156 | 157 | 01. balanceOf 158 | - 返回用户拥有的Token数量 159 | 02. ownerOf 160 | - 判断用户是否持有这枚Token 161 | 03. tokenURI 162 | - 返回这枚Token的内容 163 | 04. approve 164 | - 用户授权某枚Token的操作权利给操作员 165 | 05. getApproved 166 | - 返回Token的操作员 167 | 06. setApprovalForAll 168 | - Token拥有者授权给某个用户使其成为代理人 169 | 07. isApprovedForAll 170 | - 判断一位用户是否是另一位用户的代理人 171 | 08. transferFrom 172 | - 转账 173 | 09. safeTransferFrom 174 | - 转账,并且判断接收方是否是智能合约以及它是否有转出Token的函数。 175 | 10. \_mint 176 | - 用户获取一枚Token 177 | 11. \_burn 178 | - 用户烧毁一枚Token(用户需要是这枚Token的拥有者) 179 | 180 | ## ERC1155 181 | 182 | - https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md 183 | 184 | ### 状态变量 185 | 186 | 1. mapping(uint256 => mapping(address => uint256)) private \_balances; 187 | 188 | - 记录一位用户拥有的指定类型Token的数量 189 | 190 | 2. mapping(address => mapping(address => bool)) private \_operatorApprovals; 191 | 192 | - 记录一位用户的所有Token授权给了哪位代理人 193 | 194 | 3. string private \_uri; 195 | 196 | - 记录指定类型的Token的元数据地址 197 | 198 | ### 函数 199 | 200 | #### 公开 201 | 202 | 1. uri 203 | - 返回指定类型的Token的元数据,通过id区别不同的类型Token 204 | 2. balanceOf 205 | - 返回用户拥有指定类型的Token的数量 206 | 3. balanceOfBatch 207 | - 返回多个用户拥有所指定类型的Token的数量 208 | 4. setApprovalForAll 209 | - Token拥有者授权给某个用户使其成为代理人 210 | 5. isApprovedForAll 211 | - 判断一位用户是否是另一位用户的代理人 212 | 6. safeTransferFrom 213 | - 将指定用户的指定类型的代币转给指定用户 214 | 7. safeBatchTransferFrom 215 | - 将指定用户的多个指定类型的代币转给指定用户 216 | 217 | #### 内部 218 | 219 | 1. \_mint 220 | - 指定用户获取指定类型指定数量的Token 221 | 2. \_mintBatch 222 | - 指定用户获取多个指定类型指定数量的Token 223 | 3. \_burn 224 | - 燃烧指定用户指定类型的指定数量的Token 225 | 4. \_burnBatch 226 | - 燃烧指定用户多个指定类型的指定数量的Token 227 | 5. \_setURL 228 | - 设置指定类型的Token的元数据地址,通过id区别不同的类型Token 229 | -------------------------------------------------------------------------------- /ethereum/contract/cost.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 交易费用 8 | 9 | - Gas 10 | 11 | - 是以太坊上的一种操作复杂度成本衡量单位。 12 | - 以太坊为所有的操作都规定了Gas的消耗数量;即每种类的交易,消耗的Gas数量都是固定的。 13 | - Gas等于诺干个以太坊代币,根据以太坊链上交易状况拥挤情况,动态变化。 14 | 15 | - EIP-1559 16 | 17 | - https://notes.ethereum.org/@vbuterin/eip-1559-faq 18 | - https://eips.ethereum.org/EIPS/eip-1559#specification 19 | - https://timroughgarden.org/papers/eip1559.pdf 20 | - 大大地减弱了矿工操纵交易费用的动机,维护了以太坊交易费用的稳定性。 21 | 22 | ### 以太坊代币单位 23 | 24 | - 1ETH = 1000Finney 25 | - 1Finney = 1000Szabo 26 | - 1Szabo = 1000Gwei 27 | - 1Gwei = 1000Mwei 28 | - 1Mwei = 1000Kwei 29 | - 1Kwei = 1000Wei 30 | - 一个ETH 等于一千 Finney,一百万 Szabo,十亿Gwei,万亿Mwei,千万亿 Kwei,百万万亿 Wei 31 | - 1 ETH = 1000000000000000000 Wei = 1000000000 Gwei 32 | - 1 Gwei = 0.000000001 ETH 33 | - 1 Gwei = 1000000000 wei (10亿个wei) 34 | 35 | ### EIP-1559升级前交易费用 36 | 37 | 1. 交易费用 = GasPrice * GasUsed 38 | - GasUsed(gas):交易消耗的总 gas 数量。 39 | - GasPrice(gwei):即对单位 gas 的定价,1 gwei= 10^(-9) eth。 40 | 2. 采用竞价机制,GasPrice 设置越高,交易处理速度越快。 41 | 3. 交易由矿工处理,矿工费完全由矿工收取。 42 | 43 | - Gas limit 44 | 45 | - 用户设置Gas Limit 46 | - 用户愿意为执行某个操作或确认交易支付的最大Gas数量。交易过程中,如果实际消耗的Gas used > Gas Limit,这个交易就无法执行完成,就回滚到执行之前的状态,这个时候矿工会收取Gas Price\*Gas Limit的费用。(Gas最小为21000,最大为8000000) 47 | - 矿工设置的Gas Limit 48 | - 区块中有一个Gas上限,收纳的交易会出现不同的用户指定的Gas Limit。那么矿工就会根据区块限制的Gas Limit来选择,“合理”选择打包交易。 49 | - 21000 是以太坊交易中使用的最小燃料数量。 50 | 51 | - Gas Price 52 | 53 | - 用户愿意花费于每个 Gas 单位的价格 54 | - 用户进行一次交易,想大概支付的gas价格,以太坊默认的Gas Price是1Gwei。 55 | 56 | ### EIP-1559升级后交易费用 57 | 58 | - 交易费用 = (baseFee + PriorityFee)\* GasUsed 59 | 60 | - baseFee 系统内部机制调整,完成交易的最低费用,将被完全销毁。 61 | 62 | - PriorityFee 用户定义,表示给矿工的小费,延续了竞价设计。 63 | 64 | - maxPriorityFee 用户定义,表示给矿工的小费的最高值。 65 | 66 | - maxFee 用户定义,表示用户愿意对某笔交易可支付的最高交易费用。 67 | 68 | - baseFee 的初始价格为 `INITIAL_BASE_FEE = 1Gwei` 69 | 70 | - 按照 baseFee 计算公式,相邻区块间的 baseFee 变化幅度在 ±12.5% 之间 71 | 72 | - 区块gas目标值 = 12.5M gas = 12500000 gas 73 | - 最大区块空间大小范围 12.5M gas ~ 25M gas 74 | - 当前区块baseFee计算公式 `baseFee = 区块gas目标值 * (1 + 0.125 * ( 上一个区块gas实际值 - 区块gas目标值 ) / 区块gas目标值 )` 75 | - 如果上一个区块空间的大小是gas是目标值的2倍,则当前区块 baseFee 将自动提升 12.5%。 76 | - 如果上一个区块空间的大小是0,则当前区块 baseFee 将自动下降 12.5%。 77 | 78 | ```python 79 | gas_target = 12500000 # 每个区块目标gas 80 | gas_max = 25000000 # 每个区块最大gas 81 | baseFee = 14 82 | burn_ether_target = gas_target * baseFee * 0.000000001 83 | burn_ether_max = gas_max * baseFee * 0.000000001 84 | print(burn_ether_target) 85 | print(burn_ether_max) 86 | ``` 87 | 88 | ## Gas查询网站 89 | 90 | ### 查询Gas Price的网站 91 | 92 | 1. https://cn.etherscan.com/gastracker 93 | 1. 时时gas价格 94 | 2. https://ethgas.watch/ 推荐 95 | 1. https://ethgas.watch/stats https://www.useweb3.xyz/gas?source=ethgas.watch&referrer=ethgas.watch 96 | 2. 时时gas价格 97 | 3. 历史趋势图 98 | 4. 邮件通知gas费用 99 | 3. https://ethereumprice.org/gas/ 100 | 1. 时时gas价格 101 | 2. 历史趋势图 102 | 4. https://mycointool.com/en/GasNow 推荐 103 | 1. 时时gas价格 104 | 2. 历史趋势图 105 | 5. 历史趋势图 106 | 1. https://ycharts.com/indicators/ethereum_average_gas_price 107 | 2. https://blockchair.com/ethereum/charts/median-gas-price 108 | 109 | - Layer2手续费 https://l2fees.info/ 110 | 111 | ### 查询Gas燃烧额度的网站 112 | 113 | 1. https://ethburned.info/ 114 | 115 | 1. 过去1小时燃烧额度 116 | 2. 历史总额度 117 | 118 | 2. https://ultrasound.money/#burn 119 | 120 | 1. 过去一定时间内的燃烧额度 121 | 2. 过去一定时间内每分钟燃烧的额度 122 | 123 | 3. https://mct.xyz/gasnow 124 | 125 | ## 深入Gas 126 | 127 | ### Gas交易费用 128 | 129 | | Transaction | Gwei | 130 | | :----------------------------------------- | :------ | 131 | | ETH Transfer | 21,000 | 132 | | ERC20 Approval | 45,000 | 133 | | ERC20 Token Transfer | 65,000 | 134 | | ERC721 NFT Transfer | 85,000 | 135 | | Uniswap V2 Swap | 150,000 | 136 | | Uniswap V3 Swap | 185,000 | 137 | | OpenSea Sale | 205,000 | 138 | | Uniswap V3 Liquidity | 215,000 | 139 | | L2 Deposits (Arbitrum, zkSync, Polygon,..) | 250,000 | 140 | | ENS Registration | 265,000 | 141 | 142 | ```python 143 | # 计算某个时刻某种交易需要花费的以太坊代币或USDT 144 | tx_gas_price = 16 145 | tx_gas = 65000 146 | fee_gwei = tx_gas * tx_gas_price 147 | fee_eth = fee_gwei / 1000000000 148 | 149 | eth_price = 1300 150 | fee_usdt = fee_eth * 1300 151 | 152 | print(fee_eth, "ETH") 153 | print(fee_usdt, "USDT") 154 | ``` 155 | 156 | ### Gas开销 157 | 158 | - storage 159 | 160 | - 存储由一个个存储槽组成,一个存储槽=32字节=256位。 161 | - 创建一个插槽的gas成本为 20,000。 162 | - 修改一个插槽的gas成本为 5,000。 163 | - 清理一个插槽时(即将非零字节设置为零),将退还一定量的 gas 。 164 | - 将数据保存在256位大小(32字节为一个字)的存储字段中。即使未完全占用每个插槽,也会产生成本。 165 | 166 | - memory 167 | 168 | - memory是一个字节数组,其插槽大小为256位(32个字节)。数据仅在函数执行期间存储,执行完之后,将其删除。它们不会保存到区块链中。 169 | - 读或写一个字(256位)需要3 gas 。 170 | - 为了避免给矿工带来太多工作,在进行22次读写操作后,之后的读写成本开始上升。 171 | 172 | 1. 内部调用view/pure的fun() 消耗:几十gas 173 | 2. 内部调用写状态变量的fun() 消耗:几百gas 174 | 3. 外部调用view/pure的fun() 消耗:两三千gas 175 | 4. 外部调用写状态变量的fun() 消耗:三四千gas 176 | 5. 写一个uint状态变量 消耗:两万多gas (用uint8代替uint256反而消耗gas更多) 177 | 6. 修改一个定长数组(状态变量)元素 消耗:两万多gas 178 | 7. 插入一个map(状态变量)元素 消耗:两万多gas push一个uint[]变长数组(状态变量)元素 消耗:四万多gas 179 | 180 | ### Gas优化 181 | 182 | - 参考 183 | - https://www.bilibili.com/video/BV1Pi4y1U7Cu/?spm_id_from=pageDriver 184 | 185 | 1. 优先使用calldata 186 | 2. 加载状态变量到内存变量 187 | 3. 多个条件判断使用短路方式 188 | 4. 在循环中使用++i,而不是i+=1,i++ 189 | 5. 数组长度缓存到内存 190 | 6. 缓存多次使用的数组元素到内存 191 | -------------------------------------------------------------------------------- /ethereum/contract/error.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 日志错误 8 | 9 | - 参考 10 | - https://medium.com/linum-labs/error-vm-exception-while-processing-transaction-revert-8cd856633793 11 | 12 | 1. err="stack underflow" 13 | 14 | 1. A number wrapped under and is now at its max value. The minimum value of a uint8 is of course 0, and the max is 255. So if we take a uint8 number that is 0 and we minus 1, it will underflow to the max value. I.e: 15 | 16 | ```js 17 | uint8 goingToUnderflow = 0; 18 | goingToUnderflow - 1; 19 | goingToUnderflow is now equal to 255. 20 | ``` 21 | 22 | 2. 可能是编译好的字节码被改动而导致 23 | 24 | 2. err="execution reverted" 25 | 26 | 1. 可能是部署合约时未传入参数导致 27 | 2. 可能是外部调用函数,函数返回数组 28 | 29 | 3. err="authentication needed: password or unlock" 30 | 31 | 1. 可能是钱包账户未解锁导致 32 | 33 | 4. err="the method personal_unlockAccount does not exist/is not available" 34 | 35 | 1. 节点启动时没有开启personal模块访问权限 --http.api eth,web3,personal,net,db 36 | -------------------------------------------------------------------------------- /ethereum/contract/explorer.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-10-13 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 开源区块链游览器 8 | 9 | 01. https://github.com/blockscout/blockscout 可行。2012年12月继续更新中,功能齐全版。 10 | 02. https://github.com/etherparty/explorer 可行。2017年停止更新,轻量版,nodev8.17.0运行成功 nodev16.9.1运行失败。 11 | 03. https://github.com/metaspartan/explorer 不可行。2018年停止更新,轻量版,编译运行成功,没报错,但页面未查到任何内容。 12 | 04. https://github.com/gobitfly/etherchain-light 不可行。2018年停止更新,轻量版,运行失败。 13 | 05. https://github.com/ismaelbej/mini-eth-browser 14 | 06. https://github.com/curvegrid/toy-block-explorer 15 | 07. https://github.com/ethnamed/eth-explorer 16 | 08. https://github.com/Magicking/Clixplorer 17 | 09. https://github.com/ethereumproject/explorer 18 | 10. http://ethscan.hubwiz.com/ 可行。轻量版,直接运行一个html文件即可。 19 | 20 | ## blockscout/blockscout 21 | 22 | - 由POA Network开源的一款以太坊区块链游览器,基于Erlang VM的Elixir语言开发。 23 | 24 | - 部署方式 https://hub.docker.com/repository/docker/garysdevil/blockscout/general 25 | 26 | ### 报错与解决办法 27 | 28 | 1. yum install inotify-tools 29 | - https://github.com/inotify-tools/inotify-tools/wiki 30 | ```log 31 | 2022-01-04T09:17:03.601 application=que [info] [Que] Booting Server Supervisor for Workers 32 | 2022-01-04T09:17:03.965 application=explorer [warn] Failed to get exchange rates with reason 'Source URL is nil'. 33 | 2022-01-04T09:17:04.010 application=file_system [error] `inotify-tools` is needed to run `file_system` for your system, check https://github.com/rvoicilas/inotify-tools/wiki for more information about how to install it. If it's already installed but not be found, appoint executable file with `config.exs` or `FILESYSTEM_FSINOTIFY_EXECUTABLE_FILE` env. 34 | 2022-01-04T09:17:04.010 application=phoenix_live_reload [warn] Could not start Phoenix live-reload because we cannot listen to the file system. 35 | You don't need to worry! This is an optional feature used during development to 36 | refresh your browser when you save files and it does not affect production. 37 | ``` 38 | 2. 没有连接到正确的ws地址端口上(以下报错是因为笔者连接到RPC端口导致的) 39 | ```log 40 | 2022-01-05T06:10:49.336 fetcher=block_realtime [error] GenServer Indexer.Block.Realtime.Fetcher terminating 41 | ** (stop) exited in: GenServer.call(Indexer.Block.Realtime.WebSocket, {:subscribe, "newHeads", []}, 5000) 42 | ** (EXIT) time out 43 | (elixir 1.12.3) lib/gen_server.ex:1024: GenServer.call/3 44 | (indexer 0.1.0) lib/indexer/block/realtime/fetcher.ex:150: Indexer.Block.Realtime.Fetcher.subscribe_to_new_heads/2 45 | (indexer 0.1.0) lib/indexer/block/realtime/fetcher.ex:73: Indexer.Block.Realtime.Fetcher.handle_continue/2 46 | (stdlib 3.16.1) gen_server.erl:695: :gen_server.try_dispatch/4 47 | (stdlib 3.16.1) gen_server.erl:437: :gen_server.loop/7 48 | (stdlib 3.16.1) proc_lib.erl:226: :proc_lib.init_p_do_apply/3 49 | Last message: {:continue, {:init, [transport: EthereumJSONRPC.WebSocket, transport_options: %EthereumJSONRPC.WebSocket{url: "ws://localhost:8545", web_socket: EthereumJSONRPC.WebSocket.WebSocketClient, web_socket_options: %EthereumJSONRPC.WebSocket.WebSocketClient.Options{event: nil, params: nil, web_socket: Indexer.Block.Realtime.WebSocket}}]}} 50 | State: %Indexer.Block.Realtime.Fetcher{block_fetcher: %Indexer.Block.Fetcher{broadcast: :realtime, callback_module: Indexer.Block.Realtime.Fetcher, json_rpc_named_arguments: [transport: EthereumJSONRPC.HTTP, transport_options: [http: EthereumJSONRPC.HTTP.HTTPoison, url: "http://localhost:8545", http_options: [recv_timeout: 60000, timeout: 60000, hackney: [pool: :ethereum_jsonrpc]]], variant: EthereumJSONRPC.Geth], receipts_batch_size: 250, receipts_concurrency: 10}, max_number_seen: nil, previous_number: nil, subscription: nil, timer: nil} 51 | ``` 52 | 53 | ## etherparty/explorer 54 | 55 | - 部署 56 | ```bash 57 | git clone https://github.com/etherparty/explorer 58 | cd explorer 59 | npm install -g bower -y 60 | bower init 61 | bower install --allow-root 62 | bower install angular --save-dev --allow-root 63 | npm start 64 | ``` 65 | -------------------------------------------------------------------------------- /ethereum/contract/library.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 常用的自定义库 8 | 9 | 1. 限制只有合约拥有者拥有访问权限。 10 | 11 | ```js 12 | pragma solidity ^0.8.0; 13 | import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol"; 14 | 15 | contract OwnableContract is Ownable { 16 | function restrictedFunction() public view onlyOwner returns (uint) { 17 | return 99; 18 | } 19 | } 20 | ``` 21 | 22 | 2. 获取当前合约的余额 23 | 24 | ```js 25 | pragma solidity ^0.8.0; 26 | contract test{ 27 | function getBalance() public view returns(uint){ 28 | return address(this).balance; 29 | } 30 | } 31 | ``` 32 | 33 | 3. 字符串操作 34 | 35 | - https://github.com/ethereum/dapp-bin/blob/master/library/stringUtils.sol 36 | 37 | 4. 随机数 38 | 39 | - https://github.com/randao/randao 40 | -------------------------------------------------------------------------------- /ethereum/contract/nft.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## NFT图片存储方式 8 | 9 | - 不存储 10 | - CryptoPunks 只存储了一个图片的验证码 11 | - CryptoKitties 在元数据里存储猫咪的特征基因,前端获取元数据,并按照既定规则生成展示猫咪图片。 12 | - 链上存储 将图片组件化,将组件存储在链上,最后组合生成图片 13 | - Autoglyphs 14 | - Uniswap V3 Position NFT 15 | - 去中心化存储 16 | - Bored Ape Yacht Club 17 | - 中心化存储 18 | - Pudgy Penguins 19 | 20 | ## OpenSea 21 | 22 | - 开发者文档 https://docs.opensea.io/docs/developer-tutorials 23 | 24 | - OpenSea元数据模版 https://docs.opensea.io/docs/metadata-standards 25 | 26 | - OpenSea NFT合约例子 https://github.com/ProjectOpenSea/opensea-creatures 27 | 28 | - 元数据模版 29 | 30 | ```json 31 | { 32 | "name": "GG", 33 | "description": "GG where is a boxing world", 34 | "image_url": "https://garysdevil/1.png", 35 | // "external_url": "https://garysdevil/?token_id=1", 36 | "attributes": [ 37 | { 38 | "trait_type":"weight", 39 | "value":"60" 40 | }, 41 | { 42 | "trait_type":"height", 43 | "value":"170" 44 | } 45 | ] 46 | } 47 | ``` 48 | 49 | - Rinkeby测试网络API 50 | - 查看元数据所在的位置 https://testnets-api.opensea.io/api/v1/assets/\/\/validate 51 | - 查看元数据的具体信息 https://testnets-api.opensea.io/api/v1/asset/\/\ 52 | - 刷新缓存 https://testnets-api.opensea.io/api/v1/asset/\/\/?force_update=true 53 | -------------------------------------------------------------------------------- /ethereum/contract/solidity.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 智能合约 8 | 9 | - 智能合约概念于1995年由Nick Szabo首次提出 10 | 11 | - ABI = Application Binary Interface 12 | 13 | ## 相关链接 14 | 15 | - Solidity 16 | 17 | - Solidity源码 https://github.com/ethereum/solidity 18 | - solidity官方文档 https://docs.soliditylang.org 19 | - solidity中文文档 https://solidity-cn.readthedocs.io 旧版本/仅参考 20 | - solidity中文文档 https://www.qikegu.com/docs/4852 旧版本/仅参考 21 | - 以太坊标准 https://github.com/ethereum/EIPs/tree/master/EIPS 22 | - 以太坊标准合约/常用库的实现 https://github.com/OpenZeppelin/openzeppelin-contracts 23 | - OpenZeppelin代码库包含了经过社区审查的ERC代币标准、安全协议以及很多的辅助工具库,这些代码可以帮助开发者专注业务逻辑的,而无需重新发明轮子。 24 | 25 | - 调用智能合约的库 26 | 27 | - web3.js 28 | - Github https://github.com/web3/web3.js 29 | - 文档 https://web3js.readthedocs.io/en/v1.8.0/web3.html 30 | - v4版本文档 https://docs.web3js.org/api 31 | - ethers.js 32 | - Github https://github.com/ethers-io/ethers.js/ 33 | - 文档 https://docs.ethers.io/v5/ 34 | - EthereumJS 35 | - Github https://github.com/ethereumjs/ethereumjs-monorepo 36 | 37 | - 开发工具 38 | 39 | - 开发框架truffle https://github.com/trufflesuite/truffle 40 | - 开发框架hardhat https://github.com/nomiclabs/hardhat 41 | - remix在线编译器 https://remix.ethereum.org/ 42 | - remix桌面版 https://github.com/ethereum/remix-desktop 43 | - remix网页版 https://github.com/ethereum/remix-project 44 | - 所有的编译器版本 https://github.com/ethereum/solc-bin 45 | 46 | - 区块链游览器 https://etherscan.io/ 47 | 48 | - 以太坊网络拥堵情况 https://etherscan.io/chart/pendingtx 49 | 50 | - 以太坊开发各种工具链接 51 | 52 | - https://zhuanlan.zhihu.com/p/316741673 53 | - https://zhuanlan.zhihu.com/p/82411709 54 | 55 | - 社区交流 56 | 57 | - https://gitter.im/ethereum/remix 58 | - https://gitter.im/ethereum/solidity# 59 | 60 | - 智能合约的升级 61 | 62 | - https://github.com/NoharaHiroshi/upgradability-solidity-demo 63 | - https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/ 64 | - https://juejin.cn/post/6844903599407890445 65 | - https://ethfans.org/posts/flexible-upgradability-for-smart-contracts 66 | 67 | - 区块链节点服务商 68 | 69 | - https://infura.io/ 70 | - https://www.alchemy.com/ 71 | - Infura 免费层每天允许 100,000 个请求,而 Alchemy 允许 3 亿个请求。 72 | 73 | - 学习资料 74 | 75 | - cryptozombie 76 | - cryptozombie https://github.com/loomnetwork/cryptozombie-lessons 77 | - 官网 https://cryptozombies.io/ 78 | 79 | - 其它文章 80 | 81 | - Gas优化 https://zhuanlan.zhihu.com/p/54662099 82 | 83 | ## 编译部署智能合约 84 | 85 | ### 安装编译部署工具 86 | 87 | - solidity编译器 88 | 89 | ```bash 90 | # 在mac上安装solidity编译器 91 | brew tap ethereum/ethereum 92 | brew install solidity 93 | solc --help 94 | ``` 95 | 96 | - truffle 编译测试部署一体化工具包 97 | 98 | ```bash 99 | # 在Mac操作系统上安装truffle。truffle是一套开发智能合约的集成开发框架,它是基于javascript的,它的好处是能够解决从智能合约的编译,单元测试,发布,调试一体系的管理 100 | brew install truffle 101 | # 通过npm安装 102 | npm install truffle -g 103 | ``` 104 | 105 | - solcjs 编译器 106 | 107 | ```bash 108 | # solcjs是一个javascript实现的编译器,更加轻量级 109 | npm install -g solc 110 | # 编译 111 | solcjs --bin --base-path . ./MainContract.sol 112 | ``` 113 | 114 | - ganache-cli 以太坊模拟环境 115 | 116 | ```bash 117 | # 安装测试环境(模拟接入以太坊)ganache 118 | # 命令行版 119 | npm install -g ganache-cli 120 | # Gui版 121 | truffleframework.com/ganache 下载 122 | ``` 123 | 124 | - truffle-flattener 125 | 126 | ```bash 127 | # truffle-flattener 将多个相互依赖的合约文件编译为一个文件 128 | npm install truffle-flattener -g 129 | truffle-flattener xxx.sol > ERC20Full.sol 130 | 131 | npm install truffle-plugin-verify 132 | ``` 133 | 134 | ### 通过solc进行编译 135 | 136 | ```bash 137 | # 编译 138 | # --bin 生成字节码 139 | # --abi 生成abi文件 140 | # --optimize 进行优化编译 141 | # -o ./ 输出结果到当前文件夹内 142 | solc --bin --abi --optimize -o ./ 代码文件 143 | ``` 144 | 145 | ### 通过truffle编译和ganache-cli部署 146 | 147 | - Truffle 规定合约的文件名和合约名称相同 148 | 149 | ```bash 150 | # 启动以太坊模拟环境 151 | ganache-cli 152 | 153 | # 创建项目 154 | mkdir mytruffle && cd mytruffle 155 | truffle init # 初始化项目框架 https://github.com/trufflesuite/truffle-init-webpack 156 | # truffle unbox metacoin 初始化一个虚拟货币的例子 157 | # ./contracts中存放的是合约 158 | # ./migrations目录里面存放的JS文件,帮助部署合约到以太坊网络中 159 | 160 | 161 | truffle compile # 编译合约 162 | # 编译编译结果在./build/contracts目录内 163 | # 默认只编译自上次编译后被修改过的文件,以此来减少不必要的编译。想编译全部文件,则使用 --compile-all 参数 164 | 165 | truffle migrate --reset # 部署合约 166 | # 仅会部署新创建的合约。想重新部署所有合约,则使用 --reset 参数 167 | # 168 | 169 | truffle test #执行测试脚本 170 | ``` 171 | 172 | ```bash 173 | truffle console # 进入到控制台后 174 | 175 | # 查看合约信息 176 | 合约名称.deployed() 177 | 合约名称.deployed().then(function(instance){contractInstance=instance;}); 178 | 179 | ``` 180 | 181 | ### 通过hardhat进行合约编译部署 182 | 183 | ```bash 184 | npm install --save-dev hardhat 185 | npx init 186 | npx hardhat # 生成配置文件 187 | npx hardhat compile 188 | npx hardhat test 189 | ``` 190 | 191 | ## 开发工具 192 | 193 | ### vsCode 194 | 195 | - 安装solidity插件 196 | - vscode-solidity插件编译器位置寻找顺序 197 | 1. 本地node_modules (需要更改配置Solidity: Default Compiler, 和在项目下执行指令 npm incall solc) 198 | 2. 本地文件寻找 solidity.compileUsingLocalVersion 199 | 3. 远程寻找 solidity.compileUsingRemoteVersion 200 | 201 | ### Remix 202 | 203 | - 安装 204 | 205 | ```bash 206 | # 方式一 通过npm进行安装 207 | npm install remix-ide -g 208 | npm install -g remixd 209 | remix-ide 210 | 211 | # 方式二 通过源码安装 https://github.com/ethereum/remix-project 212 | # (未试过)找出代码里编译器的链接,更改为本地的链接 grep -R 'solc-bin.ethereum.org' ./ 213 | # (失败)更改IP端口 vim ./apps/remix-ide/bin/remix-ide 214 | # 编译运行 215 | npm run build:production 216 | npm run serve:production 217 | ``` 218 | 219 | - 当使用本地的编译器时,需要赋予 sol\*.js 文件执行权限。 220 | 221 | ## nodejs 222 | 223 | ### ethers.js 224 | 225 | Providers,Signers,Contract Interaction,Utilities 226 | 227 | - API类型 228 | 1. Providers 匿名连接以太坊网络,查看状态,发送交易。 229 | 2. Signers 以太坊账户的抽象,对交易进行签名。 230 | - 在Signer中比较常用的方法为Wallet,只有Wallet可以使用私钥对交易和信息进行签名。 231 | - 示范 232 | ```js 233 | // new ethers.Wallet(privateKey[, provider]) 234 | const alice = new ethers.Wallet(privateKeyAlice, provider); 235 | const bob = new ethers.Wallet(privateKeyBob, provider); 236 | 237 | const txReceipt = await alice.sendTransaction({ 238 | to: bob.address, 239 | value: ethers.utils.parseEther('1.0') 240 | }); 241 | await txReceipt.wait(); 242 | ``` 243 | 3. Contract Interaction 部署合约与生成合约实例 244 | 4. Utilities 相关工具 245 | -------------------------------------------------------------------------------- /ethereum/contract/version.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-04-26 3 | --- 4 | 5 | [TOC] 6 | 7 | ## Solidity 8.0版本的新特性 8 | 9 | 1. 数学溢出安全检查 10 | 2. 自定义错误 11 | 3. 函数可以定义在合约外部(不需要定义函数可见性,函数不可以被合约外部调用) 12 | 4. 引入的函数可以起别名 13 | 5. Salted contract creation 14 | 15 | ```js 16 | // SPDX-License-Identifier: GPL-3.0 //指定开源协议 17 | pragma solidity ^0.8.0; 18 | // 引入的函数functionA起别名为funA 19 | import {functionA as funA} from "./Sol.sol" 20 | 21 | // 函数可以定义在合约外部 22 | function myLib(uint256 x) pure returns(uint256){ 23 | return x*2; 24 | } 25 | 26 | // 自定义错误 // 可以传递参数 27 | error Unautorized(address caller); 28 | contract myCon{ 29 | function test() public { 30 | if (true) // 触发错误 31 | // revert("my error") 32 | revert Unautorized(msg.sender); 33 | } 34 | } 35 | ``` 36 | -------------------------------------------------------------------------------- /ethereum/eth2.0.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-11-27 3 | --- 4 | 5 | [TOC] 6 | 7 | ## ETH2.0 8 | 9 | - 经济模型 https://docs.ethhub.io/ethereum-roadmap/ethereum-2.0/eth-2.0-economics/ 10 | 11 | - 爆块时间 12s/block 12 | 13 | - POS 14 | 15 | 1. 一年释放大约 58.4 万枚 ETH 作为质押奖励。 16 | 2. 每天大约释放 1600 枚ETH。 17 | 3. 没小时大约释放 66.66 枚ETH。 18 | 4. 每分钟大约释放 1.111 枚ETH。 19 | 20 | - 提出区块和证明提议都需要在一个 slot 内完成,一般是 12s。每 32 个 slot 组成一个 epoch 周期,每个 epoch 将打乱验证者排序并重新选举委员会 21 | 22 | ## 以太坊2.0的过渡分三个阶段 23 | 24 | 1. 阶段0: 启动Beacon信标链。 25 | 26 | 1. 将ETH资产逐步转移到 Beacon 链上,成为BETH。 27 | 2. 用户可以在 Beacon 链上抵押 32 个 BETH 成为验证者,验证者仅仅管理 Beacon 链。 28 | 3. 以太坊网络存在两条链,信标链 和 Eth1链(之前的PoW主链)。 29 | 4. 所有用户交易和智能合约计算仍在Eth1链上进行。 30 | 31 | 2. 阶段1:启动Shards分片链。 32 | 33 | 1. 将ETH资产逐步转移到分片链上。 34 | 35 | 3. 阶段2:实现Shards EVM虚拟机,引入执行层。 36 | 37 | 1. 这个阶段是以太坊 2.0 各个重要功能汇聚,分片链升级,允许钱包转账,执行合约。 38 | 39 | 4. 阶段3:Light Clients 40 | 41 | ## 升级 42 | 43 | 1. 上海升级 44 | - 上海升级除了实现Beacon链上BETH质押提取功能外,还纳入了四项即将激活的 EIP。 45 | -------------------------------------------------------------------------------- /ethereum/evm.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | # EVM 8 | 9 | - 参考 https://ethereum.org/zh/developers/docs/ 10 | 11 | ## 以太坊机制 12 | 13 | - 以太坊所状态存储结构采用MPT树。 14 | 15 | - 外部账户的创建过程 16 | 17 | - 生成一个随机的64个十六进制字符组成的私钥 18 | - 使用私钥生成公钥 19 | - 帐户地址= 0x + 公钥的最后20字节 20 | 21 | - 合约账户=42个字符组成的十六进制地址 22 | 23 | ## 交易 24 | 25 | - 视频演示 https://youtu.be/er-0ihqFQB0 26 | 27 | - 交易的数据格式 28 | 29 | ```json 30 | { 31 | "from": "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8", 32 | "to": "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a", 33 | "gasLimit": "21000", 34 | "gasPrice": "200", 35 | "nonce": "0", 36 | "value": "10000000000", 37 | } 38 | ``` 39 | 40 | - 交易生命周期 41 | 42 | 1. 一旦用户发送交易,加密算法生成交易哈希。 43 | 2. 然后将该交易转播到网络,并且与大量其他交易一起包含在一个集合中。 44 | 3. 矿工选择您的交易并将它包含在一个区块中,以便验证交易并认为它“成功”。矿工会总是优先处理 gasPrice 更高的交易。 45 | 46 | ## keccak哈希算法 47 | 48 | - 在以太坊中,用keccak哈希算法来计算公钥的256位哈希,再截取这256位哈希的后160位哈希作为地址值。 49 | - keccak和sha3的区别 50 | - sha3由keccak标准化而来,在很多场合下Keccak和SHA3是同义词,但在2015年8月SHA3最终完成标准化时,NIST调整了填充算法:SHA3-256(M) = KECCAK [512] (M || 01, 256)。所以标准的NIST-SHA3就和keccak计算的结果不一样。 51 | - 以太坊在开发的时候sha3还在标准化中,所以采用了keccak,所以Ethereum和Solidity智能合约代码中的SHA3是指Keccak256,而不是标准的NIST-SHA3,为了避免混淆,直接在合约代码中写成Keccak256是最清晰的。 52 | -------------------------------------------------------------------------------- /ethereum/picture/eth2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/ethereum/picture/eth2.0.png -------------------------------------------------------------------------------- /ethereum/picture/world-state-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/ethereum/picture/world-state-tree.png -------------------------------------------------------------------------------- /ethereum/protocal.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-12-31 3 | --- 4 | 5 | [TOC] 6 | 7 | ## facet protocal 8 | 9 | 1. facet 协议 10 | 11 | 1. 主旨: 使用智能合约可以完成的所有事情都可以在没有智能合约的情况下更有效地完成,该团队的目标是将所有流行的以太坊应用程序(从NFT市场到借贷协议)转移到更高效的Facet协议上。 12 | 2. 参考 https://mirror.xyz/web3rare.eth/Sv9mE5JTo3RRWGi3VSa1dP8rWVVoY_c33Y0it1lqG0k 13 | 3. https://facet.org/ 14 | 4. http://discord.gg/facet 15 | 5. http://github.com/0xfacet 16 | 17 | 2. 交易网站 18 | 19 | 1. http://www.facetswap.com 20 | 2. https://www.ethsmarket.xyz/market 21 | 3. https://www.etch.market/market 22 | -------------------------------------------------------------------------------- /ethereum/starknet/starknet.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2025-05-20 3 | --- 4 | 5 | [TOC] 6 | 7 | - 开发者资助 8 | 9 | 1. Seed Grants Program 10 | 2. Growth Grants Programshe 11 | 12 | - Cairo 特征 13 | 14 | 1. 创建可证明的程序 15 | 2. 在 CairoVM 上运行 16 | 3. 类似 Rust 的语法 17 | 4. 类似 Rust 相似的所有权模型 18 | 5. 强类型 traits macros 19 | 6. 不专为智能合约设计 20 | 7. 不需要了解 ZK 底层技术 21 | 22 | - 为什么选择 Cairo 23 | 24 | 1. 可以在不重新执行程序情况下,验证结果的正确性 25 | 26 | - 为什么选择 Starknet 27 | 28 | 1. 低 gas fee 29 | 2. 以太坊作作为安全保障 30 | 3. 强大的编程语言 Cairo 31 | 4. 在以太坊上确认时间更短 32 | 5. 不需要信任设置、抗量子计算 33 | 34 | - 常用区块链浏览器 35 | 36 | - starkscan.co 37 | - https://voyager.online/ 38 | 39 | - 学习教程 40 | 41 | - book.cairo-lang.org 42 | 43 | V神的zk-EVM分类 44 | 45 | | | | | | | 46 | | ----- | :--------------------------- | ------------- | ----------- | -------------------------------------- | 47 | | | EVM Changes | Compatibility | Performance | Projects | 48 | | Type1 | Nothing | Full | Very Slow | - | 49 | | Type2 | Storage data structure | High | Slow | - | 50 | | Type3 | Storage, hashes, precompiles | Partial | Fast | Kakarot, zkSync, Scroll, Polygon zkEVM | 51 | | Type4 | Completely different VM | None | Very Fast | Starknet, Aztec\*, Polygon Miden | 52 | 53 | - Cairo 最初是Starkware创建的一种计算机架构,用于程序执行和生成有效性证明。 54 | - Cairo 名字的由来 CPU AIR Operation 55 | - 由Cairo执行的低级字节码称为“Cairo Assembly” 或 CASM。 56 | - Cairo语言 --> 编译为 Sierra --> 编译为 CASM 57 | 58 | ## Cairo 59 | 60 | - Field elements = felt 61 | - 默认数据类型是 felt252 62 | - felt 可以表示的直 0 < X < p 63 | 64 | ## Starklings 65 | 66 | - https://starklings.app 67 | 68 | 1. Starklings 是交互式学习 Cairo 的工具 69 | 2. 由 Shramee 创建 @shrameetweets 70 | 3. Starklings App 由 Damian创建 @dpinoness 71 | 72 | ## 项目管理工具 73 | 74 | 1. starkli 75 | 76 | 2. https://github.com/xJonathanLEI/starkli/releases/ 77 | 78 | 3. curl https://get.starkli.sh | sh 79 | 80 | 4. scarb 81 | 82 | 5. https://docs.swmansion.com/scarb/download.html 83 | 84 | 6. `curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh` 85 | 86 | - Cairo 1.0编译器依赖Rust 87 | -------------------------------------------------------------------------------- /infra/cross/cross.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 跨链 Interoperability 3 | created_date: 2025-05-04 4 | --- 5 | 6 | [TOC] 7 | 8 | ## 定义 9 | 10 | - 跨链技术(Interoperability)是指不同区块链网络(如比特币、以太坊、Cosmos)之间共享数据、资产或状态的能力,解决区块链孤岛问题。 11 | - 跨链技术通过多种机制实现,包括公证人、侧链/中继、哈希锁定和分布式私钥控制,广泛应用于资产转移、跨链 DeFi、元宇宙资产流通和 DAO 治理。 12 | 13 | ## 实现模式 14 | 15 | 1. 公证人机制(Notary Schemes)公证人机制是链与链交互操作最简单的方法,由某个或某组受信任的团体来声明A链对B链上发生了某件事情。比较有代表的项目是Ripple,这种方式更关注金融资产的转移。 16 | 17 | 2. 侧链/中继(Sidechains/Relays)是指由侧链或中继链来进行交易,用多中心化的方式来解决信任问题。比较有代表性的项目是Cosmos和Polkadot,它们比较侧重于解决跨链基础设施方面,也是现阶段关注度很高的技术热点。 18 | 19 | 3. 哈希锁定(Hash-Locking)是通过智能合约来保障任意两个人之间的转账都可以通过一条“支付”通道来实现,完成“中介”的角色,比较有代表的项目是闪电网络。 20 | 21 | 4. 分布式私钥控制(Distributed Private Key Control)引入锁定和解锁的概念,通过这样的一个锁定和解锁的操作,可以对原有链上的Token进行管理权的操作。比较有代表性的项目是FUSION,实现了多Token种类的智能合约。 22 | -------------------------------------------------------------------------------- /infra/cross/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/cross/cross.png -------------------------------------------------------------------------------- /infra/index/thegraph.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-03-21 3 | --- 4 | 5 | [TOC] 6 | 7 | # the graph 8 | 9 | - 链接 10 | 11 | - https://thegraph.com 12 | 13 | - 将以太坊日志保存进数据库 14 | 15 | ## 介绍 16 | 17 | - 网络 18 | 19 | - Subgraph Studio - 以太坊主网作为数据源 20 | - Hosted Service - 其它区块链网络作为数据源(例如Binance, Matic等等) 21 | 22 | - 角色 23 | 24 | - 用户(Comsumer)。用户向索引器支付查询费用。他们通常是终端用户,但也可能是集成 The Graph 的网络服务或中间件。 25 | - 索引器(Indexer)。索引器是 The Graph 的运行节点。其动力是赚取财务奖励。 26 | - 策展人(Curator)。策展人使用 GRT 代币来指明哪些子图值得索引。他们通常是开发者,也可能是支持他们在使用服务的终端用户,或者纯粹出于经济动机的一种角色。 27 | - 委托人(Delegator)。委托人向某个 Indexer 质押 GRT 代币,赚取一部分通货膨胀奖励和费用,他们无需亲自运行一个 Graph 节点。这类角色主要出于经济动机。 28 | - 渔夫(Fisherman)。渔夫们时刻检查查询响应是否正确,以此保护网络。渔夫动机是利他的,因此 The Graph 将率先为网络提供渔夫服务。 29 | - 仲裁员(Arbitrator)。在争议解决期间,仲裁员决定是否对索引器进行罚没。他们可能出于经济或利他动机。 30 | 31 | - 去中心化费用 https://thegraph.com/docs/studio/billing 32 | 33 | ### 构建Subgraph 34 | 35 | - Subgraph的结构 36 | 37 | - Manifest (subgraph.yaml) - 定义Subgraph要进行索引的数据源 38 | - https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md 39 | - Schema (schema.graphql) - 定义存储在Subgraph的数据 和 索引数据的格式 40 | - AssemblyScript Mappings (mapping.ts) - 定义代码流程,将数据源的数据转为Subgraph定义的数据格式 41 | 42 | - 参考文档 https://thegraph.com/docs/developer/quick-start 43 | 44 | ```bash 45 | # 安装 The Graph CLI 46 | npm install -g @graphprotocol/graph-cli 47 | 48 | # 初始化Subgraph 49 | SUBGRAPH_SLUG=定义Subgraph的名字 50 | graph init --studio ${SUBGRAPH_SLUG} 51 | # graph init --studio ${SUBGRAPH_SLUG} --product subgraph-studio --index-events --network mainnet --contract-name Loot --from-contract 0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7 52 | # graph init --studio ${SUBGRAPH_SLUG} --product subgraph-studio --index-events --network rinkeby --contract-name Loot --from-contract 0x117814e91a04067f11b5c16c75e8e21845a506ea 53 | # --index-events 合约内所有的事件都生成对应的schema 54 | # 以太坊主网Loot合约部署于 13108877 块高,rinkeby网络 为9243123,为了节省时间设置从特定的块高开始同步 dataSources[0].source.startBlock = 13108877 55 | 56 | # build 57 | cd ${SUBGRAPH_SLUG} 58 | # 根据需求,在 schema.graphql 文件内添加schema 59 | graph codegen # 根据schema.graphql生成了ts文件,默认放进generated文件夹内 60 | # 根据需求,修改 src/mapping.ts 文件,如果在 src/mapping.ts 内添加了新的事件则需要修改 subgraph.yaml 文件 61 | graph build # 本地构建wasm文件核实是否有语法错误,结果默认创建并放进build文件夹内 62 | 63 | # 部署进官方的Subgraph Studio 64 | graph auth --studio $DEPLOY_KEY # 从官网https://thegraph.com/studio/获取DEPLOY_KEY 65 | graph deploy --studio $SUBGRAPH_SLUG 66 | 67 | # 假如需要部署进去中心化区块链网络里则需要在网页上支付对应的链上代币进行部署 68 | ``` 69 | -------------------------------------------------------------------------------- /infra/oracle/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-06-11 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 预言机 8 | -------------------------------------------------------------------------------- /infra/oracle/chainlink_framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/oracle/chainlink_framework.png -------------------------------------------------------------------------------- /infra/storage/destorage.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-06-10 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 去中心化存储服务提供商 8 | 9 | - Akord https://akord.com/ 10 | -------------------------------------------------------------------------------- /infra/storage/fvm.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-11-26 3 | --- 4 | 5 | [TOC] 6 | 7 | - Filecoin Virtual Machine 8 | 9 | ## 相关链接 10 | 11 | - 官网 https://fvm.filecoin.io/ 12 | - 文档 https://github.com/filecoin-project/fvm-docs 13 | - 提案 https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0032.md 14 | - 规格 https://spec.filecoin.io/#section-systems.filecoin_vm 15 | - FVM虚拟机 https://github.com/filecoin-project/ref-fvm 16 | - 主网正式推出FVM前的竞赛 https://spacewarp.fvm.dev/ 17 | - 路线图 https://timeline.fvm.dev/ 18 | - FVM生态 https://ecosystem.filecoin.io/ 19 | - 测试网领水 https://hyperspace.yoga/#faucet 20 | - 测试网区块链游览起 https://explorer.glif.io/?network=hyperspace 21 | 22 | ## 测试环境 23 | 24 | | Name | Type | Reset frequency | Faucet | 25 | | ------------------------------------------------------------ | ----------------------- | ------------------------------------------ | ------------------------------------------------------------ | 26 | | [Mainnet](https://docs.filecoin.io/fvm/reference/networks/#mainnet) | 主网 | Never | None | 27 | | [Builder testnet (buildernet)](https://docs.filecoin.io/fvm/reference/networks/#mainnet) | 测试网 | 只有当发生不可恢复的破坏时 | [`faucet.calibration.fildev.network`](https://faucet.calibration.fildev.network/) | 28 | | [Wallaby testnet](https://docs.filecoin.io/fvm/reference/networks/#wallaby-testnet) | 测试网 | 每周 | [`wallaby.network#faucet`](https://wallaby.network/#faucet) | 29 | 30 | - 兼容FVM的区块链游览器 31 | 32 | - https://explorer.filmine.io/ 33 | - https://explorer.glif.io/ 34 | 35 | - 使用 Wallaby 测试网 36 | 37 | 1. 小狐狸添加Filecoin的Wallaby测试网 https://chainlist.org/chain/31415 38 | 2. 小狐狸领取Filecoin的Wallaby测试网测试币 https://wallaby.network/#faucet 39 | 3. 部署EVM智能合约进Wallaby测试网。 40 | 41 | - 兼容FVM的测试网络的API服务 42 | 43 | - https://wallaby.node.glif.io/ 44 | - https://docs.zondax.ch/openapi#servers 45 | 46 | ## FVM 47 | 48 | - FVM vs FEVM 49 | | | FVM | FEVM | 50 | | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | 51 | | **Pros** | 最强的执行速度和性能 (每次Actor代码的执行花费更少的gas)。 用任何可以编译成WASM 1的语言编写Actor | 利用当前Solidity和EVM工具快速移植或编写Actor | 52 | | **Cons** | 相关工具不比EVM工具成熟完善 | 由于FEVM的虚拟化开销,gas费用较高,性能较低。 | 53 | -------------------------------------------------------------------------------- /infra/storage/ipfs.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-06-10 3 | --- 4 | 5 | [TOC] 6 | 7 | - IPFS 8 | 9 | ## 相关链接 10 | 11 | - Github https://github.com/ipfs/ipfs-desktop 12 | 13 | - 下载IPFS https://dist.ipfs.io/ 14 | 15 | - 集成IPFS的第三方服务 https://app.pinata.cloud/ 16 | 17 | - 网关 18 | 19 | 1. https://ipfs.io/ipfs/${cid} 20 | 2. https://gateway.pinata.cloud/ipfs/${cid} 21 | 3. https://ipfs-search.com/ 22 | 23 | - IPFS游览器 https://explore.ipld.io/ 24 | 25 | - 资源 26 | 27 | - 某个Ape类型NFT的图片地址 https://ipfs.io/ipfs/QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/ 28 | 29 | ## IPFS 30 | 31 | - IPFS(Inter Planetary File System)星际文件系统 32 | 33 | - QUIC network transmission protocol is faster than TCP 34 | 35 | - IPFS 初始化 36 | 37 | ```bash 38 | # IPFS 初始化 39 | ipfs init 40 | ``` 41 | 42 | ```log 43 | generating ED25519 keypair...done 44 | peer identity: 12D3KooWQXdv5A4etj6ndvjMFrdCn2e1JSjugeiGzeBrc6cojThN 45 | initializing IPFS node at ~/.ipfs 46 | to get started, enter: 47 | 48 | ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme 49 | ``` 50 | 51 | - 本地启动IPFS节点 52 | 53 | ```bash 54 | # IPFS 监控 55 | ipfs daemon 56 | # http://127.0.0.1:5001/webui 57 | ``` 58 | 59 | - 上传文件 60 | 61 | ```bash 62 | # 将文件上传到IPFS平台,上传后记录文件的 哈希值 63 | # 默认状况下通过“ipfs add”的文件会被循环地“pin”住,以保证它们不被清理。 64 | ipfs add ${filepath} 65 | # -r 上传目录 66 | ``` 67 | 68 | - 查看文件 69 | 70 | ```bash 71 | # 查看文件 72 | cid=QmXM8wZCE4AiBWpsv6qctwbtbb1e9cniMoJvjP2AYzm5PL # 父亲 73 | cid=QmWoAqLcN4X7vcvdmBJCJ6YoBf4iJ4BP2789ieHT2qja19 74 | # 通过命令行方式 75 | ipfs cat ${cid} 76 | ipfs get ${cid} 77 | # 通过游览器方式 78 | https://ipfs.io/ipfs/${cid} 79 | ``` 80 | 81 | - pin 82 | 83 | ```bash 84 | # 列出所有pin了的数据 85 | ipfs pin ls --type=all 86 | 87 | ipfs pin ls 88 | 89 | # 列出 pin 为指定状态的块 90 | ipfs pin ls -t direct 91 | 92 | # 递归 pin 文件,pin 的作用是保证文件在本地不被垃圾清理时清理掉 93 | ipfs pin add ${ci d} 94 | # 直接 pin(只 pin 指定 hash 的文件块) 95 | ipfs pin add --recursive=fals ${cid} 96 | ``` 97 | 98 | - 文件块 的 5 种 Pin 状态 99 | - Recursive 状态 100 | - 文件块树被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect 101 | - Direct 状态 102 | - 只有目标文件块添加到 pin 中, 子孙块不做处理,目标文件块的状态就是 Direct 103 | - Indirect 状态 104 | - 文件块树被递归添加到 pin 中,根文件块的状态是 Recursive,非根文件块的状态是 Indirect 105 | - Internal 状态 106 | - ipfs 使用文件块来保存 pinner 状态,这些文件块的状态就是 Internal 107 | - NotPinned 状态 108 | - 文件块没有被 pin,在 GC 时会被删除 109 | -------------------------------------------------------------------------------- /infra/vdf.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-12-28 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 传统的随机数方案 8 | 9 | 1. 方案一: 随机预言机RO(Random Oracle),对于不同的输入,可以产生均匀分布的随机数,对于相同的输入,得到的输出一定是相同的。但接收者必须简单的相信随机数是从输入值计算得来的。 10 | 2. 方案二: 带密钥的哈希函数,也可在有限数值区间内生成均匀分布的随机数。但如果要验证,必须暴露种子,一旦种子暴露给了敌手,敌手就可以计算出所有其它点对应的值,而不只是你想公布出去的某个点的值。 11 | 12 | - 问题: 没法验证随机数的确是由输入值产生的。 13 | 14 | ## VRF 15 | 16 | - 可验证随机函数(Verifiable Random Functions) 17 | - 定义: 18 | 1. 给定一个密钥,对于不同的输入值,可生成均匀分布的随机数和对应的proof。 19 | 2. 在不暴露密钥的情况下,敌手无法预测其它输入值对应的随机值。 20 | 3. 任何人都可以通过随机值和proof来验证此随机值的真实性。 21 | - 特点 22 | 1. 随机性 23 | 2. 唯一性 24 | 3. 可验证性 25 | - VRF在POS共识中的使用例子 26 | - 假设: 现在是round 10(第10 轮),节点们可能会轮流抽签,以节点自己的私钥 + 一个全网都知道的随机数(比如是这轮的轮次10)作为输入,生成了一个随机数(0-100); 27 | - 设置一个条件: 100 个节点轮流抽签,谁先抽出来的随机数大于10,就是这一轮的打包者。 28 | - 假设: 5 号节点抽到了11,可是只有5 号知道其他人不知道,因此他在广播这个随机的同时还需要广播一个零知识证明。通过零知识证明,全网只需要通过5 号的公钥就可以验证,接受5 号为这轮打包者。 29 | 30 | ## VDF 31 | 32 | - 可验证延迟函数(Verifiable Delay Function) 33 | 34 | - Boneh等人2018年论文《Verifiable Delay Functions》 https://eprint.iacr.org/2018/601.pdf 35 | 36 | - 定义: 37 | 38 | 1. 给定一个函数,输入一个值,执行N次运行,每一次运算的输入值为上一次的输出值,经过N次或一定时间后,输出结果和proof。 39 | 40 | - VDF特点 41 | 42 | 1. 随机性 43 | 2. 唯一性 44 | 3. 可验证性 45 | 4. 串行性: 只能顺序运算,无法通过增加计算设备而使运算时间变短。 46 | 47 | - VDF + RANDAO 48 | 49 | - RANDAO 是以太坊系统利用经济模式(奖励跟处罚)的方式,多个节点通过质押进行参与,在链上产生随机变量的一种机制。 50 | - RANDAO 有个缺点,就是最后一个节点可以预测/操纵结果。(最后一个节点也可能会受到惩罚)。 51 | - VDF + RANDAO 解决就是最后一个节点可以预测/操纵随机数的问题。 52 | 53 | - vs POW 54 | 55 | 1. 计算和验证都是非对称的。 56 | 2. pow可以并行运算,VDF只能串行计算。 57 | 3. 而对于给定输入x,VDF拥有唯一的输出(这也是为什么它被称作函数),而POW的解可以有多个。 58 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-08-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## Aleo项目的组成 8 | 9 | - Aleo 是第一个保护隐私的、可编程自定义隐私智能合约程序、可以链下执行隐私智能合约程序计算的区块链项目。 10 | - SnarkVM 是隐私智能合约程序的执行环境。功能类似于以太坊虚拟机。 11 | - SnarkOS 是隐私智能合约程序的去中心化操作系统。功能类似于以太坊公链。 12 | - Aleo SDK 是一个开发者框架,使零知识应用的开发变得更简单。开发者通过 Aleo SDK 可以快速地创建一个新账户,制作一笔交易,广播交易。 13 | - Aleo Leo 是隐私智能合约程序的高级编程语言,集成了Aleo SDK。 14 | 15 | ## Aleo生态 16 | 17 | - 私密文件分享 https://github.com/4sm-ops/zkDrop/ 18 | 19 | - Aleo谷歌插件钱包 还未开源 20 | 21 | - https://discord.com/channels/700454073459015690/700465638937722951/1029814875976892456 22 | - 适配器 https://github.com/demox-labs/aleo-wallet-adapter 23 | 24 | - 大使计划 https://www.aleo.org/post/aleo-ambassador-program-update 25 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_concept.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-25 3 | --- 4 | 5 | [TOC] 6 | 7 | ## off-chain execution 8 | 9 | 1. 以太坊网络 10 | 1. 每一次交易,链上所有的节点都需要执行一次交易的计算操作,非常浪费资源。 11 | 2. 如果交易需要很长的计算,则会严重阻塞以太坊网络,因此以太坊通过gas机制来限制交易的计算时间。 12 | 2. Aleo网络 13 | 1. 使用了零知识证明技术,每一次交易,涉及到的计算操作只需要执行一次即可。 14 | 2. 通过Prover程序执行交易的计算操作,生成生成零知识证明200个字节大小的 proof,无论计算量有多大,生成的roof大小都是差不多一样的。 15 | 3. 将proof传递到链上,所有的节点进行验证,验证的消耗时间是极短的,大概10毫秒,最后更改链上的状态。 16 | 17 | ## Accounts 18 | 19 | 1. 账户的功能: 负责对交易进行签名。 20 | 21 | 2. 账户由三个元素组成 22 | 23 | 1. Account Private Key 私钥 24 | 2. Account View Key 可视密钥 25 | 3. Account Address 地址 26 | 27 | 3. Account Proving Key 账户证明密钥 28 | 29 | 1. 来源: 由私钥生成的,一个临时的授权密钥。 30 | 2. 功能: 授权prover代表用户去执行特定的交易,也可以查看用户的所有交易信息。 31 | 32 | 4. Account View Key 33 | 34 | 1. 来源: 由私钥生成的。 35 | 2. 功能: 查看用户的所有交易信息。 36 | 37 | 5. Account Address 38 | 39 | 1. 来源: 由私钥生成的。 40 | 2. 功能: 进行交易时,对用户进行识别。 41 | 42 | ## Records 43 | 44 | 1. 定义: 记录用户数据和应用程序状态的基本数据结构,可以被注册存储在Aleo链上。 45 | 2. 特点: 46 | 1. Aleo链上的record是被加密过的。 47 | 2. Ethereum网络上的数据是通过Account模型进行管理的;Bitcoin网络上的数据是通过UTXO模型进行管理的;Aleo网络上的数据是通过Record模型进行管理的,类似于UTXO模型,每次发生交易,都会涉及到Record的销毁与创建。 48 | 3. 当一条record在交易中被消费时,旧的record将会被销毁,新的record将会被创建。 49 | 4. 当一条record在交易中被创建时,只有交易的发送者和接受者能使用Account View Key来解密查看record数据。 50 | 3. 数据结构: 51 | 1. owner: address 拥有这条Record的账户地址 52 | 2. gates: u64 这条Record里面存储的Aleo积分 53 | 3. data: Map\ 存储了应用数据 54 | 4. nonce: group 55 | 4. Record Commitment: Records的唯一标识符。 56 | 57 | ## Programs 58 | 59 | 1. 定义: Aleo的应用层,隐私智能合约程序。 60 | 2. 公链内部内置了credits隐私智能合约程序,用于存储所有aleo的积分状态。 61 | 62 | ## Transitions 63 | 64 | 1. 定义: 每一次链上状态的改变,都是一次Transition。 65 | 66 | ## Transactions 67 | 68 | 1. 定义: 多个Transitions的集合。用户既可以将多个Transitions打包为一个Transaction,也可以将每个Transition打包为一个Transaction。 69 | 2. 每一次交易,都会涉及到Record的销毁和新建。 70 | 71 | ## Serial Number 72 | 73 | 1. 当Record被销毁时,会通过它的Commitment和拥有者私钥生成Serial Number,以此来防止链上的Record被双花。 74 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_credits.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-24 3 | --- 4 | 5 | [TOC] 6 | 7 | [credits隐私智能合约ERC20程序源码](https://github.com/AleoHQ/snarkVM/blob/testnet3/vm/compiler/src/program/mod.rs#/L105) 8 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_dapp_deploy.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-03-02 3 | --- 4 | 5 | [TOC] 6 | 7 | - 相关资料链接 8 | - 官方部署文档 https://developer.aleo.org/testnet/getting_started/deploy_execute_demo/ 9 | - 查看链上所有的程序 https://explorer.hamp.app/programs 10 | - 测试网领水 https://twitter.com/AleoFaucet 11 | - Aleo SDK在线工具 https://aleo.tools/ 12 | - snarkOS源码 https://github.com/AleoHQ/snarkOS 13 | - leo源码 https://github.com/AleoHQ/leo 14 | - Aleo CSDN http://t.csdn.cn/BUUAx 15 | 16 | ## 安装相关软件 17 | 18 | - 安装cargo、snarkos、leo 19 | 20 | ```bash 21 | # 1. 下载安装Rust工具链管理器(内涵Rust编译工具) 22 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 23 | source $HOME/.cargo/env 24 | # 查看是否安装成功,未输出找不到此命令则表示安装成功 25 | cargo --version 26 | ``` 27 | 28 | ```bash 29 | # 2. 下载安装aleo隐私应用部署工具 30 | git clone https://github.com/AleoHQ/snarkOS.git --depth 1 31 | cd snarkOS 32 | cargo install --path . --locked 33 | # 查看是否安装成功,未输出找不到此命令则表示安装成功 34 | ``` 35 | 36 | ```bash 37 | # 3. 下载安装aleo隐私应用编译工具 38 | git clone https://github.com/AleoHQ/leo --depth 1 39 | cd leo 40 | cargo install --path . --locked 41 | # 查看是否安装成功,未输出找不到此命令则表示安装成功 42 | leo 43 | ``` 44 | 45 | ## 钱包数据准备 46 | 47 | 1. 生成钱包 48 | 49 | - 通过 https://aleo.tools/ 网站 Account 栏目的 Generate按钮生成,然后将 Private Key、View Key、Address 记录下来,在这里我们把这三个值分别命名为 private_key , view_key , wallet_dddress . 如下图所示。 50 | - ![image-20230302161620487](./picture/aleo_dapp_deploy_1.png) 51 | 52 | 2. 领水,在自己的推特账户上发表如下信息,从而获得测试代币。 如下图所示。 53 | 54 | ``` 55 | @AleoFaucet 56 | 57 | Please send 10 credits to address 钱包地址 58 | ``` 59 | 60 | ![image-20230302163729707](./picture/aleo_dapp_deploy_2.png) 61 | 62 | 3. 验证是否领水成功 63 | 64 | - 等待5分钟后查看自己是否领水成功,领水成功的话,如下图红框内所示会得到 @AleoFaucet 的一个引用,然后点击红框内的 1 Quote Tweet。如下图所示。 65 | - ![aleo_dapp_deploy_3](./picture/aleo_dapp_deploy_3.png) 66 | 67 | 4. 点击上图红框内内容后,就会跳转到下图,然后点击下图红框内的内容。如下图所示。 68 | 69 | - ![aleo_dapp_deploy_4](./picture/aleo_dapp_deploy_4.png) 70 | 71 | 5. 点击上图红框内链接后,会返回一个Json字符串,如下图所示。将第三个value的内容复制下来,在这里我们称呼这个内容为 record_ciphertext ,是我们加密后的链上数据的记录。或者按下面的方式将Json字符串进行格式化后再进行复制。如下图所示。 72 | 73 | - ![aleo_dapp_deploy_5](./picture/aleo_dapp_deploy_5.png) 74 | 75 | 6. 复制上图的 Json字符串通到 [json.cn](https://json.cn) 网站进行格式化,或者[安装谷歌插件json-beautifier-editor](https://chrome.google.com/webstore/detail/json-beautifier-editor/lpopeocbeepakdnipejhlpcmifheolpl) 后再打开红框内的链接即可得到如下图所示格式化后的数据。 将下图黄色背景的内容复制下来,在这里我们称呼这个内容为 record_ciphertext ,是我们加密后的链上数据的记录。如下图所示。 76 | 77 | - ![aleo_dapp_deploy_6](./picture/aleo_dapp_deploy_6.png) 78 | 79 | 7. 游览器上打开 [aleo.tools](https://aleo.tools/) ,选择 Record 栏目,然后将 record_ciphertext 数据复制粘贴到 Record (Ciphertext) 方框内,然后在View Key方框里输入自己的 view_key 的值, 网站就会自动解密得到 Record (Plaintext) 方框内的内容。在这里我们将Record (Plaintext) 方框内的内容称为 record_plaintext ,是我们解密后的链上数据的记录。如下图所示。 80 | 81 | - ![aleo_dapp_deploy_7](./picture/aleo_dapp_deploy_7.png) 82 | 83 | 8. 记录好 private_key , wallet_dddress , record_plaintext 三个值,在接来下部署隐私应用的时候需要用到。 84 | 85 | ## 部署隐私应用 86 | 87 | ```bash 88 | wallet_dddress="钱包地址wallet_dddress" # 填入自己的钱包地址 89 | private_key="钱包私钥private_key" # 填入自己的钱包的私钥 90 | 91 | app_name="helloworld_${wallet_dddress:0-6:6}" # 设置隐私应用名称,需要在Aleo网络里全网唯一,不能重名。因此我们截取钱包地址的部分字符串加入隐私应用名称内,以防止重名。 92 | leo new "${app_name}" # 创建一个隐私应用 93 | cd "${app_name}" && leo run && cd - # 进入隐私应用目录,进行编译,返回上层目录 94 | 95 | # 定义 Record 的明文 96 | record_plaintext="{ 97 | owner: aleo1xvlh6eyfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.private, 98 | gates: 10000000u64.private, 99 | _nonce: 41689884563743409008191298xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxgroup.public 100 | }" 101 | 102 | # 执行部署操作 103 | snarkos developer deploy "${app_name}.aleo" --private-key "${private_key}" --query "https://vm.aleo.org/api" --path "./${app_name}/build/" --broadcast "https://vm.aleo.org/api/testnet3/transaction/broadcast" --fee 600000 --record "${record_plaintext}" 104 | # 如下所示的日志,表示部署成功。 105 | # 将交易ID记录下来(重要,查询交易记录以及进行进行下一次交易时都可能需要用到),例如 at1j97a8qmy6k2udaw9h9w34nu7wwahpkljnvvfpjvklht5uzwgsv8ss30g43 。 106 | ``` 107 | 108 | ```log 109 | 📦 Creating deployment transaction for 'helloworld_gk5x0t.aleo'... 110 | 111 | ✅ Successfully deployed 'helloworld_gk5x0t.aleo' to https://vm.aleo.org/api/testnet3/transaction/broadcast. 112 | at1j97a8qmy6k2udaw9h9w34nu7wwahpkljnvvfpjvklht5uzwgsv8ss30g43 113 | ``` 114 | 115 | - 通过网站 [explorer.hamp.app/programs](https://explorer.hamp.app/programs) 查看被部署进网络里的隐私应用。 116 | - 输入 交易ID 进行查询,例如我这里部署成功后的交易ID为 at1j97a8qmy6k2udaw9h9w34nu7wwahpkljnvvfpjvklht5uzwgsv8ss30g43 。 117 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_leo.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-29 3 | --- 4 | 5 | [TOC] 6 | 7 | - 基于 Leo 仓库 testnet3分支 2022年10月16日提交的commit版本 3a8e11e278c7cf34d485fe63a1e90dec4b042e45 对以下内容进行介绍。 8 | 9 | ## 相关资料链接 10 | 11 | 1. Leo官网 https://leo-lang.org/ 12 | 2. Leo白皮书 https://eprint.iacr.org/2021/651.pdf 13 | 3. Leo源码 https://github.com/AleoHQ/leo 14 | 4. Leo文档 https://developer.aleo.org/leo/getting_started/overview 15 | 5. Leo包管理中心 https://aleo.pm/ 16 | 6. Aleo链上的Leo程序 https://www.aleo.network/programs 17 | 7. Leo编程语言的语法格式 https://github.com/AleoHQ/grammars 18 | 8. Leo编程介绍 https://www.entropy1729.com/leo-development-starter-pack/ 19 | 9. Leo的ARC提案 https://github.com/AleoHQ/ARCs 20 | 21 | - Leo编程案例 22 | 1. ARC20 https://github.com/Entropy1729/ARC20_leo 23 | 2. Bulls and Cows game(公牛和奶牛比赛游戏) https://github.com/mlsmith/aleo-numbers 24 | 3. ZK coinflip https://github.com/demox-labs/zk-coinflip 25 | 4. battleship游戏 https://github.com/demox-labs/zk-battleship 26 | 5. 隐私NFT https://github.com/demox-labs/aleo-nft 27 | 6. CTO讲述leo编程案例 https://youtu.be/-FrrylHITvg 28 | 29 | ## 概览 30 | 31 | - Leo编程语言的愿景 32 | 33 | - 让软件开发工程师可以不用关心零知识证明的底层知识、电路的生成,只需要关注业务层,即可以高效地构建零知识证明应用。 34 | 35 | - Leo简介 36 | 37 | 1. Leo是构建在 Aleo SDK 基础之上的零知识编程语言。 38 | 2. Leo是一种用于编写隐私应用程序的函数式静态类型编程语言。 39 | 3. Leo不同于传统计算机语言,Leo编写的程序会被编译成零知识证明的电路。 40 | 4. Leo通过构建零知识证明的电路,来执行运算操作。 41 | 42 | - Leo引进了 43 | 44 | 1. 零知识应用 45 | 2. resolver 46 | 3. 通用定理生成器 theorem generator for general-purpose 47 | 4. 测试框架 testing framework 48 | 5. 包管理器 package registry 49 | 50 | ## Leo 编译器安装 51 | 52 | - 方式一 通过Rust cargo宝箱库进行安装。(官方代码在快速迭代中,宝箱库里的代码比较陈旧,推荐通过源码进行安装) 53 | 54 | ```bash 55 | # 安装Leo编译器 56 | cargo install leo-lang 57 | # 验证是否安装成功 58 | leo --version 59 | ``` 60 | 61 | - 方式二 通过源码进行安装。 62 | 63 | ```bash 64 | # 下载源码 65 | git clone https://github.com/AleoHQ/leo 66 | cd leo 67 | # 安装leo编译器 68 | cargo install --path . 69 | # 验证是否安装成功 70 | leo --version 71 | ``` 72 | 73 | ## Leo 命令行指令 74 | 75 | ```bash 76 | # 创建一个项目 77 | project_name="hello_world" 78 | leo new ${project_name} 79 | cd ${project_name} 80 | 81 | # 编译一个项目 82 | leo build 83 | 84 | # 编译运行一个项目 85 | leo run # 执行transition名字为main的状态转移,从input文件夹内读取参数值。 86 | leo run ${transition_name} # 执行transition名字为${transition_name}的状态转移,从input文件夹内读取参数值。 87 | leo run ${transition_name} 参数1 参数2 # 执行transition名字为${transition_name}的状态转移,从命令行读取参数值。 88 | ``` 89 | 90 | ## Leo 的Hello World程序 91 | 92 | - 执行`leo new hello_world`指令创建一个名字为 hello_world 的项目。 93 | 94 | ### 项目目录结构 95 | 96 | 1. program.json 项目的元文件 97 | 2. README.md 项目的介绍 98 | 3. build 项目被编译后的文件 99 | 4. inputs 项目的输入参数文件夹 100 | - hello_world.in hello_world程序的输入参数文件 101 | 5. output 新建一个项目时并不会生成此目录,当编译运行时才会生成此文件夹。 102 | 6. src 项目的源代码文件夹 103 | - main.leo 项目的源代码入口 104 | 105 | ### 项目元文件 program.json 106 | 107 | ```json 108 | { 109 | "program": "hello_world.aleo", // 项目的名字 110 | "version": "0.0.0", // 项目版本号 111 | "description": "", // 项目描述 112 | "development": { 113 | "private_key": "APrivateKey1zkp2wpbnb7MwfxSn5WHePdtpdd11sPkL39BTHxCZveyiLPK", // 用于运行程序,执行签名的账户私钥 114 | "address": "aleo1t5w5dh60ftr9svj206sfkm3008l3auxctapr2tw36w6rjd5n2uxqfxv7tt" // 用于运行程序,的账户地址 115 | }, 116 | "license": "MIT" 117 | } 118 | ``` 119 | 120 | ### 源代码文件入口 src/main.leo 121 | 122 | ```rs 123 | // 通过 program 关键字定义一个名字为 'hello_world' 的程序。 124 | program hello_world.aleo { 125 | // transition 关键字,定义一次状态转移操作,定义名字为main。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。 126 | // 运行方式1 leo run main 127 | // 运行方式2 leo run main 4u32 5u32 128 | transition main(public a: u32, b: u32) -> u32 { 129 | let c: u32 = a + b; 130 | return c; 131 | } 132 | // transition 关键字,定义一次状态转移操作,定义名字为main2。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。 133 | // 运行方式1 leo run main2 134 | // 运行方式2 leo run main2 4u32 5u32 135 | transition main2(public a: u32, b: u32) -> u32 { 136 | let c: u32 = a * b; 137 | return c; 138 | } 139 | } 140 | ``` 141 | 142 | ### 输入参数文件 hello_world.in 143 | 144 | ```toml 145 | [main] 146 | public a: u32 = 1u32; 147 | b: u32 = 2u32; 148 | 149 | [main2] 150 | public a: u32 = 1u32; 151 | b: u32 = 2u32; 152 | ``` 153 | 154 | 1. main 代表了transition名字为 main 的一次状态转移操作中的输入参数。 155 | - 输入参数a,可见性为public,类型为u32,值为1 156 | - 输入参数b,类型为u32,值为2 157 | 2. main2 代表了transition名字为 main2 的一次状态转移操作中的输入参数。 158 | - 输入参数a,可见性为public,类型为u32,值为1 159 | - 输入参数b,类型为u32,值为2 160 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_leo_grammar_old.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-29 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 变量 8 | 9 | ### 概览 10 | 11 | 1. 变量赋值后是可以被改变的。 12 | 2. 变量的传递,是直接传递变量的值。 13 | 3. 变量没有 undefined 或者 null 值。 14 | 4. 变量的类型必须被指定。 15 | 5. 没有全局变量。 16 | 17 | ### 变量类型 18 | 19 | - Booleans 布尔类型 20 | 21 | - Integers 整型 22 | 23 | - 有符号整型 i8, i16, i32, i64, i128 24 | 25 | - 无符号整型 u8, u16, u32, u64, u128 26 | 27 | - 变量的bit越长,需要circuit的约束越多,计算时间越长。 28 | 29 | - field 域类型 30 | 31 | - Char 字符类型 32 | 33 | - Group 组/坐标对 34 | 35 | - Address 地址 36 | 37 | - Array 数组 38 | 39 | - tuple 元组 40 | 41 | ```rust 42 | // 要声明变量,必须使用 let 关键字。 43 | let var_name1: u32 = 9; 44 | let var_name2 = 4u32; 45 | 46 | // 布尔类型的变量 47 | let var_name2 = true; 48 | let var_name3: bool = false; 49 | 50 | 51 | // 声明常量,必须使用 const 关键字。 52 | const var_name4: u32 = 9; 53 | 54 | // 域类型的变量 55 | let var_field_1 = 1field; 56 | let var_field_2: field = 21888242871839275222246405745257275088548364400416034343698204186575808495617; 57 | 58 | // 字符类型 59 | let var_char:char = 'c'; 60 | 61 | // 坐标对 62 | let b = 0group; // the zero of the group 63 | let a = 1group; // the group generator 64 | let c = 2group; // 2 * the group generator 65 | let d = (0, 1)group; // coordinate notation 66 | 67 | // 地址 68 | let receiver: address = aleo1qnr4dkkvkgfqph0vzc3y6z2eu975wnpz2925ntjccd5cfqxtyu8sta57j8; 69 | ``` 70 | 71 | ```rust 72 | // 数组 73 | let c: [2; char] = "у́"; // correct, same as "\u{443}\u{301}" 74 | let e: [char; 5] = "🤷🏿‍♀️"; // correct, same as "\u{1F937}\u{1F3FF}\u{200D}\u{2640}\u{FE0F}" 75 | 76 | // 元组 77 | let a = (true, true); 78 | let b: (bool, bool) = (true, true); 79 | let first = a.0; 80 | let second = b.1; 81 | ``` 82 | 83 | ## 算数操作 84 | 85 | ```rust 86 | let a = 4u32; 87 | let result = (a + 1) * 2; 88 | ``` 89 | 90 | ## 流程控制 91 | 92 | ```rust 93 | let is_valid = true; 94 | let b: u8 = is_valid ? 1 : 0; 95 | 96 | if a { 97 | res = 1; 98 | } else if b { 99 | res = 2; 100 | } else { 101 | res = 3; 102 | } 103 | 104 | for i in 0..4 { 105 | a += 1; 106 | } 107 | ``` 108 | 109 | ## 函数 110 | 111 | ```rust 112 | function call(a: u32) { 113 | a = 0; // the copied value of `a` is set to 0 114 | } 115 | 116 | function main() -> u32 { 117 | let a = 1u32; 118 | call(a); // the `call` function receives a copy of `a` 119 | 120 | return a; // returns 1 121 | } 122 | ``` 123 | 124 | ## 模块 125 | 126 | - vi src/bar.leo 127 | 128 | ```rust 129 | circuit Bar { 130 | b: u32 131 | } 132 | 133 | function baz() -> u32 { 134 | return 1u32; 135 | } 136 | ``` 137 | 138 | - src/main.leo 139 | 140 | ```rust 141 | import bar.( 142 | Bar, 143 | baz 144 | ); 145 | 146 | function main() { 147 | const bar = Bar { b: 1u32}; 148 | const z = baz(); 149 | } 150 | ``` 151 | 152 | ## 程序输入参数 153 | 154 | - 程序输入参数可以被main函数使用。 155 | - 程序输入参数被定义在这个文件里 inputs/${project_name}.in 156 | 157 | ```conf 158 | [main] // <- section header 159 | a: u32 = 1; 160 | 161 | [constants] // 定义main函数的输入参数里面的常量 162 | b: u32 = 2; 163 | 164 | [registers] 165 | r0: u32 = 0; 166 | ``` 167 | 168 | ```rust 169 | function main(a: u32, const b: u32) -> u32 { 170 | let c: u32 = a + b; 171 | return c; 172 | } 173 | ``` 174 | 175 | ## Circuits 电路器 176 | 177 | ```rust 178 | // circuit 关键字类似于java中的class 179 | circuit Point { 180 | x: u32, 181 | y: u32, 182 | 183 | // 返回Self的方法是静态方法,不需要实例化circuit就可以调用。 调用方式 Point::new() 184 | function new() -> Self { 185 | return Self { 186 | x: 0, 187 | y: 0, 188 | }; 189 | } 190 | 191 | // 调用方式 实例.add() 192 | function add(self) -> u32 { 193 | return self.x + self.y; 194 | } 195 | } 196 | ``` 197 | 198 | ```rust 199 | circuit Foo { 200 | a: u32, 201 | 202 | // Instantiates a new Foo circuit with a = 0u32. 203 | function new() -> Self { // Self resolves to circuit type Foo 204 | return Self { a: 0u32 }; 205 | } 206 | 207 | // Logs the self circuit variable to console. 208 | function log(self) { 209 | console.log("{}", self.a); // Errors if "self" keyword is not present. 210 | } 211 | 212 | // Mutates the self circuit variable a = 1u32. 213 | function mutate(mut self) { 214 | self.a = 1u32; // Errors if "mut self" keyword is not present. 215 | } 216 | } 217 | 218 | function main() { 219 | let f = Foo::new(); 220 | 221 | f.mutate(); // Errors if "f" is not mutable. 222 | f.log(); // Prints "1" 223 | } 224 | ``` 225 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_leo_grammer.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-10-17 3 | --- 4 | 5 | [TOC] 6 | 7 | ## Leo编程 8 | 9 | - https://github.com/AleoHQ/ARCs/discussions/17 10 | 11 | - 2022.10.04 将来语法的变动 https://discord.com/channels/700454073459015690/722549434520699030/1026672405697024000 12 | 13 | 1. interface -> struct 14 | 2. function -> transition 15 | 3. closure -> function 16 | 17 | ## 关键字 18 | 19 | 01. import 导入一个Aleo程序作为函数库来进行调用,所导入的程序文件必须在imports目录下。 20 | 02. program 声明一个隐私智能合约程序,隐私智能合约程序程序类似于Rust里的宝箱名字,需要在宝箱仓库里全局唯一。 21 | 03. function 声明一个函数,函数不能直接执行,必须被其它函数调用。 22 | 04. transition 声明一次状态更新操作,可以在在命令行直接执行。 23 | 05. input 定义一个函数的输入参数。 24 | 06. output 定义一个函数的输出参数。 25 | 07. record 声明一个数据结构,数据存储于链上,必须包含两个字段 owner 和 gates。 26 | 08. interface 声明一个接口,类似于Rust语言里的impl关键字。 27 | 09. mapping 声明一个KV健值对。 28 | 10. increment 给KV健值对的值执行加法操作。 29 | 11. decrement 给KV健值对的值执行减法操作。 30 | 12. finalize 将record状态的更新,变为对外公开。 31 | 13. name.network 32 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_link.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-11-01 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 相关链接 8 | 9 | - Aleo 10 | 11 | 1. 项目官网 https://aleo.org/ 12 | 2. 官方博客 https://www.aleo.org/blog 13 | 3. Twitter https://twitter.com/AleoHQ 14 | 4. Discord https://discord.gg/QHmyeHCMQn 15 | 5. Github https://github.com/AleoHQ 16 | 6. 区块链游览器 https://www.aleo.network/ 17 | 18 | - Aleo隐私智能合约平台 SDK 19 | 20 | 1. Aleo SDK https://github.com/AleoHQ/aleo 21 | 2. Aleo SDK主要贡献者entropy1729团队官网 https://www.entropy1729.com/ 22 | 3. Aleo SDK主要贡献者entropy1729团队GIthub https://github.com/Entropy1729 23 | 4. 在线Aleo钱包生成工具 https://aleohq.github.io/aleo/ 24 | 5. Aleo SDK基本概念 https://www.entropy1729.com/aleo-introduction 25 | 6. Aleo SDK基本语法 https://www.entropy1729.com/aleo-development-starter-pack/ 26 | 27 | - Leo隐私智能合约编程(内嵌Aleo SDK) 28 | 29 | 01. Leo白皮书 https://eprint.iacr.org/2021/651.pdf 30 | 02. Leo源码 https://github.com/AleoHQ/leo 31 | 03. Leo的ARC提案 https://github.com/AleoHQ/ARCs 32 | 04. Leo官网 https://leo-lang.org/ 33 | 05. Leo的IDE https://aleo.studio/ 34 | 06. Leo在线IDE https://play.leo-lang.org/ 35 | 07. Leo文档 https://developer.aleo.org/leo/getting_started/overview 36 | 08. Leo包管理中心 https://aleo.pm/ 37 | 09. Aleo链上的Leo程序 https://www.aleo.network/programs 38 | 10. Leo编程语言的语法格式 https://github.com/AleoHQ/grammars 39 | 11. Leo编程介绍 https://www.entropy1729.com/leo-development-starter-pack/ 40 | 41 | - Aleo SDK编程案例 42 | 43 | - https://github.com/zkprivacy/aleo-vote 44 | 45 | - Leo编程案例 46 | 47 | 1. ARC20 https://github.com/Entropy1729/ARC20_leo 48 | 2. Bulls and Cows game(公牛和奶牛比赛游戏) https://github.com/mlsmith/aleo-numbers 49 | 3. ZK coinflip https://github.com/demox-labs/zk-coinflip 50 | 4. battleship游戏 https://github.com/demox-labs/zk-battleship 51 | 5. 隐私NFT https://github.com/demox-labs/aleo-nft 52 | 6. CTO讲述leo编程案例 https://youtu.be/-FrrylHITvg 53 | 54 | ## 愿景 55 | 56 | 1. 比特币: 去中心化 57 | 2. 以太坊: 去中心化 + 可编程性 58 | 3. Zcash: 去中心化 + 隐私性 59 | 4. Aleo: 去中心化 + 可编程性 + 隐私性 60 | 61 | ## 原理 62 | 63 | ### 技术原理 64 | 65 | 1. 核心论文 66 | 67 | 1. Aleo 项目介绍视频 https://www.youtube.com/watch?v=Bz2KN_h3VKM&t=1903s 68 | 2. Aleo POSW文档 https://developer.aleo.org/advanced/posw/posw/ 69 | 3. Aleo的实现是基于Zexe论文 https://eprint.iacr.org/2018/962 70 | 4. Aleo项目使用的zkp算法Marlin算法论文 https://eprint.iacr.org/2019/1047.pdf 71 | 5. Leo应用编程语言论文 https://eprint.iacr.org/2021/651.pdf 72 | 6. AleoBFT共识机制论文 https://arxiv.org/abs/1803.05069 73 | 74 | 2. POSW (Proof of Succinct Work ) 共识机制 75 | 76 | 1. POSW是一种基于SNARK(Succinct Non-interactive ARgument of Knowledge) 的POW算法,用于激励开发SNARK加速的硬件。 77 | 2. PoSW为比特币SHA-based difficulty adjusting算法的变种,最关键的不同之处是 底层计算不是hash运算,而是proof of knowledge计算,使得PoSW作为PoW来保证系统共识。 78 | 79 | 3. ZKP 80 | 81 | 1. Aleo主要针对四种电路进行了四次零知识证明: PosW Ciruit/Inner Circuit/Outer Circuit/Program Circuit。 82 | 2. 零知识证明涉及到的算法 Groth16、 Marlin、 KZG10 83 | 1. KZG10 https://www.iacr.org/archive/asiacrypt2010/6477178/6477178.pdf 84 | 85 | - 86 | 87 | 1. 去中心化账本模型 88 | 89 | 1. 比特币系列的项目用的是 UTXO Model 90 | 2. 以太坊系列的项目用的是 Account Model 91 | 3. Aleo使用 Record Model 92 | 93 | 2. DPC 94 | 95 | 1. Aleo使用零知识机制创建了一个新的密码学原语:decentralized private computation (DPC)。 96 | 2. 在DPC中,用户链下进行计算和生成交易,证明计算的正确性。 97 | 3. DPC的特点 98 | 1. 交易隐藏了所有的链下计算信息。 99 | 2. 交易能被在固定时间内进行验证,和链下的计算时间无关。 100 | 3. 交易数据只有968个字节,和计算时间无关。 101 | 4. 生成交易并不会产生gas费用,因此应用可以运行无限长的时间。 102 | 103 | ### 技术亮点(同系列项目中的突出点创新点) 104 | 105 | - 以太坊系列去中心化账本,交易都是链上执行,最终状态保存在链上。 106 | - 浪费资源,每一个挖矿节点都需要执行一次交易里的计算内容。 107 | - 没有隐私,交易数据被永久的公开的保存在链上。 108 | - Aleo去中心化账本,交易在链下执行,最终状态保存在链上。(链下完成交易计算生成零知识证明,链上只需要对零知识证明的验证) 109 | - 可扩展性,每个块中可以有几千个交易被验证。 110 | - 保护隐私,链下计算的数据不会被上传到链上,数据不会被暴露。 111 | - 简洁性,计算结果很小并且能很快被验证(几千字节的数据在50毫秒内可以被验证) 112 | - 可编程性。 113 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_sdk.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-24 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 相关资料链接 8 | 9 | 1. Aleo SDK https://github.com/AleoHQ/aleo 10 | 2. Aleo SDK主要贡献者entropy1729团队官网 https://www.entropy1729.com/ 11 | 3. Aleo SDK主要贡献者entropy1729团队GIthub https://github.com/Entropy1729 12 | 4. 在线Aleo钱包生成工具 https://aleohq.github.io/aleo/ 13 | 5. Aleo SDK基本概念 https://www.entropy1729.com/aleo-introduction 14 | 6. Aleo SDK基本语法 https://www.entropy1729.com/aleo-development-starter-pack/ 15 | 16 | - 编程案例 17 | - https://github.com/zkprivacy/aleo-vote 18 | 19 | ## Aleo SDK 安装 20 | 21 | - 通过Rust宝箱仓库安装 22 | 23 | ```bash 24 | # 官方代码在快速迭代中,更加推荐通过源码进行安装 25 | cargo install aleo 26 | ``` 27 | 28 | - 通过编译源码安装 29 | 30 | ```bash 31 | # 下载源码 32 | git clone https://github.com/AleoHQ/aleo.git 33 | # 进入源码目录 34 | cd aleo 35 | # 安装 aleo sdk 程序 # rust安装教程 https://www.rust-lang.org/tools/install 36 | cargo install --path . 37 | # 查看是否安装成功 38 | aleo -h 39 | ``` 40 | 41 | ## Aleo SDK 指令 42 | 43 | ```bash 44 | # 创建一个包 45 | aleo new 包名字 46 | # 自动在${包名字}文件夹下生成两个文件 47 | # main.aleo 代码文件 48 | # program.json 程序配置文件 49 | 50 | # 生成一个钱包账户 51 | aleo account new 52 | # Private Key APrivateKey1zkpDStSQfu6maFgSro5ePXax8xS4MmBj7qA98FBKR8xm1ZU 53 | # View Key AViewKey1reh7CfNpCyo77UXKx46kjLL7KAPntSDVA2BNjBPwt7of 54 | # Address aleo1zjnre3esly55gkeqlet5xvklvwqntfpcxkdac5l8wk0sdyp35ygq7ulxk4 55 | 56 | # 编译程序生成证明 57 | aleo build 58 | # build 后生成的文件 59 | # 1. AVM虚拟机运行的字节码文件 mian.avm 60 | # 2. 每一个函数都会生成一个证明者文件 函数名.prover 61 | # 3. 每一个函数都会生成一个验证者文件 函数名.verifier 62 | 63 | # 远程编译程序生成证明 # 具体如何填写${ENDPOINT},目前还未知 64 | aleo build --endpoint ${ENDPOINT} 65 | 66 | # 运行程序 67 | aleo run ${FUNCTION} ${INPUTS} 68 | 69 | # 本地运行一个开发节点,并且部署程序 70 | aleo node start 71 | # 本地运行一个开发节点,不部署程序 72 | aleo node start --nodeploy 73 | 74 | # 清除build结果 75 | aleo clean 76 | ``` 77 | 78 | ## Aleo SDK 的Hello World程序 79 | 80 | - 编写一个函数,从外部输入两个数字,然后进行相加,最后输出结果。 81 | ```bash 82 | aleo new aleo_hello 83 | cd aleo_hello 84 | vim main.aleo # 输入下面的代码片段 85 | aleo run add_fun 2021u32 1u32 # 执行add_fun相加函数,传入2021和1两个数字 86 | aleo node start # 本地运行一个开发节点,并且部署运行程序 87 | ``` 88 | - 代码片段 89 | ```rs 90 | program aleo_hello.aleo; 91 | 92 | // 运行方式 aleo run add_fun 2021u32 1u32 93 | function add_fun: // 通过 function 关键字定义一个函数 94 | input r0 as u32.public; // 定义一个输入参数r0,类型为u32,可见性为public 95 | input r1 as u32.private; 96 | add r0 r1 into r2; // 调用sdk的函数add 97 | output r2 as u32.private; // 定义一个输出参数r2,类型为u32,可见性为private 98 | ``` 99 | 100 | ## Aleo SDK 本地开发节点API 101 | 102 | ```bash 103 | # 查看最新的块高 104 | curl http://localhost:4180/testnet3/latest/block/height 105 | 106 | # 通过块高高度查看账本 107 | curl http://localhost:4180/testnet3/block/{height} 108 | 109 | # 查看最后一个块高的哈希 110 | curl http://localhost:4180/testnet3/latest/block/hash 111 | 112 | # 通过ViewKey查看records 113 | # curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"ViewKey"' 114 | curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 115 | curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"AViewKey1eZqsm6igutMTUbnwWw8vPQG5ceJruyYQs8XwTmNQdMJf"' | jq 116 | 117 | # This endpoint retrieves only the spent records belonging to a given ViewKey 118 | curl --location --request GET 'localhost:4180/testnet3/records/spent' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 119 | 120 | # This endpoint retrieves only the unspent records belonging to a given ViewKey. 121 | curl --location --request GET 'localhost:4180/testnet3/records/unspent' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 122 | ``` 123 | -------------------------------------------------------------------------------- /infra/zkp/aleo/aleo_sdk_grammer.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-24 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 关键字 8 | 9 | 01. import 导入一个Aleo程序作为函数库来进行调用,所导入的程序文件必须在imports目录下。 10 | 02. program 声明一个隐私智能合约程序,隐私智能合约程序程序类似于Rust里的宝箱名字,需要在宝箱仓库里全局唯一。 11 | 03. closure 声明一个闭包函数,闭包函数不能直接执行,必须被其它函数调用。 12 | 04. function 声明一个函数,可以在在命令行直接执行。 13 | 05. input 定义一个函数的输入参数。 14 | 06. output 定义一个函数的输出参数。 15 | 07. record 声明一个数据结构,用于在链上存储状态,必须包含两个字段 owner 和 gates。 16 | 08. interface 声明一个接口,类似于Rust语言里的结构体。 17 | 09. cast 创建一个新的指定数据类型的实例。 18 | 10. mapping 声明一个KV健值对。 19 | 11. increment 给KV健值对的值执行加法操作。 20 | 12. decrement 给KV健值对的值执行减法操作。 21 | 13. finalize 终局化。将record数据注册进链上,链上原有的record被销毁新的record被创建。 22 | 23 | ## 数据类型 24 | 25 | 1. 内置的数据类有 `boolean field group i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 scalar string`。 26 | 2. 可以通过`record`和`interface`关键字自定义数据类型。 27 | 28 | ## 通过代码解读语法 29 | 30 | - 命令行操作 31 | ```bash 32 | aleo new myaleo # 创建一个基于Aleo SDK的隐私智能合约程序项目 33 | cd myaleo 34 | mkdir imports 35 | vim imports/myfun.aleo # 输入下面的 代码片段一 36 | vim main.aleo # 输入下面的 代码片段二 37 | 38 | aleo build 39 | # imports目录下的函数,默认不会被编译,只有当main.aleo文件使用到imports目录下的函数时,才会被编译。 40 | 41 | aleo account new # 创建一个账户 42 | 43 | # 函数的执行方式 aleo run main文件内的函数名 参数... 44 | 45 | # 运行mint_public函数,创建20个Token给地址为aleo14cxpdt6ga4v4aflnd0xkr26leatmhfws0h7pquw8jafg9hu2nsxqky55ua的账户 46 | aleo run mint_public aleo14cxpdt6ga4v4aflnd0xkr26leatmhfws0h7pquw8jafg9hu2nsxqky55ua 20u64 47 | # 运行call_sub函数,传入两个类型为u32的参数,执行减法操作 48 | aleo run call_sub 10u32 1u32 49 | 50 | aleo node start # 本地运行一个开发节点,并且部署运行程序 51 | ``` 52 | - 代码片段一 53 | ```rs 54 | // 声明一个隐私智能合约程序。 55 | program myfun.aleo; 56 | 57 | // 通过 closure 关键字声明一个闭包,闭包函数不能直接执行必须通过其它函数调用来执行 58 | closure util_add: 59 | input r0 as u32; 60 | input r1 as u32; 61 | add r0 r1 into r2; // 调用sdk的函数add 62 | output r2 as u32; 63 | 64 | // 定义一个函数,传入两个u32类型的参数执行相加操作 65 | // 运行方式 aleo run fun_add 1u32 22u32 66 | function fun_add: // 通过 function 关键字定义一个函数 67 | input r0 as u32.public; // 定义一个输入参数r0,类型为u32,可见性为public 68 | input r1 as u32.private; 69 | call util_add r0 r1 into r2; // 通过call关键字,调用自定义的闭包函数 70 | output r2 as u32.private; // 定义一个输出参数r2,类型为u32,可见性为private 71 | 72 | // 定义一个函数 执行相加操作 73 | // 运行方式 aleo run fun_sub 10u32 1u32 74 | function fun_sub: 75 | input r0 as u32.public; 76 | input r1 as u32.private; 77 | sub r0 r1 into r2; 78 | output r2 as u32.private; 79 | 80 | // 通过 interface 关键字定义一个数据结构 81 | interface array3: 82 | a0 as u32; 83 | a1 as u32; 84 | a2 as u32; 85 | 86 | // 定义一个函数,给record里的值都执行加1操作,然后输出一个新的record 87 | // 运行方式 aleo run sum_one_to_array3 "{a0: 0u32, a1: 1u32, a2: 2u32}" 88 | function sum_one_to_array3: 89 | input r0 as array3.private; // 输入一个数据类型为array3的数据 90 | add r0.a0 1u32 into r1; // 通过r0.a0访问interface变量内部的属性 91 | add r0.a1 1u32 into r2; 92 | add r0.a2 1u32 into r3; 93 | cast r1 r2 r3 into r4 as array3; // 使用cast关键字创建一个新的 interface 94 | output r4 as array3.private; // 输出 95 | ``` 96 | - 代码片段二 97 | ```rs 98 | import myfun.aleo; // 导入 myfun.aleo 程序进当前作用域内 // myfun.aleo 文件需要放在当前目录的imports文件夹内 99 | 100 | // 声明一个隐私智能合约程序。 101 | program myaleo.aleo; 102 | 103 | // 定义一个函数,传入两个u32类型的参数执行减法操作 104 | // 运行方式 aleo run call_sub 10u32 1u32 105 | function call_sub: 106 | input r0 as u32.public; 107 | input r1 as u32.private; 108 | call myfun.aleo/fun_sub r0 r1 into r2; // 调用myfun.aleo里面的fun_sub函数 109 | output r2 as u32.private; 110 | 111 | // 通过 record 关键字定义一个record,必须包含 owner 和 gates 字段 112 | record token: 113 | // 定义这个名字为token的record拥有者 114 | owner as address.private; 115 | // 定义gates的数量。gates为Aleo项目里代币的最小单位,如同以太坊里的Wei。 116 | gates as u64.private; 117 | // 定义amount字段 118 | amount as u64.private; 119 | 120 | // 通过 mapping 关键字定义一个KV健值对 121 | mapping account: 122 | // 账户地址作为Key 123 | key owner as address.public; 124 | // 数量作为Value 125 | value amount as u64.public; 126 | 127 | // 创建指定数量的token给指定的账户地址 128 | function mint_public: 129 | // 输入token的接收者 130 | input r0 as address.public; 131 | // 输入创建token的数量 132 | input r1 as u64.public; 133 | // Mint the tokens publicly. 134 | // 终局化到链上 135 | finalize r0 r1; 136 | 137 | // 终局化mint_public函数的操作,增加account[address]的代币数量 138 | finalize mint_public: 139 | // Input the token receiver. 140 | input r0 as address.public; 141 | // Input the token amount. 142 | input r1 as u64.public; 143 | 144 | // 终局化操作里必须包含一个increment或decrement操作 145 | // 执行增加操作 `account[r0]` + `r1`. 146 | // 如果 `account[r0]` 不存在,则被自动创建 147 | // 如果 `account[r0] + r1` 益处, `mint_public` 函数被重置 148 | increment account[r0] by r1; 149 | ``` 150 | -------------------------------------------------------------------------------- /infra/zkp/aleo/essay/aleo_leo_helloworld.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-10-18 3 | --- 4 | 5 | [TOC] 6 | 7 | - 基于 Leo 仓库 testnet3分支 2022年10月16日提交的commit版本 3a8e11e278c7cf34d485fe63a1e90dec4b042e45 对以下内容进行介绍。 8 | 9 | ## 相关资料链接 10 | 11 | 1. Leo官网 https://leo-lang.org/ 12 | 2. Leo白皮书 https://eprint.iacr.org/2021/651.pdf 13 | 3. Leo源码 https://github.com/AleoHQ/leo 14 | 4. Leo文档 https://developer.aleo.org/leo/getting_started/overview 15 | 5. Leo包管理中心 https://aleo.pm/ 16 | 6. Aleo链上的Leo程序 https://www.aleo.network/programs 17 | 7. Leo编程语言的语法格式 https://github.com/AleoHQ/grammars 18 | 8. Leo编程介绍 https://www.entropy1729.com/leo-development-starter-pack/ 19 | 20 | - Leo编程案例 21 | 1. ARC20 https://github.com/Entropy1729/ARC20_leo 22 | 2. Bulls and Cows game(公牛和奶牛比赛游戏) https://github.com/mlsmith/aleo-numbers 23 | 3. ZK coinflip https://github.com/demox-labs/zk-coinflip 24 | 4. battleship游戏 https://github.com/demox-labs/zk-battleship 25 | 5. 隐私NFT https://github.com/demox-labs/aleo-nft 26 | 6. CTO讲述leo编程案例 https://youtu.be/-FrrylHITvg 27 | 28 | ## 概览 29 | 30 | - Leo编程语言的愿景 31 | 32 | - 让软件开发工程师可以不用关心零知识证明的底层知识、电路的生成,只需要关注业务层,即可以高效地构建零知识证明应用。 33 | 34 | - Leo简介 35 | 36 | 1. Leo是构建在 Aleo SDK 基础之上的零知识编程语言。 37 | 2. Leo是一种用于编写隐私应用程序的函数式静态类型编程语言。 38 | 3. Leo不同于传统计算机语言,Leo编写的程序会被编译成零知识证明的电路。 39 | 4. Leo通过构建零知识证明的电路,来执行运算操作。 40 | 41 | - Leo引进了 42 | 43 | 1. 零知识应用 44 | 2. resolver 45 | 3. 通用定理生成器 theorem generator for general-purpose 46 | 4. 测试框架 testing framework 47 | 5. 包管理器 package registry 48 | 49 | ## Leo 编译器安装 50 | 51 | - 方式一 通过Rust cargo宝箱库进行安装。(官方代码在快速迭代中,宝箱库里的代码比较陈旧,推荐通过源码进行安装) 52 | 53 | ```bash 54 | # 安装Leo编译器 55 | cargo install leo-lang 56 | # 验证是否安装成功 57 | leo --version 58 | ``` 59 | 60 | - 方式二 通过源码进行安装。 61 | 62 | ```bash 63 | # 下载源码 64 | git clone https://github.com/AleoHQ/leo 65 | cd leo 66 | # 安装leo编译器 67 | cargo install --path . 68 | # 验证是否安装成功 69 | leo --version 70 | ``` 71 | 72 | ## Leo 命令行指令 73 | 74 | ```bash 75 | # 创建一个项目 76 | project_name="hello_world" 77 | leo new ${project_name} 78 | cd ${project_name} 79 | 80 | # 编译一个项目 81 | leo build 82 | 83 | # 编译运行一个项目 84 | leo run # 执行transition名字为main的状态转移,从input文件夹内读取参数值。 85 | leo run ${transition_name} # 执行transition名字为${transition_name}的状态转移,从input文件夹内读取参数值。 86 | leo run ${transition_name} 参数1 参数2 # 执行transition名字为${transition_name}的状态转移,从命令行读取参数值。 87 | ``` 88 | 89 | ## Leo 的Hello World程序 90 | 91 | - 执行`leo new hello_world`指令创建一个名字为 hello_world 的项目。 92 | 93 | ### 项目目录结构 94 | 95 | 1. program.json 项目的元文件 96 | 2. README.md 项目的介绍 97 | 3. build 项目被编译后的文件 98 | 4. inputs 项目的输入参数文件夹 99 | - hello_world.in hello_world程序的输入参数文件 100 | 5. output 新建一个项目时并不会生成此目录,当编译运行时才会生成此文件夹。 101 | 6. src 项目的源代码文件夹 102 | - main.leo 项目的源代码入口 103 | 104 | ### 项目元文件 program.json 105 | 106 | ```json 107 | { 108 | "program": "hello_world.aleo", // 项目的名字 109 | "version": "0.0.0", // 项目版本号 110 | "description": "", // 项目描述 111 | "development": { 112 | "private_key": "APrivateKey1zkp2wpbnb7MwfxSn5WHePdtpdd11sPkL39BTHxCZveyiLPK", // 用于运行程序,执行签名的账户私钥 113 | "address": "aleo1t5w5dh60ftr9svj206sfkm3008l3auxctapr2tw36w6rjd5n2uxqfxv7tt" // 用于运行程序,的账户地址 114 | }, 115 | "license": "MIT" 116 | } 117 | ``` 118 | 119 | ### 源代码文件入口 src/main.leo 120 | 121 | ```rs 122 | // 通过 program 关键字定义一个名字为 'hello_world' 的程序。 123 | program hello_world.aleo { 124 | // transition 关键字,定义一次状态转移操作,定义名字为main。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。 125 | // 运行方式1 leo run main 126 | // 运行方式2 leo run main 4u32 5u32 127 | transition main(public a: u32, b: u32) -> u32 { 128 | let c: u32 = a + b; 129 | return c; 130 | } 131 | // transition 关键字,定义一次状态转移操作,定义名字为main2。输入参数既可以从 inputs/hello_world.in 里读取,也可以在运行时从命令行里传入。 132 | // 运行方式1 leo run main2 133 | // 运行方式2 leo run main2 4u32 5u32 134 | transition main2(public a: u32, b: u32) -> u32 { 135 | let c: u32 = a * b; 136 | return c; 137 | } 138 | } 139 | ``` 140 | 141 | ### 输入参数文件 hello_world.in 142 | 143 | ```toml 144 | [main] 145 | public a: u32 = 1u32; 146 | b: u32 = 2u32; 147 | 148 | [main2] 149 | public a: u32 = 1u32; 150 | b: u32 = 2u32; 151 | ``` 152 | 153 | 1. main 代表了transition名字为 main 的一次状态转移操作中的输入参数。 154 | - 输入参数a,可见性为public,类型为u32,值为1 155 | - 输入参数b,类型为u32,值为2 156 | 2. main2 代表了transition名字为 main2 的一次状态转移操作中的输入参数。 157 | - 输入参数a,可见性为public,类型为u32,值为1 158 | - 输入参数b,类型为u32,值为2 159 | -------------------------------------------------------------------------------- /infra/zkp/aleo/essay/aleo_sdk_helloworld.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-25 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 相关资料链接 8 | 9 | 1. Aleo SDK https://github.com/AleoHQ/aleo 10 | 2. Aleo SDK主要贡献者entropy1729团队官网 https://www.entropy1729.com/ 11 | 3. Aleo SDK主要贡献者entropy1729团队GIthub https://github.com/Entropy1729 12 | 4. 在线Aleo钱包生成工具 https://aleohq.github.io/aleo/ 13 | 5. Aleo SDK基本概念 https://www.entropy1729.com/aleo-introduction 14 | 6. Aleo SDK基本语法 https://www.entropy1729.com/aleo-development-starter-pack/ 15 | 16 | ## Aleo项目的组成 17 | 18 | - Aleo 是第一个保护隐私的、可编程自定义隐私智能合约程序、可以链下执行隐私智能合约程序计算的区块链项目。 19 | - SnarkVM 是隐私智能合约程序的执行环境。功能类似于以太坊虚拟机。 20 | - SnarkOS 是隐私智能合约程序的去中心化操作系统。功能类似于以太坊公链。 21 | - Aleo SDK 是一个开发者框架,使零知识应用的开发变得更简单。开发者通过 Aleo SDK 可以快速地创建一个新账户,制作一笔交易,广播交易。 22 | - Aleo Leo 是隐私智能合约程序的高级编程语言,集成了Aleo SDK。 23 | 24 | ## Aleo SDK 安装 25 | 26 | - 通过宝箱仓库安装 27 | 28 | ```bash 29 | # 官方代码在快速迭代中,更加推荐通过源码进行安装 30 | cargo install aleo 31 | ``` 32 | 33 | - 通过编译源码安装 34 | 35 | ```bash 36 | # 下载源码 37 | git clone https://github.com/AleoHQ/aleo.git 38 | # 进入源码目录 39 | cd aleo 40 | # 安装 aleo sdk 程序 # rust安装教程 https://www.rust-lang.org/tools/install 41 | cargo install --path . 42 | # 查看是否安装成功 43 | aleo -h 44 | ``` 45 | 46 | ## Aleo SDK 指令 47 | 48 | ```bash 49 | # 创建一个包 50 | aleo new 包名字 51 | # 自动在${包名字}文件夹下生成两个文件 52 | # main.aleo 代码文件 53 | # program.json 程序配置文件 54 | 55 | # 生成一个钱包账户 56 | aleo account new 57 | # Private Key APrivateKey1zkpDStSQfu6maFgSro5ePXax8xS4MmBj7qA98FBKR8xm1ZU 58 | # View Key AViewKey1reh7CfNpCyo77UXKx46kjLL7KAPntSDVA2BNjBPwt7of 59 | # Address aleo1zjnre3esly55gkeqlet5xvklvwqntfpcxkdac5l8wk0sdyp35ygq7ulxk4 60 | 61 | # 编译程序生成证明 62 | aleo build 63 | # build 后生成的文件 64 | # 1. AVM虚拟机运行的字节码文件 mian.avm 65 | # 2. 每一个函数都会生成一个证明者文件 函数名.prover 66 | # 3. 每一个函数都会生成一个验证者文件 函数名.verifier 67 | 68 | # 远程编译程序生成证明 # 具体如何填写${ENDPOINT},目前还未知 69 | aleo build --endpoint ${ENDPOINT} 70 | 71 | # 运行程序 72 | aleo run ${FUNCTION} ${INPUTS} 73 | 74 | # 本地运行一个开发节点,并且部署程序 75 | aleo node start 76 | # 本地运行一个开发节点,不部署程序 77 | aleo node start --nodeploy 78 | 79 | # 清除build结果 80 | aleo clean 81 | ``` 82 | 83 | ## Aleo SDK 的Hello World程序 84 | 85 | - 编写一个函数,从外部输入两个数字,然后进行相加,最后输出结果。 86 | ```bash 87 | aleo new aleo_hello 88 | cd aleo_hello 89 | vim main.aleo # 输入下面的代码片段 90 | aleo run add_fun 2021u32 1u32 # 执行add_fun相加函数,传入2021和1两个数字 91 | aleo node start # 本地运行一个开发节点,并且部署运行程序 92 | ``` 93 | - 代码片段 94 | ```rs 95 | program aleo_hello.aleo; 96 | 97 | // 运行方式 aleo run add_fun 2021u32 1u32 98 | function add_fun: // 通过 function 关键字定义一个函数 99 | input r0 as u32.public; // 定义一个输入参数r0,类型为u32,可见性为public 100 | input r1 as u32.private; 101 | add r0 r1 into r2; // 调用sdk的函数add 102 | output r2 as u32.private; // 定义一个输出参数r2,类型为u32,可见性为private 103 | ``` 104 | 105 | ## Aleo SDK 本地开发节点API 106 | 107 | ```bash 108 | # 查看最新的块高 109 | curl http://localhost:4180/testnet3/latest/block/height 110 | 111 | # 通过块高高度查看账本 112 | curl http://localhost:4180/testnet3/block/{height} 113 | 114 | # 查看最后一个块高的哈希 115 | curl http://localhost:4180/testnet3/latest/block/hash 116 | 117 | # 通过ViewKey查看records 118 | # curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"ViewKey"' 119 | curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 120 | curl --location --request GET 'localhost:4180/testnet3/records/all' -H 'Content-Type: application/json' -d '"AViewKey1eZqsm6igutMTUbnwWw8vPQG5ceJruyYQs8XwTmNQdMJf"' | jq 121 | 122 | # This endpoint retrieves only the spent records belonging to a given ViewKey 123 | curl --location --request GET 'localhost:4180/testnet3/records/spent' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 124 | 125 | # This endpoint retrieves only the unspent records belonging to a given ViewKey. 126 | curl --location --request GET 'localhost:4180/testnet3/records/unspent' -H 'Content-Type: application/json' -d '"AViewKey1hU73JxupzRh7uEnynsXgUQL3neSJcJZ2dMBkCPh97zoZ"' | jq 127 | ``` 128 | -------------------------------------------------------------------------------- /infra/zkp/aleo/essay/private_smart_contract.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-09-19 3 | --- 4 | 5 | [TOC] 6 | 7 | - 我们,都是站在巨人的肩膀上,进行不断地探索、创新,完善这个人类生态。 8 | - 在此,感谢前人们对去中心化技术的不断探索。 9 | 10 | ### 走进误区 11 | 12 | - 当今,区块链世界的许多子民认为,现有的 Layer-1 协议进行一定的调整后,就立即可以支持身份、数字现金和机器学习等用例的隐私智能合约。但事实真是这样吗? 13 | 14 | ### 大哥大时代 点对点电子现金系统 15 | 16 | 1. 在2008年以前,就有无数的先辈们在探索电子现金系统,但迟迟未有颠覆性的作品,直到2008年11月1日,中本聪首次提出比特币点对点电子现金系统的概念,并于2009年1月3日正式发布主网。 17 | 2. 随着时间的流逝,比特币系统在不断地完善,最后向世人证明了自己的价值。 18 | 19 | ### 智能机时代 去中心化状态机 20 | 21 | 1. 比特币网络的不可编程性,导致比特币只能作为一种货币,而不能作为去中心化应用的平台。 22 | 2. 区块链的世界,不会缺乏奇思妙想者,创新者,开拓者,他们引领着区块链生态走向更好的明天。 23 | 3. 2014年初,维塔利克·布特林(V神)基于比特币的基础上提出了智能合约的概念,构建分布式状态机,以太坊网络。 24 | 4. V神从0到1设计了以太坊网络,并且和他的团队进行了不断的讨论与功能实现,于2015年7月推出以太坊主网。 25 | 5. 第一版的以太坊主网,是非常简陋的,只有专业人士才会使用,并且由于大环境的经济问题,导致以太坊团队遇到了重重资金困难,差点无法继续运行下去,最终在中国得到了肖风博士的资助和资源上的帮助,以太坊社区得到了更好的发展。 26 | 6. 由于前任的努力,今天,我们看到了以太坊的繁荣。 27 | 28 | ### 月球与地心引力 29 | 30 | 1. 以太坊网络的智能合约是完全透明的,没有隐私可言。 31 | 2. 没有隐私,很多需要隐私功能的应用就无法被很好的构建,我们的链上资产也丧失了隐私权,沦为黑客的攻击对象。 32 | 3. 为了以最小信任度实现可扩展的隐私智能合约系统,工程师们需要从无到有地开始进行系统的设计。 33 | 4. 通过零知识证明可以实现在不透露秘密的情况证明我们的确知道这个秘密,但只靠零知识证明知识是无法实现一个隐私智能合约系统的。 34 | 5. 如果想实现,首先,你需要有一个极快的证明系统,允许进行可委托的零知识证明构建并且无法用户数据无法被盗取。 35 | 6. 你还需要一个可靠的的零知识证明编译器,用于将任意的计算转为零知识证明。 36 | 7. 你还需要有一个允许链下执行的交易系统,可以并行访问共享状态,以及进行交易的聚合。 37 | 8. 你还需要引导激励零知识证明者的参与和零知识证明硬件的开发。 38 | 39 | ### 火箭 40 | 41 | 1. 对于隐私智能合约和高吞吐量可验证计算,有如此之多的已经被部署的项目,声称找到了有效的解决方案,让我们认为这个问题已经被微不足道地解决了。 42 | 2. 不幸的是,当我们深入研究那个声称解决了这些问题的项目时,会愕然发现,它并没有真正地解决了隐私智能合约和高吞吐量可验证计算问题。 43 | 3. 但,有一个项目,它可以解决这些问题,Aleo。 44 | 4. Aleo是第一个同时实现了安全、高并发,可构建隐私智能合约的区块链项目。 45 | 5. 我们相信Aleo的到来,让区块链生态更加繁荣。 46 | 47 | ### Aleo 48 | 49 | - 进入Aleo社区,一探究竟。 Discord社区 https://discord.gg/7JTYBxc3Jf 50 | - 我的Aleo博客 https://blog.csdn.net/IMPlove 51 | -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_1.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_2.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_3.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_4.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_5.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_6.png -------------------------------------------------------------------------------- /infra/zkp/aleo/picture/aleo_dapp_deploy_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/aleo/picture/aleo_dapp_deploy_7.png -------------------------------------------------------------------------------- /infra/zkp/privacy.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/privacy.jpeg -------------------------------------------------------------------------------- /infra/zkp/privacy.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2023-02-26 3 | --- 4 | 5 | [TOC] 6 | 7 | - 参考 8 | - https://m.thepaper.cn/baijiahao_16778012 9 | 10 | 1. TEE 是一种具有运算和储存功能,能提供安全性和完整性保护的独立处理环境。其基本思想是:在硬件中为敏感数据单独分配一块隔离的内存,所有敏感数据的计算均在这块内存中进行,并且除了经过授权的接口外,硬件中的其他部分不能访问这块隔离的内存中的信息。以此来实现敏感数据的隐私计算。 11 | 2. 富执行环境 (Rich Execution Environment,REE) 指的是操作系统运行时的环境中,可以运行如 Android、IOS 等通用的 OS(Opreating System)。REE 是一个容易受到攻击的开放环境,如敏感数据的窃取、移动支付盗用等等。而 TEE 是中央处理器上的一个安全区域,能够保证敏感数据在隔离和可信的环境内被处理,从而免受来自 REE 中的软件攻击。此外,与其他的安全执行环境相比,TEE 可以端到端地保护 TA(Trusted Application)的完整性和机密性,能够提供更强的处理能力和更大的内存空间。在下图这一典型的可信执行环境架构中,TEE 内部为 REE 中的软件提供了接口,使得 REE 中的软件可以调用 TEE 对数据进行处理,但不会泄露敏感数据。 12 | -------------------------------------------------------------------------------- /infra/zkp/staknet/cairo-lang.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-05-13 3 | --- 4 | 5 | [TOC] 6 | -------------------------------------------------------------------------------- /infra/zkp/zkp-LagrangeInterpolation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/zkp-LagrangeInterpolation.png -------------------------------------------------------------------------------- /infra/zkp/zkp-protocol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/infra/zkp/zkp-protocol.png -------------------------------------------------------------------------------- /math/math_python.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 数学 3 | created_date: 2022-08-28 4 | --- 5 | 6 | [TOC] 7 | 8 | ## Python求数学题 9 | 10 | - C(n,m) 11 | - C上标是m下标是n,表示从n个不同元素中任取m个元素的不同取法的种数,称为组合数。 12 | - C上标是m下标是n,等于 (n!) / (m!\*(n-m)!) 13 | 14 | ```python 15 | math.factorial(n) / ( math.factorial(m) * math.factorial(n-m) ) 16 | ``` 17 | 18 | - 使用python求阶乘 19 | 20 | ```python 21 | import math 22 | number=3 23 | math.factorial(number) 24 | ``` 25 | 26 | - 使用python求根 27 | 28 | ```python 29 | import cmath 30 | cmath.sqrt(num) 31 | 32 | 33 | # number的n次方根 34 | numbe.0 ** (1 / n.0) 35 | # 8的3次分根 36 | 8.0 ** (1 / 3.0) 37 | ``` 38 | 39 | ```python 40 | # 求概率 41 | import math 42 | total=7 43 | hitTotal=1 44 | hitProbability=0.1 45 | combination=math.factorial(total)/(math.factorial(hitTotal)*math.factorial(total-hitTotal)) 46 | combination * pow(hitProbability,hitTotal) * pow((1-hitProbability),(total-hitTotal)) 47 | ``` 48 | -------------------------------------------------------------------------------- /math/number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/garysdevil/BlockchainNote/e1d3d26b0438801dab0f70142fb4399ac02e4855/math/number.png -------------------------------------------------------------------------------- /opsnode/10 Cardano-ada.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - git仓库 8 | https://github.com/input-output-hk/jormungandr 9 | - 相关资料 10 | https://iohk.zendesk.com/hc/en-us/articles/360039342934-How-to-install-Jormungandr-Networking-Linux- 11 | https://input-output-hk.github.io/jormungandr/introduction.html 12 | - 技术问题:https://forum.cardano.org/c/developers/29/l/top 13 | - 本文档的安装部署未按照以上链接操作,主要基于尧神的文档 14 | - 团队:IOHK 15 | - 链: Cardano 16 | - 代币:ADA 17 | - 代码:nodejs 18 | 19 | #### 安装部署 20 | 21 | - docker 22 | - ubuntu16.04+ 23 | - nodejs v8 24 | - 4 Core CPU or above 25 | - 16G Memory or above 26 | - 200G Storage or above 27 | - 10Mbit/s bandwidth or above 28 | - NTP service on 29 | 30 | Setup adalite Guide 31 | 32 | ##### 安装全节点 33 | 34 | - 安装方式 docker-compose 35 | - 测试环境 36 | - 先安装docker和docker-compose 37 | - 参考文档: https://gist.github.com/garyssdevil/4697c90aff1a93341c4d8085e421dc3e 38 | 39 | ```bash 40 | # 1. 创建系统用户,此用户的UID必须是999. 41 | useradd -r -m cardano 42 | # 2. 将此用户添加进docker组里 43 | usermod -aG docker cardano 44 | # 3. 以ADA用户身份进入/dada/文件夹 45 | chown cardano.cardano /data && su - cardano 46 | cd /data/ 47 | # 4. 下载安装脚本-lightweight wallet 48 | git clone https://github.com/vacuumlabs/adalite-backend-service.git 49 | 50 | # 5. 配置,修改docker的数据目录路径 51 | cd adalite-backend-service/docker/ 52 | mv env.example .env.ada 53 | vim .env.ada 54 | # 修改数据目录为 /data/docker_data 55 | # ICARUS_IMPORTER_HOST_PORT=8200 56 | 57 | # 修改容器配置,使其随服务器自行启动。 58 | # restart: always 59 | 60 | # 6. 启动 61 | ./manage_containers.sh ada start-normal 62 | chown -R cardano.cardano /data/docker_data 63 | ./manage_containers.sh ada start-normal 64 | ``` 65 | 66 | ##### 区块链游览器 /基于尧神的文档 67 | 68 | ```bash 69 | git clone https://github.com/input-output-hk/cardano-sl.git 70 | cd cardano-sl 71 | git checkout 3.2.0 72 | 73 | # 创建nixbld用户组以及用户,安装Nix包管理工具时需要用到 74 | groupadd nixbld 75 | for n in $(seq 1 10); do useradd -c "Nix build user $n" -d /var/empty -g nixbld -G nixbld -M -N -r -s "$(which nologin)" nixbld$n; done 76 | curl https://nixos.org/nix/install | sh 77 | 78 | source ~/.nix-profile/etc/profile.d/nix.sh 79 | 80 | # 编译,4C或16C都是耗时7个小时这样 81 | nix-build -A connectScripts.mainnet.explorer -o connect-explorer-to-mainnet 82 | ##start 以root用户权限启动 83 | mkdir -p /data/cardano-sl_data/logs 84 | cd /data/cardano-sl_data 85 | nohup /data/cardano-sl/connect-explorer-to-mainnet > ./logs/explorer`date '+%Y%m%d%H%M%S'`.log 2>&1 & 86 | 87 | # api文档 https://cardanodocs.com/technical/explorer/api/ 88 | 89 | ``` 90 | 91 | ##### 运维须知 92 | 93 | - 默认端口 94 | 95 | 1. 数据库:5432 96 | 2. ada-importer: 8200映射至8202 97 | 3. ada-service: 8080 98 | 4. rpc:8100 (需要安装区块链游览器) 99 | 100 | - 区块链游览器,主网 101 | https://adascan.net/ 102 | https://cardanoexplorer.com/ 103 | 104 | - 查看官网块高 105 | https://cardanoexplorer.com/api/blocks/pages 106 | 107 | - API查看块高 108 | curl 127.0.0.1:8100/api/blocks/pages | grep cbeBlkHeight 109 | -------------------------------------------------------------------------------- /opsnode/11 Nervos-CKB.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - git仓库 8 | https://github.com/nervosnetwork/ckb 9 | - 代币:CKB 10 | - 链:Nervos 11 | 12 | ### 部署Nevos 13 | 14 | - 使用二进制进行安装部署 15 | 16 | ```bash 17 | useradd -r -m nervos && chown nervos.nervos /data && su - nervos && cd /data/ 18 | # 1. 下载资源 19 | wget https://github.com/nervosnetwork/ckb/releases/download/v0.26.0/ckb_v0.26.0_x86_64-unknown-linux-gnu.tar.gz 20 | # 2. 21 | tar xzvf ckb_v0.26.0_x86_64-unknown-linux-gnu.tar.gz 22 | mv ckb_v0.26.0_x86_64-unknown-linux-gnu ckb 23 | cd ckb 24 | 25 | # 3. 获取测试网定制化的规格配置 26 | wget https://gist.github.com/doitian/573513c345165c0fe4f3504ebc1c8f9f/raw/3032bed68550e0a50e91df2c706481e80b579c70/aggron.toml 27 | # 初始化测试网A 28 | ./ckb init --import-spec ./aggron.toml --chain testnet 29 | # 初始化主网B 30 | ./ckb init --chain mainnet --force 31 | # ./ckb init --list-chains 查看所有的环境配置 32 | 33 | # 5. 启动进程 34 | nohup /data/ckb/ckb run -C /data/ckb/ > /data/debug.log 2>&1 & 35 | ``` 36 | 37 | ### 运维须知 38 | 39 | - 区块链游览器 https://explorer.nervos.org/ 40 | 41 | - API文档 https://docs.nervos.org/api/rpc.html 42 | 43 | - 默认端口 44 | 45 | 1. rpc: 8114 46 | 2. p2p: 8115 47 | 48 | - 常用CLI 49 | 50 | 1. 查看节点信息 ./ckb-cli rpc get_blockchain_info 51 | 2. 查看块高 ./ckb-cli rpc get_tip_block_number 52 | 53 | - API查看块高 54 | 55 | ```bash 56 | echo '{ 57 | "id": 2, 58 | "jsonrpc": "2.0", 59 | "method": "get_tip_block_number", 60 | "params": [] 61 | }' \ 62 | | tr -d '\n' \ 63 | | curl -H 'content-type: application/json' -d @- \ 64 | http://localhost:8114 65 | 66 | printf %d 16进制 67 | ``` 68 | -------------------------------------------------------------------------------- /opsnode/12 XLM-stellar.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | Git 8 | https://github.com/stellar/stellar-core 9 | https://github.com/stellar/docker-stellar-core-horizon 10 | 11 | - 链: steller 12 | - 代币: XLM 13 | 14 | #### 安装部署 15 | 16 | Requirement 17 | Ubuntu 16.04 18 | docker 17.03.2-ce 19 | Ubuntu 16.04+ 20 | docker 17.03.2-ce+ 21 | 2 Core CPU or above 22 | 8G Memory or above 23 | 300G Storage or above 24 | 10Mbit/s bandwidth or above 25 | NTP service on 26 | 27 | - 通过容器进行部署 28 | 29 | ```bash 30 | # mainnet: 31 | docker run --rm -it -v "/data/stellar:/opt/stellar" -p "8000:8000" --name stellar stellar/quickstart --pubnet 32 | # 退出容器,配置文件中,export PER_HOUR_RATE_LIMIT改为72000000 33 | vi /data/stellar/horizon/etc/horizon.env 34 | # 后台启动 35 | docker run -d -v "/data/stellar:/opt/stellar" -p "8000:8000" --name stellar stellar/quickstart --pubnet 36 | 37 | # testnet: 38 | docker run -it -p "8000:8000" -v "/data/stellar:/opt/stellar" --name stellar stellar/quickstart --testnet 39 | # 设置完数据库的密码后,退出,再启动容器。 40 | docker start 容器id 41 | ``` 42 | 43 | ```bash 44 | nginx 连接节点的配置示范。 45 | server { 46 | listen 80; 47 | server_name xml-testnet.cybex.io; 48 | location / { 49 | proxy_http_version 1.1; 50 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 51 | proxy_set_header Host $host; 52 | proxy_pass http://127.0.0.1:8000; 53 | } 54 | access_log /var/log/nginx/xml-testnet_access.log ; 55 | error_log /var/log/nginx/xml-testnet_error.log ; 56 | } 57 | ``` 58 | 59 | #### 运维须知 60 | 61 | - 默认端口 62 | rpc和p2p: 8000 63 | 64 | - 指令查看块高(容器内操作) 65 | /usr/local/bin/stellar-core offline-info | grep num 66 | 67 | - API查看块高 68 | curl 127.0.0.1:8000 | grep core_latest_ledger 69 | -------------------------------------------------------------------------------- /opsnode/13 TOMO.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | git仓库 8 | https://github.com/tomochain/tomochain 9 | 10 | - 部署文档 11 | https://docs.tomochain.com/masternode/docker/ 12 | 13 | #### 准备 14 | 15 | 2 Core CPU or above 16 | 8G Memory or above 17 | 300G Storage or above 18 | 10Mbit/s bandwidth or above 19 | NTP service on 20 | docker 19+ 21 | 22 | ### 部署 Vechain 23 | 24 | - 部署方式:dcoker 25 | 26 | ```bash 主网 27 | # 下载主网的块高镜像 28 | mkdir -p /data/tomochain/chaindata 29 | wget https://chaindata.tomochain.com/20190813.tar 30 | tar -xvf 20190813.tar -C /data/tomochain/chaindata/tomo/ 31 | 32 | # 配置启动 33 | MASTERNODE_NAME='gary_tomo_maintest01' # 自定义,且全网唯一 34 | BOOTNODES="enode://97f0ca95a653e3c44d5df2674e19e9324ea4bf4d47a46b1d8560f3ed4ea328f725acec3fcfcb37eb11706cf07da669e9688b091f1543f89b2425700a68bc8876@104.248.98.78:30301,enode://b72927f349f3a27b789d0ca615ffe3526f361665b496c80e7cc19dace78bd94785fdadc270054ab727dbb172d9e3113694600dd31b2558dd77ad85a869032dea@188.166.207.189:30301,enode://c8f2f0643527d4efffb8cb10ef9b6da4310c5ac9f2e988a7f85363e81d42f1793f64a9aa127dbaff56b1e8011f90fe9ff57fa02a36f73220da5ff81d8b8df351@104.248.98.60:30301" 35 | STATS_WS_SECRET='getty-site-pablo-auger-room-sos-blair-shin-whiz-delhi' 36 | 37 | CONTAINER_NAME='gary_tomo_maintest01' # 自定义 38 | docker run -d --name \ 39 | -e IDENTITY=$MASTERNODE_NAME \ 40 | -e BOOTNODES=$BOOTNODES \ 41 | -e NETSTATS_HOST=stats.tomochain.com \ 42 | -e NETSTATS_PORT=443 \ 43 | -e WS_SECRET=$STATS_WS_SECRET \ 44 | -e NETWORK_ID=88 \ 45 | -p 8545:8545 \ 46 | -p 8546:8546 \ 47 | -p 30303:30303 \ 48 | -p 30303:30303/udp \ 49 | -v /data/tomochain/chaindata:/tomochain/data \ 50 | tomochain/node:stable 51 | ``` 52 | 53 | ```bash 测试网 54 | MASTERNODE_NAME='gary_tomo_testnet' # 自定义,全网唯一 55 | STATS_WS_SECRET='anna-coal-flee-carrie-zip-hhhh-tarry-laue-felon-rhine' 56 | BOOTNODES='enode://4d3c2cc0ce7135c1778c6f1cfda623ab44b4b6db55289543d48ecfde7d7111fd420c42174a9f2fea511a04cf6eac4ec69b4456bfaaae0e5bd236107d3172b013@52.221.28.223:30301,enode://ce1191bf9a634e7939676d136816ad84941b079c03d6a96e64cca35852363012169055c6879c644e821dc236a01d0499a1b7ff39e9518dbc00da87c7f1898604@13.251.101.216:30301,enode://46dba3a8721c589bede3c134d755eb1a38ae7c5a4c69249b8317c55adc8d46a369f98b06514ecec4b4ff150712085176818d18f59a9e6311a52dbe68cff5b2ae@13.250.94.232:30301' 57 | 58 | CONTAINER_NAME='gary_tomo_testnet' # 自定义 59 | docker run -d --name ${CONTAINER_NAME} \ 60 | -e IDENTITY=$MASTERNODE_NAME \ 61 | -e BOOTNODES=$BOOTNODES \ 62 | -e NETSTATS_HOST=wss://stats.testnet.tomochain.com \ 63 | -e NETSTATS_PORT=443 \ 64 | -e WS_SECRET=$STATS_WS_SECRET \ 65 | -e NETWORK_ID=89 \ 66 | -p 8545:8545 \ 67 | -p 8546:8546 \ 68 | -p 30303:30303 \ 69 | -p 30303:30303/udp \ 70 | -v /data/tomochain/chaindata:/tomochain/data \ 71 | tomochain/node:testnet 72 | 73 | 或者(不推荐) 74 | https://docs.tomochain.com/masternode/tmn/ 75 | tmn start --name wx-testnet-node --net testnet --pkey 2abe0b258d33d635b97579b0940369e42843688750919671a06d4f2f3591f111 76 | ``` 77 | 78 | ### 运维须知 79 | 80 | 1. 默认端口: 81 | p2p: 30303 82 | rpc: 8545 83 | ws: 8546 84 | 85 | 2. 查块日志 86 | docker logs -f -t --tail 100 容器ID 87 | 88 | 3. API查看块高 89 | printf %d `curl -sS -H "Content-Type:application/json" 127.0.0.1:8545 -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' | grep -Po 'result[" :]+\K[^"]+'` 90 | 91 | - 官方IP 92 | https://rpc.tomochain.com/blockNumber 93 | 94 | 4. 95 | 96 | curl --request POST --url 127.0.0.1:8545 --header 'content-type: application/json' --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' 97 | 98 | 4. 区块链浏览器 99 | - 主网 https://scan.tomochain.com/blocks 100 | - 测试网 https://stats.testnet.tomochain.com/ 101 | 102 | ### 升级步骤: 103 | 104 | ``` 105 | 1. 给原来的镜像打tag 106 | 2. nmt 执行相关命令 107 | 3. 修改docker内的hostconfig.json文件,添加下面的信息 108 | ,"8545/tcp":[{"HostIp":"","HostPort":"8545"}],"8546/tcp":[{"HostIp":"","HostPort":"8546"}] 109 | 4.关闭容器,重启docker,启动容器。 110 | 5.查看日志,上区块链游览器查看全节点的恢复情况。 111 | 升级后版本:1.5.4 112 | ``` 113 | -------------------------------------------------------------------------------- /opsnode/14 Polkadot.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | ### Polkadot部署 8 | 9 | - 部署准生产网 10 | - 参考 https://wiki.polkadot.network/docs/zh-CN/maintain-sync "快速安装说明 (Linux)" 部分 11 | 12 | 1. 下载启动 13 | curl -sL https://github.com/paritytech/polkadot/releases/download/v0.7.30/polkadot -o polkadot 14 | curl -sL https://github.com/paritytech/polkadot/releases/download/v0.8.14/polkadot 15 | curl -O https://github.com/paritytech/polkadot/releases/download/v0.8.0/polkadot 16 | wget https://github.com/paritytech/polkadot/releases/download/v0.8.22/polkadot 17 | 18 | sudo chmod +x polkadot 19 | 20 | ./polkadot --pruning archive --name "gary_kusama_node01" --chain kusama -d /data/polkadot --rpc-external --ws-external --rpc-cors all 21 | 22 | 启动参数说明: 23 | --pruning archive 运行归档节点,同步所有的区块 24 | --name 指定节点名 25 | -d,--base-path 指定运行目录 26 | --rpc-external 监听所有rpc接口 27 | --rpc-external 监听所有websocket接口 28 | --rpc-cors all 允许远程访问节点需要开启 29 | --rpc-port 指定http rpc端口,默认9933 30 | --ws-port 指定websocket rpc端口,默认9944 31 | --chain 指定要使用的网络,默认为Polkadot CC1网络, kusama是准生产网。 32 | --wasm-execution Compiled 使此节点使用更多的CPU和RAM,同步速度能达到4倍。建议在同步结束后关闭这个参数。 33 | 其他参数说明使用 --help 查看 34 | 35 | 2. 服务化 36 | vi start.sh 37 | 38 | ``` 39 | log=/home/polkadot/logs/kusama`date '+%Y-%m-%d'`.log 40 | /home/polkadot/polkadot --pruning archive --name "gary_kusama_node02" -d /data/polkadot --rpc-external --ws-external --rpc-cors all --chain polkadot >> $log 2>&1 41 | ``` 42 | 43 | vi /etc/systemd/system/polkadot.service 44 | 45 | ```conf 46 | [Unit] 47 | Description=Polkadot 48 | 49 | [Service] 50 | User=polkadot 51 | Group=polkadot 52 | ExecStart=/bin/bash /home/polkadot/start.sh 53 | Restart=always 54 | 55 | [Install] 56 | WantedBy=multi-user.target 57 | ``` 58 | 59 | 3. 安装时遇到的错误 60 | libstdc++.so.6: version \`GLIBCXX3.4.22’ not found 61 | 62 | ```bash 解决办法 63 | # https://blog.csdn.net/u011961856/article/details/79644342?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase 64 | strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX # 查看当前版本的GLIBCXX 65 | apt-get install libstdc++6 # 安装最新的libstdc++6 66 | # 没有安装成功则添加ppa源,再更新安装 67 | sudo add-apt-repository ppa:ubuntu-toolchain-r/test 68 | sudo apt-get update 69 | sudo apt-get upgrade 70 | sudo apt-get dist-upgrade 71 | # 72 | strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX 73 | ``` 74 | 75 | ### Polkadot运维 76 | 77 | 0. 默认端口 78 | 79 | - RPC 9933 80 | - WS 9944 81 | - P2P 30333 82 | 83 | 1. 区块链浏览器 84 | https://telemetry.polkadot.io/#list/Kusama 85 | 86 | 2. RPC文档: 87 | https://wiki.polkadot.network/docs/en/build-node-interaction#polkadot-rpc 88 | 89 | 3. API获取本地块高: 90 | echo $((`curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock"}' http://localhost:9933/ | jq .result.block.header.number | tr \" " "`)) 91 | 92 | ### subscan-essentials 部署 93 | 94 | https://github.com/garysHub/subscan-essentials.git 95 | 96 | 1. vi docker-compose-full.yml 97 | 98 | 2. docker-compose build 99 | 100 | 3. docker-compose -f docker-compose-full.yml up -d mysql 101 | 102 | 4. docker-compose -f docker-compose-full.yml up -d 103 | 104 | 5. 获取块高同步信息 105 | 进入redis,get "kusama:FillAlreadyBlockNum" 106 | 107 | 6. 从特定块高开始同步,需要先关闭subscan-daemon和subscan-api,修改完值后再启动。 108 | 进入redis, set "kusama:FillAlreadyBlockNum" 数值 109 | 110 | ```Dockerfile docker-compose-full.yml 111 | version: "2.4" 112 | 113 | services: 114 | redis: 115 | image: redis:3.2.11 116 | hostname: redis 117 | restart: always 118 | 119 | mysql: 120 | image: mysql:latest 121 | hostname: mysql 122 | volumes: 123 | - 'db-data:/var/lib/mysql' 124 | ports: 125 | - '33061:3306' 126 | environment: 127 | - MYSQL_ROOT_PASSWORD=root 128 | - MYSQL_DATABASE=subscan 129 | restart: always 130 | subscan-api: &app_base 131 | image: scan/backend 132 | init: true 133 | build: . 134 | environment: 135 | MYSQL_HOST: mysql 136 | MYSQL_PASS: 'root' 137 | MYSQL_DB: 'subscan' 138 | REDIS_ADDR: redis:6379 139 | CHAIN_WS_ENDPOINT: 'ws://${IP}:9944' 140 | NETWORK_NODE: 'polkadot' 141 | WEB_HOST: 'http://subscan-api:4399' 142 | ports: 143 | - '3000:4399' 144 | # networks: 145 | # - app_net 146 | command: ["/subscan/cmd/subscan","--conf","../configs"] 147 | depends_on: 148 | - redis 149 | - mysql 150 | restart: always 151 | subscan-daemon: 152 | <<: *app_base 153 | image: scan/backend 154 | ports: [] 155 | command: ["python","run.py","substrate"] 156 | depends_on: 157 | - redis 158 | - mysql 159 | restart: always 160 | volumes: 161 | db-data: 162 | ``` 163 | -------------------------------------------------------------------------------- /opsnode/15 platon.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | 文档 8 | https://platonnetwork.github.io/Docs/#/zh-cn/Network/[Chinese-Simplified]-%E8%BF%9E%E6%8E%A5%E5%85%AC%E6%9C%89%E7%BD%91%E7%BB%9C 9 | 10 | 区块链游览器 11 | https://platscan.test.platon.network/ 12 | 13 | ### 安装部署 14 | 15 | - 安装文档 16 | https://devdocs.platon.network/docs/zh-CN/Install_Node/ 17 | 18 | - 节点秘钥生成文档: 19 | https://platonnetwork.github.io/Docs/#/zh-cn/Node/\_[Chinese-Simplified]-%E9%92%B1%E5%8C%85%E6%96%87%E4%BB%B6%E4%B8%8E%E8%8A%82%E7%82%B9%E5%AF%86%E9%92%A5?id=%e8%8a%82%e7%82%b9%e5%af%86%e9%92%a5 20 | 21 | - 硬件要求 22 | Ubuntu 18.04.1 及以上 23 | cpu: 4核 24 | 内存:8G 25 | 磁盘:> 100G 26 | 27 | 1. 安装并运行NTP服务 28 | apt-get update 29 | apt-get install -y gnupg2 curl software-properties-common ntp 30 | systemctl enable ntp && sudo systemctl start ntp 31 | 32 | 2. 安装PlatON 33 | add-apt-repository ppa:ppatwo/platon 34 | apt-get update 35 | apt-get install platon0.12.1 36 | 37 | 执行完上述命令后,platon和keytool二进制就已经成功安装到您系统上的/usr/bin目录里 38 | 39 | 3. 查看版本 40 | platon version 41 | 42 | 4. 创建节点密钥 43 | 44 | 1. 创建数据目录 45 | mkdir /opt/platon/data 46 | 2. 生成节点密钥文件 47 | export datadir=/opt/platon/data 48 | 3. 生成节点公私钥: 49 | keytool genkeypair | tee >(grep "PrivateKey" | awk '{print $2}' >$datadir/nodekey) >(grep "PublicKey" | awk '{print $3}' >$datadir/nodeid) 50 | 4. 生成节点BLS公私钥: 51 | keytool genblskeypair | tee >(grep "PrivateKey" | awk '{print $2}' >$datadir/blskey) >(grep "PublicKey" | awk '{print $3}' >$datadir/blspub) 52 | 53 | 5. 关于网络的说明 54 | 55 | PlatON目前有2个公有网络,一个是还未正式上线的、独立运行的 PlatON 主网络,ChainID为 100。 56 | 另外一个是已经于北京时间 2020-2-20日 正式上线的用来对开发者开放的测试网络贝莱世界,ChainID为 102。 57 | 主网目前还未正式上线。 58 | 59 | ``` 60 | 在加入PlatON公有网络前请确保服务器本地具备以下条件 : 61 | 1. 已经按照PlatON安装指南安装好PlatON环境或编译好PlatON可执行文件’platon’和’keytool’。 62 | 2. 已经按照节点密钥章节在’~/platon-node/data’目录下生成了节点私钥和节点BLS私钥。 63 | ``` 64 | 65 | 7. 启动归档节点 66 | - 执行以下命令即可启动验证节点加入贝莱世界: 67 | cd /data/platon/ 68 | nohup platon --identity platon --datadir ./data --port 16789 --db.nogc --rpcvhosts * --testnet --rpcport 6789 --rpcapi "db,platon,net,web3,admin,personal" --rpc --nodekey ./data/nodekey --cbft.blskey ./data/blskey --verbosity 3 --rpcaddr 0.0.0.0 --syncmode "full" > ./data/platon.log 2>&1 & 69 | 70 | 参数说明: 71 | --identity 指定网络名称 72 | --datadir 指定 data 目录路径 73 | --rpcaddr 指定 rpc 服务器地址 74 | --rpcport 指定 rpc 协议通信端口 75 | --rpcapi 指定节点开放的 rpcapi 名称 76 | --rpc 指定 http-rpc 通讯方式 77 | --nodekey 指定节点私钥文件 78 | --cbft.blskey 指定节点 bls 私钥文件 79 | --testnet 指定连接到测试网络,不指定默认运行主网络 80 | --syncmode fast:快速同步模式,full:全同步模式 81 | --db.nogc 开启归档模式 82 | 83 | ### 运维 84 | 85 | 1. 默认端口 86 | p2p: 16789 87 | rpc: 6789 88 | 2. 指令操作 89 | 90 | - 通过http方式进入platon控制台: 91 | platon attach http://localhost:6789 92 | - 查看节点的peers: 93 | admin.peers 94 | - 查看当前块高: 95 | platon.blockNumber 96 | - 通过hash获取交易信息 97 | platon.getTransactionReceipt(’hash‘) 98 | - 本地节点的交易池 99 | platon.pendingTransactions 100 | - platon attach http://localhost:6789 -exec platon.blockNumber 101 | 102 | 3. API 操作 103 | 104 | 4. 查看钱包地址交易信息 105 | 106 | - 从区块链游览器 107 | https://platscan.test.platon.network/address-detail?address=0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2 108 | - 从本地节点 109 | http://${IP}:3000/platontxs?and=(contract_to.eq.,or(txfrom.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2,txto.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2))&order=time.desc&limit=10&offset=0 110 | 111 | http://${IP}:3000/platontxs?and=(contract_to.eq.,or(txfrom.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2,txto.eq.0x1c2d7dbd54b803121d829cfe00893f1a6352e5a2))&order=time.desc&limit=10&offset=0 112 | 113 | ### 索引库 114 | 115 | https://git.i.garys.top/project/src/platon-indexer 116 | 117 | pip uninstall web3 118 | pip install web3==4.9.0 119 | 120 | pip install client_sdk_python 121 | -------------------------------------------------------------------------------- /opsnode/3 Ripple-XRP.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - 5M带宽跑,块高完成同步失败;10M带宽跑,失败。 8 | - 使用apt的包进行安装 9 | - rippled version 1.3.1 10 | 11 | ### 部署Ripple XRP 12 | 13 | ```shell 14 | apt -y update 15 | 16 | apt -y install apt-transport-https ca-certificates wget gnupg 17 | 18 | wget -q -O - "https://repos.ripple.com/repos/api/gpg/key/public" | apt-key add - 19 | 20 | apt-key finger 21 | 22 | echo "deb https://repos.ripple.com/repos/rippled-deb bionic stable" | tee -a /etc/apt/sources.list.d/ripple.list 23 | 24 | apt -y update 25 | 26 | apt -y install rippled 27 | 28 | systemctl status rippled.service 29 | # 修改以下文件,配置节点信息。例如 块高存储位置,日志位置等等。 30 | vim /opt/ripple/etc/rippled.cfg 31 | # 如果从0开始同步快高则要添加如下配置 32 | [ips_fixed] 33 | s2.ripple.com 51235 34 | # 修改以下文件,决定此节点是mainnet还是testnet 35 | vim /opt/ripple/etc/validators.txt 36 | # testnet 37 | [validator_list_sites] https://vl.altnet.rippletest.net 38 | [validator_list_keys] ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860 39 | # mainnet 40 | [validator_list_sites] https://vl.ripple.com 41 | [validator_list_keys] ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 42 | ``` 43 | 44 | ### 运维须知 45 | 46 | 1. 默认端口\ 47 | p2p:51235\ 48 | RPC:5005\ 49 | ws: 6006 50 | 2. 查看连接上的节点\ 51 | /opt/ripple/bin/rippled peers 52 | 3. 手动连接一个节点\ 53 | connect \[\] 54 | 4. 指令查看块高\ 55 | /opt/ripple/bin/rippled ledger | grep seqNum 56 | 5. 获取本地节点的信息\ 57 | /opt/ripple/bin/rippled server_info 58 | -------------------------------------------------------------------------------- /opsnode/4-1 BTC.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | ### 部署BTC 8 | 9 | - 使用node进行安装部署 10 | 11 | ```shell 12 | apt-get install libzmq3-dev build-essential 13 | 14 | useradd -m -r bitcoin 15 | 16 | su - bitcoin 17 | 18 | curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash 19 | 20 | nvm install v8 21 | 22 | npm install bitcore -g 23 | 24 | rm 把子模块里的bitcore-lib都删除掉 25 | # 创建一个新的节点,会自动在家目录创建一个${name}文件夹 26 | name=bitnode 27 | path=/data/btcfullnode 28 | bitcore create $name -d $path 29 | cd $path 30 | # 安装insight-api insight-ui模块,使BTC的块高可以直接通过接口进行调用 31 | vim bitcore-node.json 32 | { 33 | "network": "livenet", 34 | "port": 3001, 35 | "services": [ 36 | "bitcoind", 37 | "insight-api", 38 | "insight-ui", 39 | "web" 40 | ], 41 | "servicesConfig": { 42 | "insight-api": { 43 | "disableRateLimiter": true 44 | }, 45 | "bitcoind": { 46 | "spawn": { 47 | "datadir": "./data", 48 | "exec": "/home/bitcore/.nvm/versions/node//lib/node_modules/bitcore/node_modules/bitcore-node/bin/bitcoind" 49 | } 50 | } 51 | } 52 | } 53 | bitcore install insight-api insight-ui 54 | # 创建后台启动脚本 55 | vim startBtc.sh 56 | #! /bin/bash 57 | export PATH=$PATH:/home/bitcoin/.nvm/versions/node/v8.16.2/bin/ 58 | # version=6时设置下面变量,node会报错;version=8时,成功 59 | export NODE_OPTIONS=--max_old_space_size=3145728 60 | cd /home/bitcoin/btcnode 61 | logPath=/data/logs/bitcore_`date +%Y%m%d%H%M%S`.log 62 | bitcored > ${logPath} 2>&1 63 | 64 | # 启动 65 | bash startBtc.sh 66 | ``` 67 | 68 | ### 运维须知 69 | 70 | 1. 默认端口\ 71 | p2p: 8333\ 72 | rpc: 8332 73 | bitcore: 3001\ 74 | ZMQ: 28332 75 | 76 | 2. API获取块高\ 77 | curl http://localhost:3001/insight-api/sync 78 | 79 | 3. 获取相关信息 80 | curl http://localhost:3001/insight-api/status?=getTxOutSetInfo 81 | 82 | 4. 区块链游览器 83 | https://tbtc.bitaps.com/ 84 | 85 | 5. 免费的接口调用(封装过的) 86 | https://developer.bitaps.com/blockchain#Last_block 87 | -------------------------------------------------------------------------------- /opsnode/4-2 BTC.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | ### 部署BTC 8 | 9 | 参考文档 10 | https://github.com/bitpay/bitcore 11 | https://blog.csdn.net/weixin_30613727/article/details/97989532 12 | 13 | ##### 环境需求: 14 | 15 | 1. testnet Requirements: 16 | 2核8G 17 | 磁盘150G 18 | Trusted P2P Peer -> 需要一个bitcoin全节点 19 | MongoDB Server >= v3.4 -> 需要MongoDB 20 | node v10 21 | 2. Requirements: 22 | 8核16G 23 | 磁盘1500G 24 | io要达到10000 25 | Trusted P2P Peer -> 需要一个bitcoin全节点 26 | MongoDB Server >= v3.4 -> 需要MongoDB 27 | node v10 28 | 29 | #### 安装 30 | 31 | ##### 1创建bitcore用户 32 | 33 | ```bash 34 | useradd -m bitcore 35 | chown -R bitcore.bitcore /data 36 | su - bitcore 37 | ``` 38 | 39 | ##### 2安装启动bitcoin 40 | 41 | 1. 下载最新的bitcoin全节点 42 | wget https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz 43 | tar xzvf bitcoin-0.19.1-x86_64-linux-gnu.tar.gz && mv bitcoin-0.19.1 bitcoin && cd bitcoin 44 | 2. 编辑配置文件 45 | mkdir /data/bitcoin 46 | mkdir /home/bitcore/bitcoin/logs 47 | vi bitcoin.conf 48 | 49 | ```conf 50 | datadir=/data/bitcoin 51 | testnet=1 # 主网则去掉这条配置 52 | server=1 53 | whitebind=127.0.0.1:18333 54 | whitelist=127.0.0.1 55 | txindex=1 56 | addressindex=1 # 57 | timestampindex=1 # 58 | spentindex=1 # 59 | zmqpubrawtx=tcp://127.0.0.1:28332 60 | zmqpubhashtx=tcp://127.0.0.1:28333 61 | zmqpubhashblock=tcp://127.0.0.1:28334 62 | zmqpubrawblock=tcp://127.0.0.1:28335 63 | rpcallowip=0.0.0.0/0 64 | rpcport=18332 65 | rpcuser=gary 66 | rpcpassword=XXXXXX 67 | uacomment=bitcore 68 | ``` 69 | 70 | 3. 启动 71 | 72 | ```bash 73 | # 配置文件要指定全路径 74 | log=/home/bitcore/bitcoin/logs/`date '+%Y-%m-%d'`.log 75 | /home/bitcore/bitcoin/bin/bitcoind --rpcport=18332 --rpcbind=0.0.0.0 -conf=/home/bitcore/bitcoin/bitcoin.conf >> $log 76 | ``` 77 | 78 | ##### 3安装MongoDB 79 | 80 | 版本 4+ 81 | 82 | ##### 4安装node v10 83 | 84 | node v10 85 | 86 | ##### 5安装bitcore 87 | 88 | 1. 下载 89 | git clone https://github.com/bitpay/bitcore 90 | 2. 安装依赖 91 | cd bitcore 92 | sudo su yum install gcc-c++ 93 | npm install 94 | 95 | - 注意事项1: 96 | 97 | ```log 98 | [14:55:07] I/config_source - curl -o/home/bitcore/bitcore.bak/packages/insight/node_modules/webdriver-manager/selenium/chrome-response.xml https://chromedriver.storage.googleapis.com/ 99 | events.js: 100 | throw er; // Unhandled 'error' event 101 | ^ 102 | Error: ESOCKETTIMEDOUT 103 | ``` 104 | 105 | 没法在中国大陆的服务器上进行npm install 106 | npm installl时,中国大陆服务器访问超时 https://chromedriver.storage.googleapis.com/ 107 | 108 | - 注意事项2: 109 | 110 | ```log 111 | Error: Cannot find module './build/Debug/addon' 112 | /bitcore/packages/bitcore-node/node_modules/heapdump/build/* 113 | ``` 114 | 115 | 缺少addon,我是从别的地方拷贝过来的,理论上也可以通过npm rebuild获取吧 116 | 117 | 3. 配置bitcore.config.json 118 | 119 | ```conf 120 | { 121 | "bitcoreNode": { 122 | "modules": ["./bitcoin", "./bitcoin-cash", "./ethereum", "./ripple"], 123 | "services": { 124 | "api": { 125 | "wallets": { 126 | "allowCreationBeforeCompleteSync": true 127 | }, 128 | "rateLimiter": { 129 | "disabled": true, 130 | "whitelist": [ 131 | "::ffff:127.0.0.1" 132 | ] 133 | } 134 | } 135 | }, 136 | "chains": { 137 | "BTC": { 138 | "testnet": { 139 | "chainSource": "p2p", 140 | "trustedPeers": [ 141 | { 142 | "host": "bitcoin", 143 | "port": 18332 144 | } 145 | ], 146 | "rpc": { 147 | "host": "bitcoin", 148 | "port": 18333, 149 | "username": "gary", 150 | "password": "@gary123456" 151 | } 152 | } 153 | }, 154 | "ETH": { 155 | "testnet": { 156 | "chainSource": "p2p", 157 | "trustedPeers": [ 158 | { 159 | "host": "parity", 160 | "port": 30303 161 | } 162 | ], 163 | "provider": { 164 | "host": "parity", 165 | "protocol": "ws", 166 | "port": 8546 167 | } 168 | } 169 | }, 170 | "XRP": { 171 | "mainnet": { 172 | "chainSource": "rpc", 173 | "provider": { 174 | "host": "rippled", 175 | "protocol": "ws", 176 | "port": "6006", 177 | "dataHost": "rippled" 178 | } 179 | } 180 | } 181 | } 182 | } 183 | } 184 | ``` 185 | 186 | 4. 启动 187 | 188 | - 创建后台启动脚本 vim start.sh 189 | 190 | ```bash 191 | #!/bin/bash 192 | export PATH=$PATH:/home/bitcore/.nvm/versions/node/v10.20.1/bin/ 193 | export NODE_OPTIONS=--max_old_space_size=3145728 194 | cd /home/bitcore/bitcore 195 | 196 | logPath=/home/bitcore/bitcore/logs/log_`date +%Y-%m-%d`.log 197 | npm run node >> ${logPath} 2>&1 198 | ``` 199 | 200 | - 启动 201 | bash start.sh 202 | 203 | ### 运维BTC 204 | 205 | 1. bitcoin端口 206 | 207 | - rpc 18332 208 | - p2p 18333 209 | 210 | 2. bitcor默认端口 211 | 212 | - 3000 213 | 214 | 3. 获取块高的API 215 | curl 127.0.0.1:3000/api/BTC/mainnet/block/tip | grep height 216 | 4. 区块链游览器 217 | https://tbtc.bitaps.com/ 218 | -------------------------------------------------------------------------------- /opsnode/5 Blockstack-STX.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - git仓库 8 | https://github.com/blockstack/blockstack-core 9 | 10 | ### 部署Blockstack STX 11 | 12 | - 使用pip安装, 版本v20.0.9.0 13 | 14 | ```shell 15 | # 官方文档 https://github.com/blockstack/blockstack-core 16 | 17 | # 安装依赖 18 | apt-get update && sudo apt-get install -y python-pip python-dev libssl-dev libffi-dev rng-tools libgmp3-dev 19 | pip install pyparsing 20 | # 安装并更新blockstack 21 | pip install blockstack --upgrade 22 | 23 | mkdir /data/STX 24 | adduser STX -m -d /data/STX -p 0 25 | # 进行配置 26 | blockstack-core configure --working-dir /data/STX/blockstack-server 27 | # 拉取块高 28 | blockstack-core --debug fast_sync --working-dir /data/STX/blockstack-server 29 | # 启动 30 | blockstack-core --debug start --working-dir /data/STX/blockstack-server 31 | # 关闭 32 | blockstack-core stop --working-dir /data/STX/blockstack-server 33 | ``` 34 | 35 | ### 运维须知 36 | 37 | 1. 默认端口 38 | 39 | - rpc_port : 6270 40 | - p2p_port : 6264 41 | 42 | 2. 查看进程存活 43 | 44 | - curl http://localhost:6270/v1/ping 45 | 46 | 3. API查看本地块高 47 | 48 | - curl http://localhost:6270/v1/info | grep "last_block_processed" 49 | 50 | 4. API查看官方的块高 51 | 52 | - curl https://core.blockstack.org/v1/info | grep "last_block_processed" 53 | 54 | 5. 从本地节点查看块高交易信息 55 | 56 | - curl http://127.0.0.1:6270/v1/blockchains/bitcoin/operations/608484 57 | 58 | 6. 从官方节点查看块高交易信息 59 | 60 | - https://core.blockstack.org/v1/blockchains/bitcoin/operations/617322 61 | 62 | 7. 区块链游览器 63 | 64 | - https://explorer.blockstack.org/ 65 | -------------------------------------------------------------------------------- /opsnode/6 Tezos.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - 参考文档 8 | https://tezos.gitlab.io 9 | 10 | ### 部署 Tezos 11 | 12 | - 部署方式docker 13 | 14 | 1. 硬件要求\ 15 | 最低2C4G,否则会出现同步缓慢,磁盘吞吐量飙升 16 | 17 | ```shell 18 | # 安装docker-compose 19 | yum -y install python-pip 20 | pip install docker-compose 21 | 22 | # 下载部署脚本(根据脚本名字区分是否是测试网) 23 | # 主网 24 | wget -O mainnet.sh https://gitlab.com/tezos/tezos/raw/master/scripts/alphanet.sh 25 | chmod +x mainnet.sh 26 | mv mainnet.sh /usr/local/bin 27 | # 测试网 28 | wget https://gitlab.com/tezos/tezos/raw/master/scripts/alphanet.sh 被废弃了 29 | wget -O babylonnet.sh https://gitlab.com/tezos/tezos/raw/babylonnet/scripts/alphanet.sh 30 | chmod +x alphanet.sh 31 | mv alphanet.sh /usr/local/bin 32 | 33 | # 禁止镜像自动更新 34 | cat > /etc/profile.d/tezos.sh << "EOF" 35 | export TEZOS_ALPHANET_DO_NOT_PULL=yes 36 | export TEZOS_MAINNET_DO_NOT_PULL=yes 37 | EOF 38 | source /etc/profile.d/tezos.sh 39 | 40 | # 启动fullnode节点(会自动拉镜像,并启动) 必须指定rpc端口否则RPC端口可能不开启 41 | # 诺想改变卷目录则需要修改mainnet.sh 42 | mainnet.sh node start --rpc-port 0.0.0.0:8732 43 | ``` 44 | 45 | ### 运维须知 46 | 47 | 1. 默认端口 48 | 49 | - p2p:9732 50 | - rpc:8732 51 | 52 | 2. 浏览器 53 | 54 | - 主网\ 55 | https://tzscan.io/ 废弃 56 | https://tezos.id/ 57 | - 测试网\ 58 | https://alphanet.tzscan.io/ 废弃 59 | https://babylonnet.tezos.id/ 60 | 61 | 3. 数据目录\ 62 | /data/docker/volumes/mainnet_node_data/\_data/data 63 | 64 | 4. 常用命令 65 | mainnet.sh node \ 66 | 67 | 5. 指令查看块高 68 | 69 | - mainnet.sh head 70 | 71 | 6. tezos-node shell 内的命令 72 | 73 | ```shell 74 | 1. 生成节点id 75 | tezos-node identity generate 76 | 2. 清理无效的块信息 77 | tezos-admin-client unmark all invalid blocks 78 | 3. 生成用户 79 | tezos-client gen keys bob 80 | 4. 通过官方的json文件,生成含有一定金额的用户 81 | tezos-client activate account alice with "tz1__xxxxxxxxx__.json" 82 | 5. 列出所有用户 83 | tezos-client list known contracts 84 | 6. 获取用户的金额 85 | tezos-client get balance for tz1gSoJR8FaoKvRH1T31uLSMuHbQMyYdvZTP 86 | ``` 87 | 88 | 7. API查看块高 89 | 90 | - 本地 curl http://127.0.0.1:8732/chains/main/blocks/head/header | grep level 91 | - 官网主网 curl https://api.tzstats.com/explorer/block/head | grep height 92 | -------------------------------------------------------------------------------- /opsnode/7 Vechain-Vet.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | - 参考链接 8 | https://github.com/vechain/thor 9 | - 链 Vechain 10 | - 币 VET 11 | - 语言 go 12 | - 进程 thor 13 | 14 | ### 部署 Vechain 15 | 16 | - 部署方式源码 17 | 18 | ```bash 19 | # 春节用户 20 | useradd -m -r thor 21 | su - thor 22 | # 1. 安装go环境 23 | # 2. 下载源码 24 | git clone https://github.com/vechain/thor.git 25 | # 3.编译 26 | make dep 27 | make 28 | # 4. 运行 29 | /home/thor/thor/bin/thor --network test --api-addr 0.0.0.0:8669 --data-dir /opt/thor_data 30 | # 主网为 --network main 31 | ``` 32 | 33 | ### 运维须知 34 | 35 | 1. 默认端口: 36 | - p2p: 11235 37 | - rpc: 8669 38 | 2. API查看块高 39 | curl http://127.0.0.1:8669/blocks/best 40 | 3. 区块链浏览器 41 | - 主网: https://explore.vechain.org/ 42 | - 测试网:https://explore-testnet.vechain.org/ 43 | -------------------------------------------------------------------------------- /opsnode/8 Iris.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | [官网详情链接](https://www.irisnet.org/docs/get-started/mainnet.html#upgrade-to-validator-node) 8 | 9 | ### 部署Iris 10 | 11 | ```bash 12 | # 安装go环境 13 | goPath=~/go 14 | mkdir -p ${goPath}/go/bin 15 | echo "export GOPATH=$HOME/go" >> ~/.bashrc 16 | echo "export GOBIN=$GOPATH/bin" >> ~/.bashrc 17 | echo "export PATH=$PATH:$GOBIN" >> ~/.bashrc 18 | source ~/.bashrc 19 | 20 | # 1、安装iris 21 | git clone --branch v0.16.0 https://github.com/irisnet/irishub 22 | cd irishub 23 | # source scripts/setTestEnv.sh # to build or install the testnet version 24 | make get_tools install 25 | 26 | # 2、初始化为主网节点 27 | homePath=/data/iris/iris 28 | iris init --moniker=moniker-wx --home=${homePath} --chain-id=irishub cd /config/ rm genesis.json rm config.toml 29 | # chain-id=irishub代表是IRISnet主网 30 | 31 | # 下载公链的配置文件,并替换 32 | curl -o ~/.iris/config/config.toml https://raw.githubusercontent.com/irisnet/mainnet/master/config/config.toml 33 | curl -o ~/.iris/config/genesis.json https://raw.githubusercontent.com/irisnet/mainnet/master/config/genesis.json 34 | mv config.toml ${homePath}/config/ && mv genesis.json ${homePath}/config/ 35 | 36 | # 3、启动 37 | p2pLogPath=/data/iris/iris/node.log 38 | iris start --home=${irisHomePath} > ${p2pLogPath} 2>&1 39 | 40 | rpcLogPath=/data/iris/iriscli/server.log 41 | irislcd start --node=tcp://localhost:26657 --laddr=tcp://0.0.0.0:1317 --chain-id=irishub --home=${homePath} --trust-node > ${rpcLogPath} 2>&1 42 | 43 | ``` 44 | 45 | ### 运维须知 46 | 47 | 1. 默认端口 48 | rpc: 1317 49 | p2p: 26656 50 | 2. 查看节点信息 51 | iriscli status 52 | 3. 指令查看块高 53 | iriscli status | grep latest_block_height 54 | 4. API查看块高 55 | curl http://127.0.0.1:1317/blocks/latest 56 | 5. 通过快照同步快高 57 | iris snapshot --home= 58 | 59 | 20191129更新: 60 | 跳转:3447000 61 | -------------------------------------------------------------------------------- /opsnode/9 Vsystems.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2020-11-16 3 | --- 4 | 5 | [TOC] 6 | 7 | #### 安装部署 8 | 9 | 1. 硬件配置 10 | 2c4g100g 11 | ubuntu 12 | 13 | 2. JRE1.8 14 | 15 | ```shell 16 | # 安装oracal-java环境- 失败 17 | add-apt-repository -y ppa:webupd8team/java 18 | apt-get update 19 | apt-get -y install oracle-java8-installer 20 | java -version 21 | 22 | # 安装openjdk 环境 23 | # 以下均在root用户下操作 24 | apt-get update -y 25 | apt-get install openjdk-8-jdk -y 26 | java -version 27 | 28 | # 卸载 29 | #若是oracle-jdk 30 | apt-get remove oracle-java8-installer 31 | #若是openjdk 32 | apt-get remove/purge openjdk* 33 | 34 | ``` 35 | 36 | #### TestNet安装 37 | 38 | ```shell 39 | cd /data 40 | # 这里决定是用主网还是测试网 41 | wget https://github.com/virtualeconomy/v-systems/releases/download/v0.2.0/v_systems_0.2.0_testnet.deb 42 | sudo dpkg -i v_systems_0.2.0_testnet.deb 43 | 44 | sudo mkdir -p /data/vsys/data 45 | sudo chown -R vsys:vsys /data/vsys 46 | 47 | # 更改配置文件 48 | vim /etc/vsys/vsys.conf 49 | 更改存储目录 50 | directory = /data/vsys 51 | 52 | # 启动 53 | systemctl start vsys.service 54 | systemctl enable vsys.service 55 | journalctl -u vsys.service -f 56 | 57 | ``` 58 | 59 | ## 运维须知 60 | 61 | API查看块高 62 | curl -X GET --header 'Accept: application/json' 'http://localhost:9922/blocks/height' 63 | 测试节点 64 | http://${IP}:9922/api-docs/index.html#!/blocks/height 65 | 超级节点 66 | https://vsysrate.com/ 67 | 官网 68 | https://www.v.systems 69 | 钱包 70 | https://www.v.systems/zh-tw/wallet.html 71 | 浏览器 72 | https://explorer.v.systems/ 73 | wiki 74 | https://github.com/virtualeconomy/v-systems/wiki 75 | 主网API 76 | http://${IP}:9922/api-docs/index.html#/wallet 77 | -------------------------------------------------------------------------------- /opsnode/BCH.txt: -------------------------------------------------------------------------------- 1 | 默认端口 2 | rpc: 3000 3 | p2p: 8332 4 | 5 | RPC 6 | curl http://bch-i.hub.garys.top:3000/api/BCH/mainnet/block/tip -------------------------------------------------------------------------------- /opsnode/CYB.txt: -------------------------------------------------------------------------------- 1 | 默认端口 2 | ws: 8090 3 | p2p: 5000 -------------------------------------------------------------------------------- /opsnode/ChainX.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 进程名witness 4 | 自己服务化cyb进程 5 | 6 | 7 | 普通升级:更换二进制 8 | 9 | 生产环境配置文件:/data/data-dir/config.ini 10 | 11 | 12 | 区块链游览器 13 | https://stats.chainx.org/#list/ChainX 14 | 15 | 默认端口 16 | rpc: 8086 17 | ws: 8087 18 | p2p: 20222 -------------------------------------------------------------------------------- /opsnode/LTC.txt: -------------------------------------------------------------------------------- 1 | curl http://${IP}:3007/insight-lite-api/blocks?limit=1 | grep height 2 | 3 | -------------------------------------------------------------------------------- /opsnode/cosmos.txt: -------------------------------------------------------------------------------- 1 | 1. 安装Go环境 2 | 3 | 2. 编译安装 4 | git clone -b https://github.com/cosmos/gaia 5 | cd gaia && make install 6 | 7 | 3. 验证 8 | gaiad version --long 9 | gaiacli version --long 10 | 11 | 4.加入主网 12 | 13 | 5.启动 14 | gaiacli start 15 | 16 | 查看块高 17 | gaiacli status | grep latest_block_height 18 | 19 | 代币:Atom 20 | 21 | 默认端口: 22 | RPC: 1317 23 | P2P: 26656 24 | 25 | 26 | 27 | 28 | 29 | cosmos链 30 | https://github.com/cosmos/cosmos-sdk 31 | https://cosmos.network/docs/cosmos-hub 32 | 33 | 34 | systemctl start cosmos 35 | systemctl start cosmos-rest 36 | 查块高 curl http://127.0.0.1:1317/blocks/latest 37 | 38 | 更新升级: 39 | 1 确认存在go环境 40 | 2 cd $GOPATH/src/github.com/cosmos/cosmos-sdk 41 | 3 git pull 42 | 4 git checkout ${tag} 43 | 5 systemctl stop cosmos 44 | 6 systemctl stop cosmos-rest 45 | 7 make tools install 46 | 查看是否更新成功 47 | gaiad version --long 48 | gaiacli version --long -------------------------------------------------------------------------------- /opsnode/eos.txt: -------------------------------------------------------------------------------- 1 | eos 2 | 在我们搭的所有链中 块高最高 3 | 数据不干净,可能会使块高从0开始增长。因此每次重启需要拉 快照。 4 | 查看版本 nodeos -v 5 | 6 | Ubuntu部署: 7 | wget $(wget --quiet "https://eosnode.tools/api/snapshots?limit=1" -O- | jq -r '.data[0].s3') -O snapshot.tar.gz 8 | tar -xvf snapshot.tar.gz 9 | wget https://github.com/EOSIO/eos/releases/download//eosio_-ubuntu-16.04_amd64.deb 10 | dpkg -i eosio_-ubuntu-16.04_amd64.deb 11 | export EOS_ROOT=`pwd` 12 | nohup nodeos --config-dir ${EOS_ROOT} --data-dir ${EOS_ROOT}/data --snapshot > ./nodeos.log 2>&1 & 13 | 14 | 更新: 15 | wget 拉去最新dpkg包 16 | 停nodeos进程 17 | dpkg 安装最新的包 18 | 19 | 20 | 默认端口 21 | rpc 8888 22 | p2p 9876 -------------------------------------------------------------------------------- /opsnode/usdt.txt: -------------------------------------------------------------------------------- 1 | rpc:8332 2 | 3 | 指令 4 | ./omnicore-cli -conf=/home/usdt/cfg/bitcoin-live.conf "omni_getbalance" "1EfGpn8GcMJR6wBMyUkCfAyYLncqCigwqZ" 31 5 | 6 | 7 | --user omnicorerpc 8 | curl --data-binary '{"jsonrpc": "2.0", "id":"curltest", "method": "getinfo", "params": [] }' -H 'content-type: application/json; ' http://127.0.0.1:8332/ 9 | -------------------------------------------------------------------------------- /opsnode/vsys.txt: -------------------------------------------------------------------------------- 1 | 基于java的链 -------------------------------------------------------------------------------- /others/bc_link.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2021-11-23 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 文章 8 | 9 | 1. 以太坊是全球金融中心 https://forum.degate.com/t/topic/71/3 10 | 2. 2024 Cosmos生态 https://public.bnbstatic.com/static/files/research/orbiting-the-cosmos-ecosystem.pdf 11 | 12 | ## 学习平台 13 | 14 | 1. https://openbuild.xyz/ 15 | 16 | ## 区块链 17 | 18 | - 区块链生态服务商 https://consensys.net/ 19 | 20 | - 募资平台IDO https://paidnetwork.com/ 21 | 22 | - https://nodes.guru/ 俄国人开发的 23 | 24 | - Nodes Guru contains a full list with guides for testnet for all projects in crypto world. 25 | 26 | ## 以太坊网络资料库 27 | 28 | - ENS https://ens.domains/ 29 | 30 | ## RPC服务商 31 | 32 | - RPC服务商对比 https://moralis.io/whats-the-difference-between-moralis-alchemy-and-infura/ 33 | 34 | 1. Infura https://infura.io/ 35 | 36 | 2. Alchemy https://www.alchemy.com/ 37 | 38 | - 支持solana网络 39 | 40 | 3. Moralis[ https://moralis.io/](https://moralis.io/) 41 | 42 | 4. https://dashboard.tatum.io/ 43 | 44 | 5. https://dashboard.instantnodes.io/ 45 | 46 | 6. https://publicnode.com/ 47 | 48 | 7. 免费不需要注册 49 | 50 | ## 比特币网络资料库 51 | 52 | 1. 比特币网络/闪电网络Lightning/二层网络LIQUID 兑换 https://boltz.exchange/swap 53 | 2. 通过TG闪电网络节点在线监控 https://lightning.watch/ 54 | 3. 拆分UTXO https://ordinalswallet.com/wallet 55 | -------------------------------------------------------------------------------- /others/faucet.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2025-05-05 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 多个测试网网络水龙头 8 | 9 | 1. https://faucet.trade/ 10 | 2. faucets.chain.link 11 | 3. https://learnweb3.io/faucets/ 需要认证Github 12 | 4. https://bisell.site/ 购买 13 | 14 | ## 以太坊 Goerli 网络水龙头 15 | 16 | 1. 官方水龙头 https://faucet.paradigm.xyz/ 17 | 18 | 1. 注意: 通过推特进行领取,推特账户至少发了一条推特, 有 50 个followers, 注册时间超过1个月。 19 | 20 | 2. Alchemy水龙头 https://goerlifaucet.com/ 21 | 22 | 1. 注意:需要谷歌账户登录Alchemy才能领取 23 | 24 | 3. https://grabteeth.xyz/ 25 | 26 | 1. 注意: 需要在网络上部署过合约。 27 | 28 | 4. https://goerli-faucet.pk910.de/ 29 | 30 | 1. 注意: POW挖测试代币 31 | 32 | 5. https://chaineye.tools/faucet 33 | 34 | 1. 注意: 推特注册60天+,有10+个follower 35 | 36 | 6. https://faucet.paradigm.xyz/ 37 | 38 | 1. 1. 注意: 推特发过1条特推,有50+个follower,注册时间超过1个月。 39 | 40 | 7. https://faucet.quicknode.com/ethereum/goerli 41 | 42 | 1. 主网上必须有0.001 ETH 43 | 44 | 8. https://faucet.goerli.mudit.blog/ 45 | 46 | ## 以太坊 Sepolia 网络水龙头 47 | 48 | - 资料 49 | - 其它水龙头地址列表 https://faucetlink.to/sepolia 50 | 51 | 1. https://faucet.quicknode.com/ethereum/sepolia 52 | 1. 领取条件: 53 | 1. 以太坊主网需要有 0.001 ETH 以上。 54 | 2. https://www.alchemy.com/faucets/ethereum-sepolia (备用网站 https://sepoliafaucet.com/) 55 | 1. 领取条件: 56 | 1. 以太坊主网需要有 0.001 ETH 以上。 57 | 2. 谷歌账户注册登入alchemy(有时需要手机号)。 58 | 3. https://www.infura.io/faucet/sepolia 59 | 1. 领取条件: 60 | 1. 需要注册登入infura。 (注册infura账户教程 https://www.youtube.com/watch?v=WkojkWkVdZY) 61 | 2. 太坊主网上有过交易记录。 62 | 4. https://sepolia-faucet.pk910.de/ 63 | 1. 领取条件: 64 | 1. Gitcoin Passport 分数需要大于等于 2分。 65 | 2. 通过POW挖矿模式领取测试代币。 66 | 5. https://faucet-sepolia.rockx.com/ 或 https://access.rockx.com/faucet-sepolia 67 | 1. 领取条件: 68 | 1. 需要注册登入rockx 69 | 2. 以太坊主网需要有 0.0011 ETH 以上。 70 | 6. https://faucet.trade/sepolia-eth-faucet 71 | 1. 领取条件: 72 | 1. 推特注册时间大于1个月,关注者大于5。 73 | 2. 有人机验证码。 74 | 75 | ## 以太坊 Layer2 网络 76 | 77 | 1. Starknet测试网ETH代币 https://faucet.goerli.starknet.io/ 78 | 79 | 2. Arbitrum Goerli测试网ETH代币 https://bwarelabs.com/faucets/arbitrum-testnet 80 | 81 | 3. Optimism Goerli测试网ETH代币 82 | 83 | 1. https://optifaucet.com/ Optimism Goerli测试网上不能持有ETH 84 | 2. https://faucet.quicknode.com/optimism/goerli 需要在以太坊主网上持有0.001个ETH 85 | 3. https://bwarelabs.com/faucets/optimism-testnet 每天可以mint一次 86 | 87 | 4. scroll测试网 https://prealpha.scroll.io/faucet/ (Twitter 30个关注) 88 | 89 | 5. poligon网络 https://linktr.ee/faucet_dao 购买测试币 90 | 91 | 1. https://app.uniswap.org/#/swap 在poligon网络购买FDT, 0x034f5bEc23a65a80dFd3A5A91dffa88274E9aB24 92 | 2. https://www.faucetdao.shop/ 将FDT跨桥到poligon网络,购买tETH 93 | 94 | 6. https://www.l2faucet.com/ 95 | 96 | ## 比特币网络水龙头 97 | 98 | - testnet3 99 | 1. https://bitcoinfaucet.uo1.net/send.php 100 | 2. https://cryptopump.info/send.php 101 | 3. https://testnet-faucet.mempool.co/ 102 | 4. https://coinfaucet.eu/en/btc-testnet/ 可行 103 | 5. https://kuttler.eu/en/bitcoin/btc/faucet/ 可行 104 | 6. https://faucet-btc-testnet.metawire.cloud/ 可行 105 | 7. https://tbtc.bitaps.com/ 106 | 8. https://testnet.help/en/btcfaucet/testnet 107 | - testnet4 108 | 1. https://mempool.space/testnet4/faucet 可行 109 | 2. https://faucet.testnet4.dev/ 可行 110 | -------------------------------------------------------------------------------- /others/grants.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-02-21 3 | --- 4 | 5 | [TOC] 6 | 7 | ## 区块链项目奖励开发奖励链接 8 | 9 | ### BTC 项目 10 | 11 | - 比特币开发奖励 https://developergrant.okcoin.com/ 12 | 13 | ### Aleo 项目 14 | 15 | - June 3, 2021/06/03 16 | - Aleo生态建设 https://www.aleo.org/post/community-grants-program 17 | 18 | ### Biconomy 项目 19 | 20 | - 2022/02/10 21 | 1. 🔥 Dual farming on Quickswap: 22 | - https://twitter.com/biconomy/status/1489234410620653568?s=20&t=8CGjWRMHB5ZuSsfZWva0sg 23 | 2. 🚀 Earn ever more $BICO on Quickswap with Dragon's Syrup pool: 24 | - https://twitter.com/biconomy/status/1491289673527816192?s=20&t=8CGjWRMHB5ZuSsfZWva0sg 25 | 3. 😍 Hump Day challenge on Binance: 26 | - https://twitter.com/biconomy/status/1491417338394333184?s=20&t=8CGjWRMHB5ZuSsfZWva0sg 27 | 4. 🥳 Week long campign to earn $BICO on WazirX: 28 | - https://twitter.com/biconomy/status/1491752343901126661?s=20&t=8CGjWRMHB5ZuSsfZWva0sg 29 | 30 | ### Kadena 项目 31 | 32 | - 官网 https://waveslabs.com/ 33 | - 申请 https://github.com/kadena-io/technical-grants 34 | - 一个项目最大补助金: 50000美元 35 | 36 | ### Stellar 项目 37 | 38 | - 申请 https://www.stellar.org/foundation/mandate 39 | 40 | ### Waves 项目 41 | 42 | - 申请 https://airtable.com/shr6gbeELDvmYGX31 43 | 44 | ### Akash 项目 45 | 46 | - 申请 https://forum.akash.network/t/new-developer-grants-program-community-awards-board/541 47 | - 代币 AKT 48 | 49 | ### Solana 项目 50 | 51 | - 申请 https://solana.foundation/grants 52 | 53 | ### Algorand 项目 54 | 55 | - 申请 https://algorand.foundation/grants-program 56 | 57 | ### Zcash 58 | 59 | - 申请 https://grants.zfnd.org/ 60 | 61 | ### Dai 62 | 63 | - 申请 https://docs.ethhub.io/other/funds/stable-fund/ 64 | 65 | ### FIlecoin 66 | 67 | - https://www.dgm.xyz/ 68 | 69 | ### Conflux 70 | 71 | - https://confluxnetwork.org/zh/developers/grants 72 | 73 | ### Aztec 74 | 75 | - https://aztec.network/grants/ 76 | 77 | ## 组织 78 | 79 | ### DEVgrants 组织 ESP 80 | 81 | - 给予区块链项目开发者进行补助,主要是关于以太坊生态的。 82 | - 一个项目补助金: 补助金 1000美元 ~ 10000美元 83 | - 补助申请:https://esp.ethereum.foundation/en/inquire/ 84 | 85 | ### gitcoin 组织 86 | 87 | - 申请项目资助 或者 资助项目 的平台 88 | - 官网 https://gitcoin.co/grants/ 89 | 90 | ### giveth 组织 91 | 92 | - 申请项目资助 或者 资助项目 的平台 93 | - https://giveth.io/ 94 | 95 | ### immunefi 组织 96 | 97 | - 提供各个项目的bug发现奖金列表 98 | - https://immunefi.com/explore/ 99 | 100 | ### ethprize 组织 101 | 102 | - 以太坊生态奖励 103 | - http://ethprize.io/#about 104 | 105 | ### Web3 组织 106 | 107 | - 申请 https://web3.foundation/grants/ 108 | -------------------------------------------------------------------------------- /secure/secure.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-04-07 3 | --- 4 | 5 | [TOC] 6 | 7 | # 区块链安全 8 | 9 | - 4个方面的安全 10 | 1. 交易所安全 11 | 2. 钱包安全 12 | 3. 共识机制安全 13 | 4. 智能合约安全 14 | 15 | ## 相关链接 16 | 17 | - CFT 区块链安全比赛 18 | 19 | ## 交易所安全 20 | 21 | 01. SQL注入攻击 22 | 02. 命令执行 23 | 03. XSS 24 | 04. CSRF 25 | 05. SSRF 26 | 06. 文件上传 27 | 07. 逻辑漏洞 28 | 08. DDos 29 | 09. DNS劫持 30 | 10. 信息泄露 31 | 11. 钓鱼攻击 32 | 12. APP终端安全 33 | 13. 第三方组件安全 34 | 14. 越权操作 35 | 15. 弱口令 36 | 37 | ## 钱包安全 38 | 39 | - 冷钱包 40 | 1. 系统安全 41 | 2. 设备锁安全 42 | 3. 设备调试安全 43 | 4. 数据存储安全 44 | 5. 交易过程 45 | - 热钱包 46 | 01. 助记词/私钥安全 47 | 02. 业务逻辑安全 48 | 03. APP代码安全 49 | 04. APP运行时的root检测 50 | 05. APP缓存安全 51 | 06. 接口安全 52 | 07. 弱加密安全 53 | 08. 数据存储安全 54 | 09. 数据传输安全 55 | 10. APP组件导出安全 56 | 11. APP组件权限安全 57 | 12. 铭感信息泄露 58 | 13. 敏感权限使用 59 | 60 | ## 共识机制安全 61 | 62 | 1. 51%计算攻击 63 | 2. 种族攻击 64 | 3. 芬妮攻击 65 | 4. Vector 76攻击 66 | 5. 替代历史攻击 67 | 68 | ## 智能合约安全 69 | 70 | - 高危 71 | 1. 整数益出 72 | 2. 重入攻击 73 | 3. 假充值 74 | 4. 浮点数和数值精度 75 | 5. 代币增发 76 | 6. 冻结账户绕过 77 | 7. 短地址攻击 78 | - 中危 79 | 1. 未验证返回值 80 | 2. 非预期的Ether 81 | 3. 默认可见性 82 | 4. tx.origin身份认证 83 | 5. Delegatecall函数调用 84 | 6. Call函数调用 85 | 7. 拒绝服务 86 | 8. 逻辑设计缺陷 87 | 9. 未出初始化的存储指针 88 | - 低危 89 | 1. 错误的构造函数 90 | 2. 不安全的随机数 91 | 3. 时间搓依赖 92 | 4. 交易顺序依赖 93 | -------------------------------------------------------------------------------- /secure/solidity.md: -------------------------------------------------------------------------------- 1 | --- 2 | created_date: 2022-04-07 3 | --- 4 | 5 | [TOC] 6 | 7 | # 安全 8 | 9 | - 参考 10 | - https://ethereum.org/zh/developers/docs/security/ 11 | - 最佳安全开发指南 https://github.com/ConsenSys/smart-contract-best-practices 12 | - 以太坊官方博客,带有Security标签的博客 https://blog.ethereum.org/category/security/ 13 | 14 | ## 常见的 Solidity 的漏洞类型 15 | 16 | - Reentrancy - 重入 17 | - Access Control - 访问控制 18 | - Arithmetic Issues - 算术问题(整数上下溢出) 19 | - Unchecked Return Values For Low Level Calls - 未严格判断不安全函数调用返回值 20 | - Denial of Service - 拒绝服务 21 | - Bad Randomness - 可预测的随机处理 22 | - Front Running 23 | - Time manipulation 24 | - Short Address Attack - 短地址攻击 25 | - Unknown Unknowns - 其他未知 26 | 27 | ### 重入漏洞 28 | 29 | - 重入漏洞存在于合约之间的交互过程 30 | - 攻击方发送一笔交易,导致合约代码重复执行直到将合约账户的资源消耗完。这有点类似于C语言的递归函数。攻击方能成功进行可重入攻击,主要依赖于Soildity为智能合约提供的fallback和call函数 31 | - 重入漏洞成立的条件 32 | 1. 有转账功能(Payable) 33 | 2. 状态变量在call函数调用之后 34 | 35 | ## 审计 36 | 37 | - slither 38 | - 用 Python 3 编写的 Solidity 静态分析框架 39 | - https://github.com/crytic/slither 40 | 41 | ## 反编译 42 | 43 | - 参考 44 | - https://github.com/comaeio/porosity 45 | - https://www.pnfsoftware.com/blog/ethereum-smart-contract-decompiler/ 46 | -------------------------------------------------------------------------------- /solana/solana.md: -------------------------------------------------------------------------------- 1 | 1. SOL 的最小单位是 lamport,精度为 9(小数点后 9 位)。 2 | 2. 1 SOL = 1000000000 lamport 3 | 3. 大多数 Solana 生态的同质化代币默认是 6 位小数,而不是 18 位。 4 | 4. Solana 中的数据大多以 base58 表示,可以使用 from_base58() 函数转换为十六进制。 (十六进制 / 二进制) 5 | --------------------------------------------------------------------------------