毕设07 - Cosmos 简介与 Cosmos SDK 模块详解

| 笔记 | 4617 | 12分钟 | 毕设Cosmos区块链

截止目前,已经成功在 optee 中运行 wasm 程序。

接下来要尝试怎么用 wasm 实现智能合约。

技术选型为 Cosmos。

1 Cosmos 介绍

https://zhuanlan.zhihu.com/p/59651447

待补充,先进行代码的实验。

2 其他工具

Ignite CLI

Ignite 是一个用于快速构建基于 Cosmos SDK 的区块链应用的开发工具。它提供了从模板生成、模块添加、代码生成到应用部署的一整套功能,帮助开发者简化开发流程。

3 Cosmos SDK 模块详解

1 staking

用于实现权益委托证明(PoS)公式机制。Pos 取代的是工作量证明(PoW)机制。对区块的证明不再使用大量的计算——挖矿来实现,而是让用户把自己的代币(Token)作为质押,以获得验证资格。

1.1 PoW 与 PoS 的对比

PoW(Proof of Work,工作量证明):

  • 产生一个新的区块的过程依赖于矿工的计算能力(算力)。
  • 矿工通过大量计算,寻找一个符合难度目标的哈希值(例如开头为多个零的哈希值,常用的是 SHA-256)。这一过程称为“挖矿”。
  • 一旦矿工成功找到符合条件的哈希值,就将这个新的区块及其哈希值提交到区块链网络。
  • 网络会验证该哈希值,若有效,则将区块加入主链,且矿工获得奖励(通常是代币奖励和交易手续费的组合)。

PoS(Proof of Stake,权益证明):

  • 用户通过质押代币来获得验证资格,质押的代币越多,被选为验证人的机会越大。
  • 当一个新的区块产生时,系统会从有验证资格的用户(验证人)中选择一个或多个用户来验证和打包该区块。
  • 验证人在验证区块后,将区块信息发送至网络。
  • 一旦区块得到确认,验证人获得奖励,通常以质押的代币奖励形式。

1.2 关键概念

  • 验证人(Validators)

    • 验证人是运行节点并负责验证区块的用户。
    • 需要将自身或其他用户委托的代币作为抵押来获得验证资格。
    • 验证人会根据所抵押的代币数量来竞争进入“活跃验证人集合”,即质押的代币越多越容易被选中。
    • 验证人需要保持节点的高可用性和诚实性,若出现双签、宕机等情况会受到惩罚。
  • 委托人(Delegators)

    • 委托人是持有代币的用户,可以将代币委托给他们信任的验证人,以参与网络的共识过程。
    • 委托人将代币交给验证人后,便与验证人共同承担网络的安全性责任。验证人获得的奖励和惩罚也会按照比例分配给委托人。
    • 委托人有权选择撤回委托(即“解锁”),但是解锁过程通常需要经过一个解锁期,防止系统因频繁的资金移动而失稳。
  • 抵押和解锁机制(Bonding and Unbonding)

    • 当用户(无论是验证人还是委托人)将代币锁定在 staking 模块中时,这些代币即被抵押。抵押的代币使验证人有资格进入活跃验证人集合。
    • 抵押的代币要解除时会经历一个“解锁期”(通常为几周),在这期间用户无法动用这部分代币。解锁期可以防止网络因大量代币突然解锁而失去安全性。
  • 奖励分配(Reward Distribution)

    • staking 模块与分配奖励的 distribution 模块协同工作,为验证人和委托人分配奖励。
    • 验证人可以设置佣金费率(即奖励的某一比例作为其运营费用),其余部分则分配给委托人。
    • 奖励的来源通常是区块链的通胀部分(增发代币)或交易手续费。
  • 惩罚机制(Slashing)

    • 为保障网络的安全,staking 模块配合 slashing 模块引入了惩罚机制,旨在对不诚信或表现不佳的验证人进行惩罚。

    • 常见的惩罚行为有双签(Double Signing)和宕机(Downtime)。

      双签的例子:

      假设区块链网络发生了短暂分叉。验证人 A 在区块高度 100 签署了区块 A_100。与此同时,网络中的另一部分在同一高度 100 也签署了另一个区块 B_100。

      如果验证人 A 无意中在网络恢复后又对 B_100 进行了签名,网络就会记录到验证人 A 在高度 100 发生了双签。

  • 治理(Governance)参与

    • staking 模块中的验证人和委托人都有权参与链上治理,即投票表决提案。这些提案可能包括升级链的参数或添加新功能。
    • 委托人通常会继承他们所选择的验证人的投票意向,但也可以自主投票,确保自身权益得到更好保障。

1.3 BFT 与 staking

  • 他们并不是同一层级的概念,BFT 共识协议在 Tendermint 的共识层中实现。
  • staking 机制作用于验证人选拔和激励层,决定哪些验证人可以参与共识,并通过奖励和惩罚保障验证人的行为。
  • BFT 共识作用于共识层,解决已选出的验证人如何就区块内容达成一致的问题。

2 bank 模块

Cosmos SDK 的 bank 模块是一个核心模块,专门用于在账户之间实现可替代代币(fungible tokens)的转账。该模块提供了基本的代币管理功能,包括发送、接收、查询余额等,是 Cosmos SDK 应用中资金流转的基础。以下是 bank 模块的详细介绍:

2.1 模块概述

  • bank 模块负责管理账户中的可替代代币(如 Cosmos 的 ATOM 或应用链自定义的代币)。
  • 提供了基本的转账功能,允许账户之间进行代币转移。
  • 支持自定义多个代币(多资产)和配置转账权限(如黑名单、白名单等)。

2.2 主要功能

  • 转账(Transfers):实现账户之间的代币转移,并通过权限控制(如 send_enabled)设置哪些代币可以进行转账。
  • 查询余额(Balance Queries):允许查询指定账户的代币余额,并支持查询所有代币余额。
  • 多资产支持(Multi-Asset Support):支持在链上创建和管理多个类型的代币,每种代币都可以独立操作。

2.3 账户类型

  • Cosmos SDK 的 bank 模块将每个账户的代币余额存储在账户模块(auth)的 Account 对象中。每个账户有一个唯一的地址和一个与之关联的余额。
  • 账户类型通常有:
    • BaseAccount:标准账户,用于存储基本的余额和公钥信息。
    • ModuleAccount:模块账户,通常用于协议或模块操作的资金池,比如治理模块的储备资金。

2.4 转账权限控制

  • bank 模块允许设置特定代币的转账权限,主要用于控制哪些代币可以转账、是否暂停某类代币的转账等。
  • 通过 SendEnabled 配置参数,可以启用或禁用某种特定代币的转账功能。这对于防止恶意代币或临时冻结某些代币具有重要意义。

2.5 关键操作流程

  • 发送代币流程
    • 用户通过提交 MsgSend 消息请求发送代币。
    • bank 模块验证发送者的余额是否充足,并确保接收者的地址有效。
    • 代币成功从发送者账户转移到接收者账户,事件系统记录该转账事件。
  • 批量转账流程
    • 用户通过提交 MsgMultiSend 消息请求多个账户之间的批量转账。
    • 模块会验证所有发送方的余额是否足够,并在验证成功后批量执行转账操作。

2.6 与其他模块的交互

  • bank 模块通常会与以下模块交互:
    • auth 模块:管理账户结构及其权限,与 bank 模块协作存储和读取账户的余额信息。
    • staking 模块:当用户将代币抵押给验证人时,这些代币会从 bank 模块中“冻结”,不可转账,形成一种账户余额的“锁定”状态。
    • distribution 模块:用于将奖励分配给验证人和委托人,资金通过 bank 模块进行流转。

3 gov

3.1 模块概述

  • gov 模块是一个链上治理系统,允许任何代币持有者发起提案,并通过社区投票来决定提案是否通过。
  • 主要功能包括提案创建、投票过程、提案生效与否的判定等。
  • gov 模块使区块链变得更具弹性和适应性,代币持有者可以直接参与协议的变更。

3.2 提案类型

gov 模块支持多种提案类型,每种类型对应链上不同的管理事项:

  • 文本提案(Text Proposal):仅供讨论和表决的提案,没有直接操作链上参数的权限,通常用于提出改进建议或社区讨论。
  • 参数变更提案(Parameter Change Proposal):提议修改链上的参数配置(如交易费用、质押参数等),通过后自动更新链上参数。
  • 软件升级提案(Software Upgrade Proposal):提议进行链上软件升级。通过后链上的升级模块会执行更新。
  • 社区资金提案(Community Pool Spend Proposal):提议从社区资金池中提取资金,支持对某些项目或社区活动进行资助。

3.3 提案生命周期

  • 提交提案:用户提交提案并支付一定数量的代币作为押金,押金可防止垃圾提案泛滥。若提案未通过押金将被扣除。
  • 存款阶段(Deposit Period):提案需要达到一定的存款门槛(通常是由其他用户补充押金),才能进入投票阶段。
  • 投票阶段(Voting Period):提案进入投票阶段后,所有有投票权的代币持有者都可以对其进行投票。
  • 投票结果:在投票阶段结束后,系统根据预设的通过标准判断提案是否通过。
  • 提案结果执行:若提案通过,则根据提案的类型执行相应操作;若未通过,则押金会被退还或销毁。

3.4 投票机制

gov 模块允许所有拥有投票权的代币持有者对提案进行投票。投票方式通常包括以下几种:

  • Yes:赞成提案。

  • No:反对提案。

  • NoWithVeto:强烈反对提案并主张否决,若此选项票数达到一定比例,提案将被直接拒绝,且押金会被销毁。

  • Abstain:弃权,表示中立意见,弃权票不影响提案通过率的计算。

  • 通过标准:提案的通过率由参数控制,通常包括最低投票参与率、赞成票占比等。只有满足这些标准,提案才会被视为通过。

3.5 存款机制

  • 提案发起时需要支付一定数量的押金(Deposit),押金的数量和形式由治理参数决定。
  • 如果提案未达到存款门槛,提案将不会进入投票阶段;未达到存款门槛的提案在一定时间后会被自动关闭,押金返还。
  • 若提案被否决或否决比例超过特定标准,押金可能会被销毁,以减少恶意提案的产生。

3.6 与其他模块的交互

  • bank 模块:在用户支付提案押金、提取社区资金等操作时,需要与 bank 模块交互来转移代币。
  • distribution 模块:在社区资金提案通过后,gov 模块会调用 distribution 模块以分配社区资金。
  • staking 模块:治理模块与 staking 模块交互,以决定未投票用户的投票意向是否与其所委托的验证人一致。

3.7 提案流程示例

  • 用户创建一个新提案并支付最小押金。
  • 其他用户可以为该提案增加押金,直到达到最低存款要求。
  • 达到要求后提案进入投票阶段,代币持有者在 VotingPeriod 内可以对提案进行投票。
  • 投票结束后,系统依据投票结果判断提案是否通过,并触发相应的操作(如更改参数、升级软件等)。

4 slashing

5 distribution

6 auth