Terra 是基于 Cosmos 框架搭建的一个区块链协议,Terra 协议是算法稳定币的 去中心化 和开源公共区块链协议,Terra 协议结合了公开市场套利激励和去中心化的 Oracle 投票,创建了能够持续跟踪任何法定货币价格的稳定币。
Terra 是基于 Cosmos 框架搭建的一个区块链协议,Terra 协议是算法稳定币的去中心化和开源公共区块链协议,Terra 协议结合了公开市场套利激励和去中心化的 Oracle 投票,创建了能够持续跟踪任何法定货币价格的稳定币。用户可以在 Terra 链上消费、交易或交换 Terra 稳定币,而Luna 提供持有者质押奖励和治理权。Terra 生态有三个主要产品存在,分别是以 LUNA 为基础的稳定币协议、合成资产交易平台 Mirror Protocol 以及DeFi 储蓄协议 Anchor。
Terra 协议由 Terra 和 Luna 两个代币组成。
稳定币是 Terra 协议的主要特征:跟踪基础货币价格的加密资产。作为一种数字货币形式,Terra 稳定币可以像法定货币一样使用 ,并具有区块链的额外好处:不可篡改的去中心化账本、即时的清结算、费用更低。目前 Terra 发行量较大的稳定币是 UST、KRT、SDT 和 MNT,其中 UST 是美元稳定币,KRT 是韩元稳定币、SDT 是 SDR(国际货币基金组织特别提款权)稳定币,MNT 是蒙古图格里克稳定币。
Terra 稳定币是算法稳定币,但并没有使用超额抵押 BTC、ETH 加密资产的方式或使用美元类似的支撑资产来锚定币价,而是由 Terra 的系统代币 LUNA 进行控制。Terra稳定币可以与 LUNA的美元价值1:1兑换,并通过套利机制调节稳定币价格,使稳定币保持锚定。举例如下:
除了降低稳定币的波动程度,验证者与委托人还通过质押LUNA来获取奖励。
验证者是 Terra区块链的矿工。他们负责保护 Terra 区块链并确保其准确性。验证者运行称为完整节点的程序,允许他们验证在 Terra 网络上进行的每笔交易。验证者提出区块,对其有效性进行投票,并将每个新区块添加到链中,以换取交易费用奖励。用户可以将他们的 Luna 质押给验证者,以换取质押奖励。验证者在 Terra 协议的治理中也发挥着重要作用。
Terra 区块链是一个权益证明区块链,由Cosmos SDK提供支持,并由称为 Tendermint 共识的验证系统保护。
以下过程解释了 Tendermint 共识是如何工作的。
质押是将 Luna 绑定到验证者以换取质押奖励的过程。
Terra 协议只允许排名前 130 的验证者参与共识。验证者的排名取决于他们的股份或绑定到他们的 Luna 总量。尽管验证者可以将 Luna 与自己绑定,但他们需要从委托人那里获得更多的股份。拥有越多 Luna 的验证者越会被频繁地被选中,来提出新区块并按比例获得更多奖励。
委托人是希望在不运行完整节点的情况下从共识中获得奖励的用户。任何质押 Luna 的用户都是委托人。委托人将他们的 Luna 抵押给验证者,增加验证者的权重或总抵押。作为回报,委托人会收到一部分交易费用作为质押奖励。
Terra station 是 Terra 区块链的官方钱包。
URL: https://docs.terra.money/docs/learn/terra-station/README.html
Testnet Faucet:https://faucet.terra.money/
Wormhole是Terra的推荐使用的跨链桥,支持Token和Nft的跨链,目前支持Avax、Oasis、BSC、ETH、Polygon、Solana、Terra链之间的资产跨链。Wormhole 不是直接交换或转换资产,而是将源资产锁定在智能合约中,并在目标链上铸造新的 Wormhole Wrap资产。
URL:https://portalbridge.com/#/transfer
Coins:原生币,包括Luna、KRT、UST、MNT、SDT等。
Tokens:ERC20,包括bLuna、mBTC、mBABA(阿里巴巴股票)、mMSFT(微软股票)
URL:https://app.terraswap.io/swap
去中心化Dex,包含Swap功能,支持Coin和Coin兑换、Coin和Token兑换、Token和Token兑换。
Terrain 是一个 Terra 开发环境,能够帮助简化开发和部署过程。Terra合约采用Rust语法编写,Rust 是用于 CosmWasm 智能合约的主要编程语言,虽然 WASM 智能合约理论上可以用任何编程语言编写,但 CosmWasm 库和工具最适合使用 Rust。
需要添加wasm32-unknown-unknown
编译目标
rustup default stable
rustup target add wasm32-unknown-unknown
然后,安装cargo-generate
,需要它来通过模板引导新的 CosmWasm 智能合约。
cargo install cargo-generate --features vendored-openssl
接下来,安装cargo-run-script
,这是优化智能合约所必需的。
cargo install cargo-run-script
npm install -g @iboss/terrain
Terrian可以和LocalTerra搭配使用,LocalTerra类似于以太坊的Ganache,可以在本地搭建Terra私链,用于测试。也可以直接连接Terra Testnet进行测试。
terrain new my-terra-dapp
cd my-terra-dapp
npm install
配置发送交易的私钥,在keys.terrain.js中进行配置。
module.exportns = {
bombay: {
mnemonic: "PLACE_YOUR_BOMBAY_SEED_PHRASE_HERE",
}
};
terrain deploy counter --signer bombay --network testnet
deploy命令将自动执行:
Mirror Protocol 是一个合成资产平台,合成资产可以让用户在不实际持有标的资产的情况下接触到各种不同的资产,其中包括美元或日元等法定货币、黄金和白银等大宗商品,以及指数基金或其他数字资产。比如投资者想购买价值1000美元的谷歌股票,合成资产平台会将用户1000美元的比特币与谷歌的股票价值挂钩。如果谷歌股票升值或贬值,该用户合约中的比特币数量就会进行同等价值的增减。
Mirror Protocol 可以铸造、交易股票、期货、交易所基金等资产的合成代币。用户通过 Mirror Protocol 可以直接交易全球各种资产,目前已经上线了 14 个合成资产,包括苹果、阿里巴巴股票。
Mirror 内合成资产的铸造主要是通过 UST 进行的,在铸造时也可以选择其他已有合成资产进行铸造。UST 铸造最低抵押比率最低为 150%,其他合成资产铸造最低抵押比率为 200%。
URL:https://mirrorprotocol.app/#/trade
Anchor 是一个去中心化储蓄协议,其目标是将 UST 存款人的年化收益率长期维持在 20%左右。本质上是一个货币市场借贷协议,该货币市场是一个 Terra 稳定币 UST 的资产池,存款人存入 UST 在该池中可获得稳定的 UST 利率收益。贷方则可抵押各类 PoS 共识区块链协议的基础资产代币,借出 Terra 稳定币 UST,同时支付以 Terra 稳定币 UST 计价的借款利息。此时,系统会根据供求关系的算法确定借贷利率。
由于市场供求关系是变动的,且在加密货币市场这种变动更大,因此,以这种方式是无法维持稳定的利率。
解决方法是存款人利息收益由两部分组成,其一是借款人支付的以稳定币 UST 计价的借款利息,该利率基于市场供求关系动态变化,因此是不稳定的,为了维持稳定, Anchor Protocol 在系统中引入了另一种收入来源,即贷方抵押的加密资产所赚取的区块奖励,并通过动态调整该奖励收益给借款人和出借人,实现锚定利率(Anchor Rate)。
URL:https://app.anchorprotocol.com/
Terra的合约是用Rust编写的,并编译成Wasm二进制文件,部署在Terra链上。
Terra 合约能够通过 Terra 的原生 LevelDB 存储数据,即合约本身可以存储数据,而不像 Solana 合约,需要将数据存储在账户中。在Terra的持久化存储中,只能保存数据的原始字节,因此任何类型数据都需要实现一对序列化与反序列化函数,比如一个用户结构体对象,在Terra链上需要以字节的形式存储,就需要提供一个序列化函数将用户对象编码成字节,并且需要提供一个反序列化函数,将用户字节数据解码成方便调用的结构体对象。
在编写Terra合约时,需要实现3个接口函数:
instantiate()
:在合约实例化期间调用以提供初始状态的构造函数execute()
:当用户想要调用智能合约写入数据时被调用query()
:当用户想要从智能合约中获取数据时被调用Terra合约的部署与以太坊合约不同,被拆分为2个步骤,1是将合约代码上传,2是实例化合约。这样做的目的是为了部署多个具有不同初始化参数,但业务代码相同的合约。
合约编写完毕后,需要构建合约。进入合约目录下,运行
cargo wasm
如果提示
error: no such subcommand: `wasm`
则输入
cargo install cargo-wasm
生成target/wasm-unknown-unknown
目录下,存有编译后的*.wasm文件的。编译 WASM 完成后,还需要确保输出的 WASM 二进制文件尽可能小,以最大限度地减少费用并保持在区块链的大小限制之下。在 Rust 智能合约的项目文件夹的根目录中运行以下命令。
cargo run-script optimize
Terra合约具有账户的概念,可以像个人账户一样接收Coin和Token。当向合约转Coin时,调用的是MsgSend方法,当向合约转Token时,调用的是MsgExecuteContract。
CW20 是基于 CosmWasm 的ERC20规范。Terra的Token实现了此规范。规范中包含多个部分:
主要处理账户的余额及转账。
Transfer{recipient, amount}
- 将amount从 info.sender 帐户转移到recipient帐户。这个方法用于向个人账户转账,如果转账的对象是合约,不会触发任何操作。
Send{contract, amount, msg}
- 将amount从 info.sender 账户转移到合约账户。 contract 必须是实现 Receiver 接口的合约地址。 msg 将与amount一起传递给接收方合约。
Burn{amount}
- 从 info.sender 的余额中销毁amount数量的Token,并将 total_supply 减少相同的数量。
Balance{address}
- 返回给定地址的余额。返回类型是 BalanceResponse{balance}。
TokenInfo{}
- 返回合约的代币信息。返回类型为 TokenInfoResponse{name, symbol, decimal, total_supply}。
Send 的对应部分是 Receive,想要接受 CW20 代币的合约都必须实现该方法。
Receive{sender, amount, msg}
- 用于处理发送消息。合约地址存储在 info.sender 中,因此无法伪造。合约应确保发送者与它期望处理的代币合约相匹配,而不是允许任意地址Token转入。sender 是请求转移Token的帐户,而 msg 是可以解码为特定于合约的 message 的二进制数据。如果我们只有一个默认操作,这可以是空的,或者它可能是一个 ReceiveMsg 变体来阐明意图。例如,如果我发送到一个 uniswap 合约,我可以使用该字段指定我想要交换哪个代币。
合约允许用户将他们的部分Token委托给其他账户处理。但这个功能不像在 ERC20 里那么重要,因为我们使用 Send/Receive 将Token发送到合约,而不是用Approve/TransferFrom。但它仍然是一个很好的用例,你可以看到 Cosmos SDK 如何为原生代币添加支付限额。这主要是为了提供对其他基于公钥的帐户的访问。
increaseAllowance{spender, amount, expires}
- 设置或增加限额,以便 spender 可以从 info.sender 帐户访问最多 amount + current_allowance Token。还可以选择附带一个到期时间,设置了可以使用批准额度的限制(按时间或高度)。
DecreaseAllowance{spender, amount, expires}
- 减少或清除授权,以便 spender 可以访问来自 info.sender 帐户的 current_allowance - amount Token。这可以选择附带一个到期时间,设置了可以使用批准额度的限制(按时间或高度)。如果amount >= current_allowance,这将收回授权。
TransferFrom{owner, recipient, amount}
- 这使用授权转账,如果 info.sender 有一个有效的、未过期的批准,那么我们将 amount Token 从 owner 转移到recipient,并从可用allowance 中扣除 amount.
SendFrom{owner, contract, amount, msg}
- SendFrom 目的是发送,TransferFrom 目的是转移。这允许预先批准的帐户不仅可以转移代币,还可以将它们发送到另一个合约以触发给定的操作。注意 SendFrom 会将 Receive{sender} 设置为 info.sender(触发转移的帐户)而不是 owner 帐户(资金来源帐户)。
BurnFrom{owner, amount}
- 这与 TransferFrom 类似,但会销毁Token而不是转移它们。这将减少 owner 的余额、total_supply 和调用者的 allowance。
Allowance{owner,spender}
- 这将返回 spender 可以从 owner 帐户访问的可用 allowance,以及到期信息。返回类型是 AllowanceResponse{balance, expiration}。
这允许另一个合约铸造新的代币,可能有一个上限。这里只指定了一个minter,如果需要更复杂的访问管理,请使用multisig或其他合约作为minter地址并在那里处理更新ACL。
Mint{recipient, amount}
- 如果 info.sender 是允许的铸币者,这将创建 amount 数量新 Token(更新 total_supply )并将它们添加到 recipient 的余额中,只要它不超过上限。
Minter{}
- 返回可以铸造的对象和数量。返回类型是 MinterResponse {minter, cap}。上限可能未设置。
如果设置了上限,它定义了可以铸造的最大 total_supply 数量。如果初始供应量为 1000,上限为 Some(2000),则只能再铸造 1000 个代币。
允许在Token上附加更多元数据,以帮助在钱包中显示 Token 的其他附属信息,比如logo、website等。
UpdateLogo{ url | embedded }
- 如果 info.sender 是允许的 marketing 帐户,这将设置一个新的 URL,或允许他们上传一个小的(小于 5KB)SVG 或 PNG 的图标。
UpdateMarketing{project, description, marketing}
- 如果 info.sender 是允许的 marketing 帐户,这将更新合约上一些与 marketing 相关的元数据。
MarketingInfo{}
- 返回与 marketing 相关的元数据。返回类型是 MarketingInfoResponse {project, description, logo, marketing}。
AllAllowances{owner, start_after, limit}
- 返回给定所有者的所有未过期 allowance 的列表。 start_after 和 limit 提供分页。
AllAccounts{start_after, limit}
- 返回已在合约上创建的所有帐户的列表(仅是地址)。 start_after 和 limit 提供分页。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!