Hello World - 区块链
type: channel
link: https://wlwl.host/index.php/category/blockchain/
description: 区块链、以太坊、智能合约
items: 支持多链多币的跨链桥
items: 比特币 交易模型
items: RSA 算法
items: 以太坊 再质押
items: 以太坊 交易类型
items: 以太坊 历史
items: cometbft改进协议
items: Hardhat 框架
items: cosmos 运行
items: cosmos 白皮书

支持多链多币的跨链桥
type: item
date: 2024-09-15T15:06:00+00:00
description: 需求分析可以支持多条链，只要链支持Solidity智能合约即可可以支持多个代币，需要符合ERC20标准的代币由去中心化的中继节点采用投票方式来完成跨链请求的确认每个中继节点需要质押保证金，每成功一笔跨链交易可获取奖励引入惩罚机制，中继节点每次作恶都会被罚没，保证金低于一定值时被封禁，重新充入保证金可解封引入黑名单管理机制，符合监管需求，禁止名单内账户使用跨链桥功能引入中继节点准入机制，维持中继节点集群稳定，保障跨链桥的稳定工作跨链交易规则跨链有最低金额限制（比如100USDT）每笔收取总金额的一定比例作为手续费（比如万分之五）一定比例的手续费平分给参与投票的中继节点（比如70%）剩下比例的手续费发给平台（比如30%）用户需手动去领取跨链资产，也可以在指定一个帮忙自动提取的中继节点（需额外付费）中继节点规则中继节点列表由平台进行管理维护，需保持稳定（避免在短时间内大量增加或减少）保证金由中继节点自行维护，存入自由，取出需要限制（比如每隔24小时可取一次）中继节点数量需保持一定合适的数量，至少也得3个，太多中继节点也不好（浪费机器资源，也拖慢投票速度）投票罚没规则中继节点需保证金大于指定门槛的才可以参与投票（比如10万），低于的处于封禁状态中继节点的投票权重都一样，和保证金大小无关每次跨链请求需要大于2/3的中继节点（所有的包括封禁的）投票才算通过投票时需要附带中继节点的签名（合约可以验证签名来核查投票结果并允许用户提取对应资产）每次作恶罚没一定比例的保证金（比如5万），罚没的保证金转给平台地址如果某个节点持续作恶，会不断损失保证金，平台也可以将其从中继节点列表中移除跨链通道要进行跨链交易，需要在两条链之间创建一个通道通道是有方向的，一般情况要添加双向的：A链->B链和B链->A链通道需指定两条链关联的代币地址相同的两条链可添加多对代币地址参与角色普通用户-web前端：发起跨链请求、领取跨链资产、查看交易记录（历史的和进行中的）中继节点-后台服务：跨链交易投票、帮用户自动领取跨链资产中继节点-web前端：查看管理保证金、查看收益、查看投票记录平台管理-web前端：查看管理中继节点、查看保证金、查看收益列表、查看修改黑名单、查看交易记录数据分析与监控：交易汇总分析、中继节点收益分析、资金流动分析、跨链桥异常预警合约设计核心流程：用户在A链存入（冻结）资产、中继节点投票（签名）确认、使用超2/3的签名在B链取出（解冻）资产引入一个廉价的链来存储投票过程，而不是中继节点自行共识，投票过程更安全，也可追溯，提高系统的可用性、安全性用来投票的链这里称为桥链（bridge chain），它还可用来存储一些其它数据或运行一些服务使用签名技术减少合约调用次数，简化设计与节省交易gas费为了节省交易gas费，所有投票在桥链上完成，其它功能也尽量在桥链上实现投票就是签名，用户投票则是将签名写入到桥链合约中跨链通道定义：通道id=keccak256(来源链id,来源链代币地址,目标链id,目标链代币地址)跨链交易定义：交易id=keccak256(通道id,时间戳,接收者,金额,手续费)跨链交易记为KR，投票就是对KR进行签名，记为：KS，有效投票需满足数据无篡改和签名可验证架构桥核心合约（资产）：跨链资金出入口、中继成员列表、黑名单列表桥治理合约（投票）：签名存储与验证、保证金管理、惩罚机制、手续费分发桥链部署：治理合约A链部署：资产合约B链部署：资产合约C链部署：资产合约桥核心合约接口-添加中继节点接口-移除中继节点接口-将账户地址加入黑名单接口-将账户地址从黑名单删除接口-添加跨链通道接口-移除跨链通道接口-跨链转入资产（用户资产充足且未在黑名单内）接口-跨链取出资产（需通过2/3的中继节点签名验证）事件-中继节点变更、黑名单变更、资产转入、资产转出、资产解冻、交易取消查询-中继节点、黑名单、跨链USDT额度（到不同链上的额度）变量-跨链USDT额度列表、中继节点列表、黑名单列表桥治理合约接口-增加保证金接口-减少保证金接口-上传签名（验证签名，作恶罚没）事件-保证金变更、签名提交、投票结果、罚没查询-保证金、签名、罚没次数、罚没金额变量-保证金余额列表、签名列表、跨链交易列表、惩罚记录表合约执行以以太坊和波场为例，以稳定币USDT为例初始化两条链的桥核心合约设置相同的10个中继节点地址和黑名单列表在桥链的桥治理合约中为10个中继节点地址冲入20万保证金平台往两条链的桥核心合约中存入10万USDT作为流动资金Ethereum >>> Tron 跨链用户调用Ethereum链资产合约的跨链转入接口检查用户不在黑名单内，黑名单用户交易直接失败将用户的1万个USDT转到资产合约地址名下更新变量：到Tron链的跨链USDT额度减少1万发出事件：跨链转入（…

比特币 交易模型
type: item
date: 2024-09-01T14:28:00+00:00
description: 与以太坊的账户模型不同，比特币是没有余额概念的，使用的是UTXO模型。所以在比特币网络中，存储比特币的是交易输出，准确点说就是未使用过的交易输出。UTXOUTXO是Unspent Transaction Outputs的缩写（Transaction可简写为TX），即未使用过的交易输出。比特币节点会追踪UTXO集合，从而确定哪些代币未被花费，以及哪些人可以花费它们。最初的比特币是通过铸币交易创造的，它是用来奖励矿工的一种特殊交易，因为是凭空创造的，所以它没有输入的。新的UTXO是通过花费现有UTXO创建的，UTXO包含了接收地址和金额。每个比特币交易都由输入和输出组成。输入花费已有UTXO，输出则创建新的UTXO，UTXO只要被用一次，就不存在“未花费”了，以后就不会再被引用，这样就解决双花（双重支付）问题。当我们要使用一个UTXO时，需要对UTXO进行解锁（一般是用私钥对UTXO进行签名），虽然UTXO是公开的，但是如果没有私钥去解锁，则不能花费UTXO。交易结构交易是比特币的核心数据结构，包括区块在内的数据结构都是在为交易服务。交易主要由未花费的输入和输出组成，输出总金额不能大于输入的总金额，多余的部分为交易矿工费有三种类型交易铸币交易（Generation TX），有额外的Coinbase字段，矿工可以随意填写一些信息，因为是挖矿所得，所以这种交易类型没有输入，输出数量就是矿工所得，地址是矿工的地址。普通交易（Pubkey Hash TX），转账交易，一个或多个输入，一个或两个输出，第一个输出称为支付，第二个输出称为找零脚本交易（Script Hash TX），一般为多签脚本，为普通交易升级版本，可以生成灵活的锁定脚本，然后使用特定的解锁脚本去花费比特币字段表数据项大小(Byte)数据类型描述nVersion4int32_t交易版本vin不定CTxIn列表交易输入vout不定CTxOut列表交易输出nLockTime4uint32_t交易锁定时间交易输入CTxIn数据项大小(Byte)数据类型描述prevout不定COutPoint上一个交易的输出，由交易哈希和索引值确定scriptSig不定char[]解锁脚本nSequence4uint32_t序列号，可用于相对时间锁定交易输出CTxOut数据项大小(Byte)数据类型描述nValue8int64_t交易输出金额，单位为SatoshisscriptPubKey不定char[]锁定脚本，定义花费须满足的条件创币交易CoinbaseTransaction每一个区块内包含的第一条交易为CoinbaseTransaction，它作为对挖出该区块的矿工的比特币奖励交易。没有交易输入交易哈希为0输出的索引值固定，为0xffffffffBIP34规定增加一个4字节的height的字段，这个参数是必须的源码参考代码路径：https://github.com/bitcoin/bitcoin/blob/master/src/primitives/transaction.hCOutPut/** An outpoint - a combination of a transaction hash and an index n into its vout * ** 一个交易哈希值与输出下标的集合 */ class COutPoint { public: uint256 hash; //交易哈西 uint32_t n; //对应序列号 COutPoint(): n((uint32_t) -1) { } COutPoint(const uint256& hashIn, uint32_t nIn): hash(hashIn), n(nIn) { } ADD_SERIALIZE_METHODS; //用来序列化数据结构，方便存储和传输 template <typename Stream, typename Operation> inline void SerializationOp(Stream& s, Operation ser_action) { READWRITE(hash); READWRITE(n); } void SetNull() { hash.SetNull(); n = (uint32_t) -1; } bool IsNull() const { return (hash.IsNull() && n == (uint32_t) -1); } //小于号<重载函数 friend bool operator<(const COutPoint& a, const COutPoint& b) { int cmp = a.hash.Compare(b.hash); return cmp < 0 |…

RSA 算法
type: item
date: 2024-08-04T15:24:00+00:00
description: 公钥：e、n，私钥：d、n，加密：C=M^e % n，解密：M=C^d % n。其中：n=p*q（p和q为大质数），1<e<ϕ(n)，gcd(e,ϕ(n))=1，ed % ϕ(n)=1，M为信息，C为密文数论基础质数：又称素数，一个大于1的自然数，除了1和它自身外，不能被其他自然数整除的数模运算：求余运算，整除运算中，求a除以b的余数，可用mod表示，即r = a mod b同余：两个整数a、b，若它们除以正整数m所得的余数相等，则称a、b相对于模m同余，记作: a≡b(mod m)最大公因数：指两个或多个整数共有因数中最大的一个，a和b的最大公因数记作：gcd(a,b)互质：若N个整数的最大公因数是1，我们就称这N个整数互质，即gcd(a,b)=1，a和b互质欧拉函数：对于正整数n，小于n的正整数中与n互质的数的个数，记为ϕ(n)，特别的ϕ(1)=1欧拉定理：若两个正整数a和m互质，那么a的φ(m)次方除以m的余数为1，即a^ϕ(m)≡1(mod m)模反元素：如果两个正整数a和n互质，则一定可以找到整数b，使得a×b-1被n整除，或者说ab≡1(mod n)，称b为a相对于n的模反元素比如，3和11互质，那么3相对于11的模反元素就是4，因为(3 × 4)-1可以被11整除a^(ϕ(n)-1)为a相当于n的模反元素，因a^ϕ(n)≡1(mod n) => a^(1+ϕ(n)-1)≡1(mod n) => a×a^(ϕ(n)-1)≡1(mod n)同余相关性质若a≡b(mod m)，b≡c(mod m)，则a±c≡b±d(mod m)若a≡b(mod m)，b≡c(mod m)，则a×c≡b×d(mod m)若a≡b(mod m)，那么a^n≡b^n(mod m)若a≡b(mod m)，n为m因数,则a≡b(mod n)互质相关性质任意两个质数是互质数较小数是质数，较大数不为它的倍数，这两个数是互质数较大数是质数的两个数是互质数1和任意一个自然数是是互质数2和任何奇数是互质数相邻的两个自然数是互质数相邻的两个奇数是互质数欧拉相关性质ϕ(1)=1，ϕ(2)=1当n是质数时，ϕ(n)=n-1当p为质数时，k为自然数，那么ϕ(p^k)=p^k - p^(k-1)当a和b互质时，ϕ(ab)=ϕ(a)ϕ(b)，故当n是奇数时，ϕ(2n)=ϕ(n)任意一个大于1的正整数，都可以写成一系列质数的积只有p的倍数与p^k互质，共有p^(k-1)个，即1p、2p、3p...p^(k-1)p，把它们去除，剩下的就是与p^k互质的数了，即ϕ(p^k)=p^k - p^(k-1)算法选择两个大质数p和q计算n=p×q，计算欧拉函数ϕ(n)=(p-1)×(q-1)选择一个数e，满足：1<e<ϕ(n)，且e与ϕ(n)互质计算e相对于ϕ(n)的模反元素d，即ed≡1(mod ϕ(n))公钥为{e，n}，私钥为{d，n}加密：C=M^e(mod n)，解密：M=C^d(mod n)，M为信息，C为密文，M需小于nRSA签名可用私钥加密信息摘要，验证者用公钥解密签名，和给出的签名进行一致性判断 *大质数生成随机构造一个满足最终大质数长度的奇数n判断n是不是质数，如果是则输出n，否则n=n+2并重复此步骤使用质数定义判断，将n除以2到n的算术平方根之间的所有数，如果余数都不为0，则此数一定为质数使用素性检测算法（Fermat、Miller–Rabin等等），多次判断此数都为质数的情况下，则此数极大概率为质数查找互质数利用互质特性直接得出结果（两个相邻的自然数是互质数，较小质数与不是倍数的较大数互质）使用辗转相除法计算两个数的最大公约数，如果是1，则两数互质计算模反元素随机选择一个正整数k根据定义：a×b % n = 1，则a相对于n的模反元素b = (k×n + 1) / a快速幕模算法计算a^b%n(a<n)，如果a和b很大，可以使用同余的性质来快速计算结果根据同余性质，有(a × a) % n = (a%n × a%n) % n若b为偶数，则a^b%n = (a^(b/2)%n × a^(b/2)%n) % n若b为奇数，则a^b%n = (a^(b/2)%n × a^(b/2)%n × a) % n令b' = b/2，有a^(b/2)%n = a^b'%n故这里可以使用递归的方式计算a^b%n，不断将b除2，直到1为止安全性随机数：使用完全随机的算法，避免潜在的安全，如果随机数被预测，私钥就有可能被破解密钥长度：为了保持算法的安全性，必须选择足够大的密钥长度，最低需要1024位，推荐使用2048位参数选择：尽量不重复使用大质数p和q，也不要选择太大或太小的e和d证明证明：M=C^d mod n (C=M^e mod n, 0<M<n)C^d mod n 代…

以太坊 再质押
type: item
date: 2024-07-26T12:08:00+00:00
description: Restaking（再质押）是DeFi（去中心化金融）深化发展后的一种复杂产品形态，也是以太坊共识机制转PoS后才出现的新型金融衍生品。一、质押质押的概念出现于区块链的PoS共识机制（Poof of Staking，权益证明）。目前主要有两个主流的共识机制：PoW（Poof of Work，工作量证明）和PoS（Poof of Staking，权益证明）。区块链世界的鼻祖比特币就是采用的 PoW 共识机制。简单说，区块链相当于一个全球化的分布式账本，为了维护这个去中心化系统的运作，需要有人去算账和记账。以太坊区块链最开始也是采用的PoW共识机制，但是PoW也存在一些问题，比如消耗大量电力去计算数学题，没有产生任何对现实世界有价值的收益，而且出现了专门用来挖矿的设备以及具有规模化挖矿的矿场企业，趋向中心化了。因此后来出现了PoS共识机制（Poof of Staking，权益证明），就是想要获得记账权的人把代币质押到一个地方当作保证金，谁持有的代币更多和持有得更久，谁获得记账权的概率就越高，这样大家就不用消耗大量的算力来算没用的数学题了。质押就是让用户锁定一定资金作为保证金后成为节点，去维护项目的安全，从而赚取收益，若节点作恶则会罚没保证金。从技术视角看，质押是为了维持去中心化系统的自我运作PoW是通过算力占比来获得记账权；PoS是通过资产占比来获得记账权；从金融视角看，质押可以控制链上经济系统的货币发行PoW将代币直接奖励给矿工，矿工将链上资产换成现实世界资产买矿机，继续投入挖矿，实现了区块链世界和现实世界的融合；PoS将代币直接奖励给质押者，质押者通过质押资产获取了收益，质押资产变更了具有稳定收益率的 “国债”，衍生了各类金融玩法。质押方案独立质押：运行节点，成为质押者，需要32个ETH，这个是最基本的质押模式；质押即服务：运行节点很麻烦，需要一直在线，因此出现了质押即服务，同样需要32个ETH，但无需运行节点，将节点运作的工作委托给第三方运营商；联合质押32个ETH的门槛还是很高，因此出现了联合质押的平台，不需要32个ETH，每个人可以与其他人一起质押任意数量的 ETH，将节点运作委托给第三方；中心化交易所：使用联合质押的平台还是有一定门槛，用户需要懂得使用区块链应用，同时这类应用可能会存在合约风险，比如智能合约存在漏洞，被黑客攻击等等，因此出现中心化交易所帮助用户进行质押的需求，用户将资金完全交给交易所，交易所进行质押。这四种方案门槛是不断降低的，操作上也越来越简单，这样就可以触达更多的用户，当然，用户资产面临的风险也是越来越大的，越来越不受用户自己掌控。流动性质押（LSD）用户将资产质押了之后，资产就被锁在了链上，此时资金利用效率很低，因此出现了流动性质押平台（Liquid Staking Derivatives，LSD），比如Lido，当你质押了1个ETH，平台会1比1给你一个质押凭证，即1个stETH。这类流动性质押平台一般采用的是联合质押模式，用户可存入任意数量的ETH，帮助用户进行节点质押，用户可获得质押凭证，让用户可在DeFi中进行交易、借贷、提供流动性等操作，提升了资金使用效率。其实这可以类似银行存款，你将现金存到了银行，银行会给你一个存款凭证，然后你可以继续使用这个存款凭证做其他事情，比如交易、抵押借贷等。二、再质押除了区块链采用的PoS机制需要用户质押资产之外，很多项目也都需要Staking来保证项目安全，比如跨链桥、预言机、数据可用性层、零知识证明等。那么，每上线一个新项目，这个项目就需要用户锁定一定的资金，用户的流动资金就那么多，这就造成了不同项目之间的竞争。各个项目为了项目安全性不得不竞争市场上有限的流动资金，随着不同项目给出的质押收益率越来越高，项目自身承担的风险也越来越高，变成了一个恶性循环。另一方面，用户也只能把有限的资金选择有限的项目质押进去获得有限的回报，资金的利用率较低。随着公链、应用、各类项目越来越多，流动性也越来越割裂。因此，市场上出现了 “共享安全性” 的需求，需要有一个平台可以将用户质押的资产为多个项目提供安全性，这就是再质押（Restaking）出现的背景。类比现实世界，一些弱小的国家会引入强大国家的军事力量，自己则无需花费更多的资金构建自己专属的军事力量。目前安全性最强的PoS机制公链就是以太坊，以太坊上质押了大量的资金，具有极强的安全性，因此非常值得将以太坊的安全性共享给其他项目。另一方面，再质押可以为stETH这类质押凭证拓展了更多的应用场景，通过各类协议的可组合性，实现了以太坊生态的 “金融乐高”。再质押定义根据再质押出现的背景以及解决的问题，我们可以给一个再质押的定义：再质押的本质是建立一个共享质押池，从而实现共享安全性。这个共享资金池可以将一份资金同时为多个项目质押…

以太坊 交易类型
type: item
date: 2024-07-13T13:35:00+00:00
description: 以太坊作为一个不断发展的区块链平台，随着时间的推移引入了多个改进提案来提升其性能和用户体验，其交易的数据结构也在一直“进化”交易类型过去，以太坊的交易都采用同一种格式：RLP([nonce, gas_price, gas_limit, to, value, data, v, r, s])在EIP-2718（2021年4月15日柏林（Berlin)升级）改进协议中，定义了一种带交易类型的通用交易格式：TransactionType || TransactionPayload将上述字段连接（合并）起来，即可得到一个类型化交易。字段的定义是：TransactionType：0至0x7f范围内的某个值，最多可代表128种事务类型。TransactionPayload：由事务类型定义的任意一个字节数组。EIP-2718没有为交易的有效负载定义格式。因此，交易的有效负载可以是任意一段经过编码的字节序列，只要采用符合新的交易类型（如RLP、SSZ等）定义的编码器即可。之所以选择简单的字节相连方式，是因为读取字节数组的第一个字节非常简单，无需使用任何库或工具。新的交易类型最多可达0x7f种。选择这一上限是为了保证向后兼容传统交易。经过RLP编码的交易的第一个字节始终大于或等于0xc0，因此类型化交易永远不会与传统交易产生冲突，而且类型化交易和传统交易之间可以通过第一个字节来区分。以太坊目前的源代码中定义了四种交易类型：// Transaction types. const ( LegacyTxType = 0x00 AccessListTxType = 0x01 DynamicFeeTxType = 0x02 BlobTxType = 0x03 )Legacy交易Legacy交易是以太坊早期的交易类型，从链开始持续很长时间都是此类型的交易。特点：Gas价格（Gas Price）：用户设定的固定值，表示愿意为每个Gas单位支付的费用。Gas限额（Gas Limit）：用户愿意为交易支付的最大Gas数量。交易费用：由 Gas Price * Gas Used 计算得出。示例：{ "from": "0xSenderAddress", "to": "0xRecipientAddress", "value": "1000000000000000000", // 1 ETH in Wei "gas": 21000, "gasPrice": "20000000000" // 20 Gwei }AccessList交易EIP-2930（2021年4月15日柏林（Berlin)升级）改进协议，引入了访问列表（Access List）功能，以优化Gas费和提高交易效率。增加了以下格式的交易：0x01 || RLP([chain_id, nonce, gas_price, gas_limit, to, value, data, access_list, y_parity, r, s])特点：访问列表（Access List）：提前声明交易将访问的存储和合约地址，减少Gas费。Gas价格和Gas限额：与Legacy交易类似，但增加了访问列表字段。示例：{ "from": "0xSenderAddress", "to": "0xRecipientAddress", "value": "1000000000000000000", // 1 ETH in Wei "gas": 21000, "gasPrice": "20000000000", // 20 Gwei "accessList": [ { "address": "0xContractAddress", "storageKeys": ["0xStorageKey1", "0xStorageKey2"] } ] }DynamicFee交易EIP-1559（2021年8月5日伦敦（London)升级）改进协议，引入动态费用功能，旨在改善Gas费的预测和用户体验。增加了以下格式的交易：0x02 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, y_parity, r, s])特点：基础费用（Base Fee）：由网络动态调整，不会支付给矿工，而是被销毁。优先费（Priority Fee）：支付给矿工的费用，类似于小费，以激励矿工优先处理交易。最大费用（Max Fee）：用户愿意支付的最高费用，包括基础费用和优先费。示例：{ "from": "0xSenderAddress", "to": "0xRecipientAddress", "value": "1…

以太坊 历史
type: item
date: 2024-06-22T13:05:00+00:00
description: 说明以太坊区块链主要里程碑、分叉和更新的时间表分叉是区块链协议升级或修改，此时区块链会分成“两条链”，一条链继续使用旧的协议，另一条链则应用新的协议。如果协议向后兼容则为软分叉，否则为硬分叉（新协议可正常处理旧协议生成的区块）关键时间表2015年7月30日以太坊主网启动，开始公测，这个初始版本有诸多限制，在上面能做的事情很少，主要面向开发者。2016年3月14日家园分叉，包括若干协议修改和联网变更，相比初始版本来说稳定很多。2017年10月16日拜占庭升级，将区块挖矿奖励从5个以太币减少到3个以太币，修改完善虚拟机。2019年12月8日伊斯坦布尔分叉，优化了虚拟机中特定操作的燃料成本，添加CHAINID虚拟机指令2020年12月1日信标链启动，使用权益证明机制，未来将会替代以太坊的工作量证明机制2022年9月15日巴黎升级（合并），是以太坊历史上最重要的升级！结束了工作量证明挖矿算法及相关共识逻辑，使用信标链作为共识引擎，一个完整的节点包括执行客户端（原以太坊）和共识客户端。所有时间表2013年11月27日：发布白皮书2014年04月01日：发布黄皮书2014年07月22日：预售以太币2015年07月30日：发布第一个版本，前沿（Frontier）2015年09月07日：200,000区块高度，前沿解冻分叉2016年03月14日：1,150,000区块高度，家园（Homestead）分叉2016年07月20日：1,920,000区块高度，去中心化自治组织（DAO）分叉2016年10月18日：2,463,000区块高度，橘子口哨(Tangerine Whistle)分叉2016年11月22日：2,675,000区块高度，伪龙(Spurious Dragon)分叉2017年10月16日：4,370,000区块高度，拜占庭（Byzantium）升级2019年02月28日：7,280,000区块高度，君士坦丁堡（Constantinople）分叉2019年12月08日：9,069,000区块高度，伊斯坦布尔（Istanbul）分叉2020年01月02日：9,200,000区块高度，缪尔冰川（Muir Glacier）升级2020年10月14日：11,052,984区块高度，部署质押存款合约2020年12月01日：0纪元，信标链创世2021年04月15日：12,244,00区块高度，柏林（Berlin）升级2021年08月05日：12,965,00区块高度，伦敦（London）升级2021年10月27日：74,240纪元，天鹰座（Altair）升级2021年12月09日：13,773,000区块高度，箭形冰川（Arrow Glacier）升级2022年06月30日：15,050,000区块高度，灰色冰川（Gray Glacier）升级2022年09月06日：144,896纪元，Bellatrix升级2022年09月15日：15,537,394区块高度，巴黎（Paris）合并2023年04月12日：17,034,870区块高度（194,048纪元），上海嘉佩乐 (Shapella)升级，包括上海（Shanghai）升级和卡佩拉（Capella）升级2024年03月13日：19,426,587区块高度（269,568纪元），坎昆-天津四(Dencun)升级，包括坎昆（Cancun）升级和天津四（Deneb）升级参考链接：https://ethereum.org/zh/historyhttps://eips.ethereum.org/meta

cometbft改进协议
type: item
date: 2023-10-09T14:26:00+00:00
description: 改进CometBFT共识协议亮点在牺牲少部分中心化的情况下大大提高共识的速度无痛替换当前cosmos链的cometBFT共识模块开放更多的验证者参与共识过程双引擎异步工作，提高共识效率可以和当前的cosmos链进行跨链（如gaia）实现思路使用双共识引擎交叉协同工作，子引擎负责交易打包和执行，主引擎负责IBC跨链块的组装和最终块的生成实现方案约定指定质押最多的前N个节点作为子引擎的验证者（这里假设取500个）指定质押最多的前M个节点作为主引擎的验证者（这里假设取20个）两个引擎在一定程度上共享世界状态，但是区块有所不同主引擎共识的结果区块称为“主块”，子引擎共识的结果区块称为“子块”“子块”是一种中间块，不会直接存储，而是间接存储到“主块”中，从“主块”中可以恢复出所有“子块”子引擎工作流程选取一部分有效的交易Txn获取主引擎当前区块高度BH（同一个高度可以重复使用，避免等待主引擎出新块）优先选择主引擎块指定的11个验证者（如果有），否则从500个验证者中使用随机算法抽取11个验证者选择子引擎当前的世界状态T，执行交易，分发奖励和惩罚，得到新的世界状态T'11个验证者使用cometBFT共识出一个新的区块这里产生的是中间块，供主引擎打包使用子引擎区块内容包括正常cometBFT区块和主引擎区块高度主引擎工作流程：选择子引擎最新共识出来的区块列表（同一个高度可以重复使用，避免等待子引擎区块出新块），可以为空列表选择自上个主引擎区块打包的子引擎区块后新的的区块头列表和交易列表（为了避免产生的区块太大、可以只选择0-3个）20个验证者使用cometBFT共识出一个新的区块这里的世界状态等同于最新打包子引擎区块的世界状态主引擎区块内容包括正常cometBFT区块和子引擎区块头列表，交易列表为打包的子引擎区块列表的交易列表之和特性：可以各自出自己的块，不必等待另一个共识引擎工作的结果，主引擎可以以恒定速度出块（空块）子引擎相当于提前执行交易收集打包等工作流程，可以加快主引擎共识速度，同时也在一定程度上增加去中心化程度子引擎共识出的块头完全打包进了主引擎共识出来的块，可以从主引擎共识的块中还原出来的整个共识速度基本上取决于20个验证者，由于节点数量少，甚至可以达到2秒内子引擎共识卡块的解决方案随机的11个验证者可能出现故障导致不能出块，由主引擎重新随机新的11个验证者在一定时间内子引擎如果没有出块，那么主引擎会选择新的验证者，并将其写到区块头中子引擎将由新的11个验证者接管继续出块比如说主引擎连续打包了5个块时，都没有新的子块产生，那么将在第6个区块将指定新的11个验证者子引擎会识别主引擎的区块，并将最新主引擎的区块高度和哈希打包，此时可以识别新的验证者主引擎会打包子引擎的区块，并将最新的子引擎区块头列表打包，同时验证其有效性重要：不管子引擎怎么卡块和分叉，都由主引擎来修正和抉择、主引擎永不分叉流程图共识流程

Hardhat 框架
type: item
date: 2023-08-14T13:05:00+00:00
description: 一、简介Hardhat是以太坊合约开发环境，可以编辑、编译、调试和部署智能合约Hardhat是围绕任务和插件而设计的。每次从命令行运行Hardhat时，都相当于在运行一个任务。例如，npx hardhat compile运行内置编译合约任务。任务可以调用其他任务，从而完成复杂的工作流程二、入门操作系统：Linuxnode：20.5.0npm：9.8.1hardhat：2.17.11、初始化空白项目集成到已有项目可跳过此步骤创建示例目录后使用npm初始化mkdir example && cd example npm init -y2、集成hardhat安装hardhat工具npm install -D hardhat创建hardhat项目npx hardhat选择创建JavaScript项目，按照向导提示操作创建相关文件和安装基本hardhat插件初始化后的项目将包括以下文件：contracts：智能合约文件夹。test：合约测试文件夹。scripts：自动化脚本文件夹。hardhat.config.js：配置文件初始化时自动配置了一个示例合约，可以运行以下命令查看效果npx hardhat compile：编译智能合约npx hardhat test：执行合约测试npx hardhat node：启动一个虚拟的本地测试节点npx hardhat run scripts/deploy.js：运行部署合约脚本3、配置hardhat.config.js是hardhat的配置文件，此文件需要导出一个对象，对象可以包括defaultNetwork、networks、solidity、paths等多个配置选项，如果需要使用插件，则需要在此文件中导入申明，基本的配置文件内容如下/** @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: "0.8.19", };网络配置networks字段配置可用的hardhat网络，是一个可选对象。defaultNetwork字段配置hardhat运行时默认使用的网络，如果省略此配置，则其默认值为"hardhat"自定义网络可配置以下字段：url: 节点的连接地址。自定义网络需要此参数。chainId：可选的链id，用于验证Hardhat连接到的网络。如果不存在，则省略此验证。from：用作默认发送交易的地址。如果不存在，则使用节点的第一个帐户。accounts：此字段控制Hardhat使用哪些帐户。它可以使用节点的帐户（设置为"remote"）、本地帐户列表（设置为16进制的私钥数组）和HD钱包，默认为"remote"Hardhat内置了一个名为hardhat的特殊网络。当使用这个网络时将会自动创建，比如运行任务、脚本或测试智能合约时编译器配置solidity字段配置合约编译器，可选以下值之一：要使用的solc版本，例如"0.8.19"描述编译器配置的对象。它包含version字段和settings字段（编译器设置对象）目录配置paths字段配置hardhat的文件目录root：Harhat的根目录，默认值为hardhat.config.js所在的目录。sources：存储合约的目录，默认值为./contractstests：测试所在的目录,默认值为./testcache：用于缓存其内部内容的目录,默认值为./cacheartifacts：存储编译结果的目录，默认值为./artifacts示例配置文件require("@nomicfoundation/hardhat-toolbox"); module.exports = { defaultNetwork: "goerli", networks: { goerli: { url: "https://goerli.infura.io/v3/<key>", accounts: { mnemonic: "test test test test test test test test test test test test", }, } }, solidity: { version: "0.8.19", settings: { optimizer: { enabled: true, runs: 200 } } }, paths: { sources: "./contracts", tests: "./test" }, }更多内容参考hardhat官方文档三、进阶以一个暂存资产的合约为例，从头开始搭建项目1、初始化一个hardhat项目mkdir demo && cd demo npm init -y npm install -D hardhat2、创建ha…

cosmos 运行
type: item
date: 2023-07-05T13:48:00+00:00
description: 运行基于cosmos sdk开发的区块链程序一、环境操作系统：linuxgo版本：1.20.4以上ignite版本：0.27.1以上二、约定开发区块链应用程序可以参考文档ignite为了方便运行go语言程序，需要将目录$HOME/go/bin/加入到环境变量PATH里面可以在项目根目录运行ignite chain build命令来生成二进制程序（通常放到目录$HOME/go/bin/）为了方便解说，可以为区块链程序统一起个别名，例如：alias chaind=gaiad程序可以使用-h选项来查看更多配置参数，为了简单尽量使用了默认参数一般来说基于cosmos sdk开发的区块链，如果项目名称为appname，那么默认的程序和工作目录分别是appnamed和$HOME/.appname，默认的链id为appname三、节点配置1、初始化chaind init [moniker]命令创建节点工作目录，moniker是自定义的节点名称，生成默认配置文件、基础创世文件和随机节点密钥，目录主要包括以下文件├── config │ ├── app.toml # 应用程序相关的配置文件 │ ├── config.toml # CometBFT相关配置文件 │ ├── genesis.json # 创世文件 │ ├── node_key.json # p2p协议中用于节点身份验证的私钥 │ └── priv_validator_key.json # 在共识协议中用作验证节点的私钥 └── data # 节点使用的数据存储目录--home string：自定义工作目录--chain-id string：自定义创世文件中的链id--staking-bond-denom string：自定义质押币名称2、账户chaind keys add [name]命令创建新的密钥，name是密钥名称，可以重复执行创建多个不同的账户--keyring-backend string：自定义密钥后端，参考文档keyring--keyring-dir string：自定义密钥文件存放目录3、创世账户chaind add-genesis-account [address_or_key_name] [coin][,[coin]] 命令添加账户到创世文件中，address_or_key_name是之前创建的密钥名称或任意账户地址，coin是资产（例如1000个质押币1000stake），可以重复执行配置多个创世账户4、创世交易chaind gentx [key_name] [amount]命令构造并签名创世交易，key_name是之前创建的密钥名称，amount只能是质押币（至少是1000000000stake），交易内容是质押账户一定数量质押币来成为创世验证者--pubkey string：自定义节点公钥（默认由工作目录中priv_validator_key文件确定）--node-id string：自定义节点id（默认由工作目录中node_key.json文件确定）5、创世文件chaind collect-gentxs命令将创世交易写入到创世文件中，所有验证者签署交易后，由其中一个收集齐全后执行生成最终的创世文件--gentx-dir string：自定义创世交易目录6、启动节点chaind start命令将启动区块链节点，如果在一台电脑上运行多个节点需要分配端口避免端口冲突--home string：自定义节点工作目录--p2p.laddr string：默认tcp://0.0.0.0:26656--rpc.laddr string：默认tcp://127.0.0.1:26657--grpc.address string：默认0.0.0.0:9090--grpc-web.address string：默认0.0.0.0:9091--rpc.pprof_laddr string：默认0.0.0.0:6060--p2p.persistent_peers：持久的对等节点（逗号分割，ID@host:port）--p2p.seeds：种子节点（逗号分割，ID@host:port）除了通过命令行设置参数，也能通过修改节点配置文件（工作目录中的config/config.toml文件），例如：# persistent_peers = "[validator_address]@[ip_address]:[port],..." persistent_peers = "58811401b7b84caebea3cf674577a879dc53fdb1@127.0.0.1:26656"7、查询chaind tendermint show-validator：节点公钥chaind tender…

cosmos 白皮书
type: item
date: 2023-05-16T15:17:00+00:00
description: Cosmos分布式账本网络介绍开源的生态系统、去中心化的文件共享、以及公共的加密货币，这一系列技术的成功使人们启发和理解，去中心化的互联网协议是可以从根本上改善社会经济基础架构的。我们已经见识过个有专长的区块链应用，诸如比特币[1]（加密货币），ZCASH [2] (隐私加密货币)，也看到了例如以太坊 [3] 的大众智能合约平台，还有无数基于 EVM (以太坊虚拟机)开发的分布式应用，例如 Augur（预测市场）和 TheDAO [4] （投资俱乐部）然而，迄今为止，这些区块链已经暴露了各种缺陷，包括总体能效低下，性能不佳或受到限制和缺乏成熟的治理机制。为了扩大比特币交易吞吐量，已经研发了许多诸如隔离见证 [5]（Segregated-Witness）和 BitcoinNG [6]（一种新的可扩展协议）这样的解决方案，但这些垂直扩展解决方案仍然受到单一物理机容量的限制，以确保完整的可审计性。闪电网络 [7] 可以通过部分交易完全记录在主链账本外来扩展比特币的交易容量，这种方法十分适用于微支付和隐私保护支付通道，但是无法适用于更通用的扩展需求。理想的解决方案是允许多个并行的区块链交互操作的同时保持其安全特性。事实证明，采用工作量证明很难做到这一点，但也并非不可能。例如合并挖矿，允许在工作完成的同时，确保母链在子链上被重复使用，但交易必须通过每个节点依次进行验证，而且如果母链上的大多数哈希算力没有积极地对子链进行合并挖矿，那么就容易遭受到攻击。关于可替代区块链网络架构的学术回顾 将在附件中展示，我们也会在相关工作中对其他（技术）方案和缺陷进行概括。这里我们要介绍的 Cosmos，一个全新的区块链网络架构，能够解决所有这些问题。Cosmos 是由许多被称之为“分区”的独立区块链组成的网络。分区在 Tendermint BFT [8]的支持下运行，Tendermint BFT 是一个类似拜占庭容错安全共识引擎，具有高性能、一致性的特性，并且在严格的分叉追责 机制下能够制止恶意破坏者的行为。Tendermint BFT 的拜占庭容错共识算法十分适合用于扩展权益证明(PoS)机制下的公共区块链。使用其他共识模型的区块链, 包括类似基于权益证明(PoS)的以太坊，以及比特币也能够通过使用适配分区被 Cosmos 网络连接。Cosmos 的第一个分区称之为 Cosmos 枢纽。Cosmos 枢纽是一种多资产权益证明加密货币网络，它通过简单的治理机制能够对网络进行适配和升级。此外，Cosmos 枢纽可以通过链接其他分区来实现扩展。Cosmos 网络的枢纽及各个分区可以通过区块链间通信（IBC）协议进行通信，这种协议就是针对区块链的虚拟用户数据报协议（UDP）或者传输控制协议（TCP）。代币可以安全、快速地从一个分区转到其他分区，而无需在两个分区之间拥具有汇兑流动性。相反，所有跨分区的代币转移都会通过 Cosmos 枢纽，以此来追踪记录每个分区持有代币的总量。这个枢纽会将每个分区与其他故障分区隔离开。因为每个人都可以将新的分区连接到 Cosmos 枢纽，所以分区将可以向后兼容新的区块链技术。利用 Cosmos 可以实现区块链间的互操作。这是一个具有潜力的有价值的互联网络，其中的资产由不同的验证人发布和控制，并可以在不依靠需要信任的第三方的情况下实现跨链资产无缝的转移和交易。Tendermint在这一部分我们将阐述 Tendermint 共识协议和用于建立其应用程序的接口。 更多信息，请参见附录验证人在经典的拜占庭容错算法中，每个节点有相同的权重。在 Tendermint，节点有着不同数量（非负）的 投票权，而那些拥有相当数量投票权的节点称之为 验证人。验证人通过广播加密签名、投票或者对下一个区块表决同意来参与共识协议。验证者的投票权是一开始就确定好了，或者根据应用程序由区块链来决定修改投票权。例如，在像 Cosmos 枢纽的权益证明应用里，投票权可由绑定为押金的代币数量来决定。注意：像 ⅔ 和 ⅓ 这样的分数指的是占总投票权的分数，而不是总验证人，除非所有验证人拥有相同权重。而>⅔ 的意思是"超过 ⅔ "，≥⅓ 则是"⅓ 或者更多"的意思。共识Tendermint 是部分同步运作的拜占庭容错共识协议，这种协议源自 DLS 共识算法 [20]。Tendermint 以简易性、高性能以及分叉问责制而著称。协议要求这组验证人固定且被熟知，并且每个验证人都有其公钥验证身份。这些验证人试图同时在一个区块上达成共识，这些区块是一系列的交易记录。每个区块的共识轮流进行，每一轮都会有个领头人，或者提议人，由他们来发起区块。之后验证人分阶段对是否接受该区块，或者是否进入下一轮做出投票。每轮的提议人会从验证人顺序列表中按照其投票权比例来选择确定。更多协议的全部细节，…