Разработка смарт-контрактов Terra

Узнайте, как разрабатывать смарт-контракты и развертывать их в сети блокчейнов Terra для создания децентрализованных приложений.

Создание собственных смарт-контрактов существует с момента появления Web 3, что позволяет людям создавать программы для развертывания в блокчейне.

Блокчейны, которые развертывают смарт-контракты, варьируются от Ethereum до Bitcoin и не только. Кроме того, смарт-контракты работают вместе для создания децентрализованных приложений, которые можно разрабатывать на таких платформах, как Truffle, Hardhat и Embark.

В этой статье мы рассмотрим, как мы можем разработать смарт-контракты и развернуть их в сети блокчейнов Terra, которая похожа на Ethereum.

Базовый обзор Terra

Перед тем, как продолжить чтение, следует обратить внимание на несколько вещей о Terra:

  • Смарт-контракты, развернутые в блокчейне Terra, написаны на Rust.
  • наша локальная тестовая сеть - LocalTerra
  • Terra.js и Terra SDK - две доступные библиотеки, используемые для взаимодействия с блокчейном Terra.
  • Terra был создан Terraform Labs

Также обратите внимание, что консенсус Terra - это алгоритм доказательства ставки с использованием Tendermint BFT. Это позволяет держателям ставить свои токены в качестве обеспечения для проверки транзакций. Награды выдаются позже в соответствии с количеством поставленных токенов.

Также важно знать, что LUNA - это криптовалюта Terra, которая используется для работы блокчейна с подтверждением доли владения. Этот блокчейн обеспечивает стабильность цен за счет алгоритмического расширения и сокращения предложения.

Чтобы понять больше, я предлагаю вам прочитать документацию здесь . Наша основная цель в этой статье - это то, как мы можем развернуть наш смарт-контракт в этом протоколе блокчейна.

И, наконец, блокчейн Terra может похвастаться сильным и действенным механизмом консенсуса, который завершает пакеты транзакций за секунды - быстрее, чем Биткойн и Эфириум .

Требования и основы разработки

Давайте посмотрим на требования, необходимые для создания и развертывания смарт-контрактов с использованием протокола Terra:

  • Знание языка программирования Rust
  • Знакомство с экосистемой Terra
  • Докер установлен на вашем компьютере
  • Ядро Земли
  • LocalTerra

Однако не беспокойтесь о вышеуказанных требованиях, если у вас их нет, мы их все рассмотрим. Однако последнее требование, которое необходимо, по мнению команды Terra, - это желание нарушить / помешать традиционным финансам.

Настройка среды

Перед тем, как мы начнем, нам нужно установить несколько вещей. Эта установка поможет нам подключиться к локальной тестовой сети Terra при написании контрактов и предоставить последнюю версию terrad. terradработает с ядром Terra .

Вам также потребуется установить Rust, если у вас его еще нет.

Для начала давайте установим Terra Core, для чего сначала необходимо установить Go. Для этого скачайте Go по этой ссылке и проверьте:

➜  ~ go version
go version go1.17 darwin/amd64

Go версии v1.17 +, которая требуется для использования Terra Core.

Установка Terra Core

Установите Terra Core, клонировав репозиторий с GitHub. Затем перейдите в основную ветку с последней версией:

$ git clone https://github.com/terra-money/core terra-core
$ cd terra-core
$ git checkout main

Затем установите Terra Core, чтобы получить terrad, который будет служить исполняемым файлом для взаимодействия с узлом Terra:

$ make install

Затем убедитесь, что вы успешно установили его:

$ terrad version --long

Ваш результат должен выглядеть примерно так:

name: terra
server_name: terrad
version: 0.5.12-1-gd411ae7
commit: d411ae7a276e7eaada72973a640dcab69825163f
build_tags: netgo,ledger
go: go version go1.17 darwin/amd64

Установка LocalTerra

LocalTerra будет нашей тестовой сетью для тестирования наших смарт-контрактов во время разработки. Наша локальная тестовая сеть состоит из интеграции WebAssembly . Чтобы развернуть LocalTerra, вам нужно иметь Docker иdocker-compose  настроить, потому что LocalTerra контейнерован:

$ git clone --depth 1 https://www.github.com/terra-money/LocalTerra
$ cd LocalTerra

Когда Docker работает в фоновом режиме, выполните следующую команду:

$ docker-compose up

Вы должны получить ответ ниже, который представляет собой журналы:

 11:25PM INF Timed out dur=4955.7669 height=5 module=consensus round=0 step=1
terrad_1         | 11:25PM INF received proposal module=consensus proposal={"Type":32,"block_id":{"hash":"54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E","parts":{"hash":"2517579A126AC2BF6EB9EB6274FAE6748D14115C91FC59FE3A2AF5F061A12740","total":1}},"height":5,"pol_round":-1,"round":0,"signature":"AMxXngubsUHyterTZuZsiLgY0olPDpdpgjMIRZ9L59UR9+JngC93xO63yTxwE0kQLp2HdZ99G8M4ATchS7d1CA==","timestamp":"2021-12-16T23:25:00.8000592Z"}
terrad_1         | 11:25PM INF received complete proposal block hash=54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E height=5 module=consensus
terrad_1         | 11:25PM INF finalizing commit of block hash=54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E height=5 module=consensus num_txs=0 root=84C2F2EF6B7FC8B3ACED8B2B0D2921D649F13CE54C5AB5B032DE988D1392E0FD
terrad_1         | 11:25PM INF minted coins from module account amount=226569846uluna from=mint module=x/bank
terrad_1         | 11:25PM INF executed block height=5 module=state num_invalid_txs=0 num_valid_txs=0
terrad_1         | 11:25PM INF commit synced commit=436F6D6D697449447B5B32382031303020373220323137203234312038352031363320313520313530203137382031353820323235203133312032343620313538203235322031333420313238203134392031383220323033203131372039382031333420312035382032333720323120333620313534203136203134335D3A357D
terrad_1         | 11:25PM INF committed state app_hash=1C6448D9F155A30F96B29EE183F69EFC868095B6CB756286013AED15249A108F height=5 module=state num_txs=0
terrad_1         | 11:25PM INF indexed block height=5 module=txindex
terrad_1         | 11:25PM INF Ensure peers module=pex numDialing=0 numInPeers=0 numOutPeers=0 numToDial=10
terrad_1         | 11:25PM INF No addresses to dial. Falling back to seeds module=pex
terrad_1         | 11:25PM INF Timed out dur=4975.4085 height=6 module=consensus round=0 step=1
terrad_1         | 11:25PM INF received proposal module=consensus proposal={"Type":32,"block_id":{"hash":"5FE8526C43C0B32BEF011299D67FDA44DBD625E0B69836D175C25C1F914DD06E","parts":{"hash":"BE583EC25B30F52E652FA28DEAB869D98602B3FB82CD0D9C80ADF96A210CC8D4","total":1}},"height":6,"pol_round":-1,"round":0,"signature":"Bx3WaDl3hhR9IkDjXRa+dXkSIK0Tezl07gZhDm4RXyJyHq0oriAkQD23Q9+ly1+cFhGIdKF3hyvH3GcjCNLvAQ==","timestamp":"2021-12-16T23:25:05.823444Z"}

Теперь мы подключены к сети LocalTerra. Ниже приведены номера портов для подключения:

Установка Rust

Rust - это то, что Terra выбрала для использования и написания смарт-контрактов, потому что Rust может компилироваться в WebAssembly, а инструменты WebAssembly хорошо разработаны и созданы для Terra.

Чтобы установить Rust на MacOS или любую Linux-подобную ОС, выполните следующую команду:

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Если вы используете Windows, воспользуйтесь этой ссылкой .

После успешной установки мы должны добавить wasm32-unknown-unknownцель для компиляции:

$ rustup target add wasm32-unknown-unknown

Наконец, давайте установим, cargo-generateчтобы сформировать шаблон смарт-контракта CosmWasm и cargo-run-scriptоптимизировать наши смарт-контракты:

$ cargo install cargo-generate --features vendored-openssl
$ cargo install cargo-run-script

Наконец-то мы закончили установку🙂!

Написание и исследование смарт-контракта в Terra

Когда наша сеть LocalTerra запущена и ждет нас, мы готовы написать небольшой смарт-контракт, развернуть их, и на этом все готово!

С тех пор, как мы установили cargo-generate, мы можем быстро построить рабочий проект. Это поможет нам со структурой папок для написания наших контрактов. Для этого используйте следующую команду:

$ cargo generate --git https://github.com/CosmWasm/cw-template.git --name PROJECT_NAME

Ибо PROJECT_NAMEвы должны назвать это именем вашего проекта. Ниже показано, что вы должны получить после выполнения предыдущей команды:

Vectormikes-MacBook-Pro:Projects macbookpro$ cargo generate --git https://github.com/CosmWasm/cw-template.git --name terra-demo
   Generating template ...
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 5/34]   Done: .editorconfig
[ 6/34]   Done: .github/workflows/Basic.yml
[ 7/34]   Done: .github/workflows
[ 8/34]   Done: .github
[ 9/34]   Done: .gitignore
[10/34]   Done: .gitpod.Dockerfile
[11/34]   Done: .gitpod.yml
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 5/34]   Done: .editorconfig
[ 6/34]   Done: .github/workflows/Basic.yml
[ 7/34]   Done: .github/workflows
[ 8/34]   Done: .github
[ 9/34]   Done: .gitignore
[10/34]   Done: .gitpod.Dockerfile
[11/34]   Done: .gitpod.yml
[12/34]   Done: Cargo.lock
[13/34]   Done: Cargo.toml
[14/34]   Done: Developing.md
[15/34]   Done: Importing.md
[16/34]   Done: LICENSE
[17/34]   Done: NOTICE
[18/34]   Done: Publishing.md
[19/34]   Done: README.md
[20/34]   Done: examples/schema.rs
[21/34]   Done: examples
[22/34]   Done: rustfmt.toml
[23/34]   Done: schema/count_response.json
[24/34]   Done: schema/execute_msg.json
[25/34]   Done: schema/instantiate_msg.json
[26/34]   Done: schema/query_msg.json
[27/34]   Done: schema/state.json
[28/34]   Done: schema
[29/34]   Done: src/contract.rs
[30/34]   Done: src/error.rs
[31/34]   Done: src/lib.rs
[32/34]   Done: src/msg.rs
[33/34]   Done: src/state.rs
[34/34]   Done: src
   Moving generated files into: `/Users/macbookpro/Desktop/Projects/terra-demo`...
   Done! New project created /Users/macbookpro/Desktop/Projects/terra-demo

Глядя на src/msg.rsфайл, мы видим три типа сообщений, которые мы можем отправить нашему смарт-контракту. Во-первых, это включает в себя InstantiateMsg, который устанавливает состояние в смарт-контракте, то есть начальное состояние должно быть присвоено смарт-контракту при его развертывании.

Во-вторых, ExecuteMsgэто сообщение, которое выполняет действие по изменению состояния, такое как отправка сообщения в цепочку блоков. И, наконец, QueryMsgэто так, как кажется: он работает как запрос к цепочке, получая из нее данные.

Давайте посмотрим, как их использовать в коде:

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
    pub count: i32,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    Increment {},
    Reset { count: i32 },
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    // GetCount returns the current count as a json-encoded number
    GetCount {},
}
// We define a custom struct for each query response
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct CountResponse {
    pub count: i32,
}

Прежде чем мы перейдем к контракту, давайте посмотрим, какой интерфейс у нас Stateвнутри src/state.rsфайла:

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cosmwasm_std::Addr;
use cw_storage_plus::Item;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct State {
    pub count: i32,
    pub owner: Addr,
}
pub const STATE: Item<State> = Item::new("state");

Наша структура Stateдолжна содержать countof i32и ownerof Addr. Согласно Terra, наше состояние является постоянным из-за активного LevelDB Terra , который представляет собой хранилище значений ключей .

Имея это в виду, наш контракт находится в src/contract.rsфайле:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn instantiate(
    deps: DepsMut,
    _env: Env,
    info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let state = State {
        count: msg.count,
        owner: info.sender.clone(),
    };
    set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
    STATE.save(deps.storage, &state)?;
    Ok(Response::new()
        .add_attribute("method", "instantiate")
        .add_attribute("owner", info.sender)
        .add_attribute("count", msg.count.to_string()))
}

instantiateМетод ожидает четыре аргумента, deps_ env, infoи msg, с их поддерживающими интерфейсами. Затем мы ожидаем результата, который будет либо нашим ожидаемым, Responseлибо ContractError.

Здесь мы определили наш ContractErrorв src/error.rsфайле:

use cosmwasm_std::StdError;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ContractError {
    #[error("{0}")]
    Std(#[from] StdError),
    #[error("Unauthorized")]
    Unauthorized {},
    // Add any other custom errors you like here.
    // Look at https://docs.rs/thiserror/1.0.21/thiserror/ for details.
}

Несколько других интерфейсов, например, Responseтакже были импортированы из cosmwasm_std:

#[cfg(not(feature = "library"))]
use cosmwasm_std::entry_point;
use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult};
use cw2::set_contract_version;

Далее, для методов у нас также есть executeи queryв нашем контракте:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(
    deps: DepsMut,
    _env: Env,
    info: MessageInfo,
    msg: ExecuteMsg,
) -> Result<Response, ContractError> {
    match msg {
        ExecuteMsg::Increment {} => try_increment(deps),
        ExecuteMsg::Reset { count } => try_reset(deps, info, count),
    }
}

pub fn try_increment(deps: DepsMut) -> Result<Response, ContractError> {
    STATE.update(deps.storage, |mut state| -> Result<_, ContractError> {
        state.count += 1;
        Ok(state)
    })?;
    Ok(Response::new().add_attribute("method", "try_increment"))
}
pub fn try_reset(deps: DepsMut, info: MessageInfo, count: i32) -> Result<Response, ContractError> {
    STATE.update(deps.storage, |mut state| -> Result<_, ContractError> {
        if info.sender != state.owner {
            return Err(ContractError::Unauthorized {});
        }
        state.count = count;
        Ok(state)
    })?;
    Ok(Response::new().add_attribute("method", "reset"))
}

Здесь,, try_incrementкоторый увеличивает состояние счетчика 1, и try_reset, который сбрасывает состояние счета, являются функциями, используемыми в executeфункции.

Наконец, queryподсчет, который получает состояние или информацию из хранилища для нас, можно увидеть выполненным ниже:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
    match msg {
        QueryMsg::GetCount {} => to_binary(&query_count(deps)?),
    }
}
fn query_count(deps: Deps) -> StdResult<CountResponse> {
    let state = STATE.load(deps.storage)?;
    Ok(CountResponse { count: state.count })
}

Загрузка смарт-контракта в LocalTerra

Теперь мы можем создать наш смарт-контракт, чтобы проверять ошибки во время компиляции, чтобы мы могли их исправить. Для этого мы запускаем следующее:

$ cargo wasm

И так же, как мы установили, cargo-run-scriptчтобы помочь оптимизировать наши сборки, теперь мы должны использовать его:

$ cargo run-script optimize

В каталоге проекта мы должны увидеть код artifacts/terra_demo.wasm, который мы вскоре загрузим в LocalTerra. Теперь мы можем создать имя локальной тестовой сети и прозвище узла:

$ terrad init --chain-id=<testnet_name> <node_moniker>

Затем вам будет предложено ввести свою мнемонику:

 $ terrad keys add <account_name>

По словам Терры, учетная запись с мнемоникой ниже является единственным валидатором в сети:

удовлетворить настройку древесины высокая покупка табуретка вера штраф установить, что вы не знаете, кормить лицензию на домен наложить босса человек нетерпеливый шляпа аренда наслаждайтесь рассветом

Далее мы можем загрузить код в сеть Terra:

terrad tx wasm store artifacts / terra_demo.wasm --from demo --chain-id = localterra --gas = auto --fees = 100000uluna --broadcast-mode = block

Это запросит разрешение, в котором вы должны ввести «да», чтобы разрешить отправку на LocalTerra. В случае успеха ваш контракт теперь транслируется в сеть LocalTerra.

Вывод

Мы только начали поверхностно разбираться в смарт-контрактах в Terra, и это должно дать лишь обзор того, как создать dApp на протоколе Terra.

Настоятельно рекомендуется использовать этот протокол, поскольку он активно растет, а стейблкоины Terra, включая LUNA, добавляются в платежные решения, что является хорошей новостью.

Он также имеет быстрый и эффективный консенсус с более высокой эффективностью в будущих выпусках.

What is GEEK

Buddha Community

Разработка смарт-контрактов Terra

Узнайте, как разрабатывать смарт-контракты и развертывать их в сети блокчейнов Terra для создания децентрализованных приложений.

Создание собственных смарт-контрактов существует с момента появления Web 3, что позволяет людям создавать программы для развертывания в блокчейне.

Блокчейны, которые развертывают смарт-контракты, варьируются от Ethereum до Bitcoin и не только. Кроме того, смарт-контракты работают вместе для создания децентрализованных приложений, которые можно разрабатывать на таких платформах, как Truffle, Hardhat и Embark.

В этой статье мы рассмотрим, как мы можем разработать смарт-контракты и развернуть их в сети блокчейнов Terra, которая похожа на Ethereum.

Базовый обзор Terra

Перед тем, как продолжить чтение, следует обратить внимание на несколько вещей о Terra:

  • Смарт-контракты, развернутые в блокчейне Terra, написаны на Rust.
  • наша локальная тестовая сеть - LocalTerra
  • Terra.js и Terra SDK - две доступные библиотеки, используемые для взаимодействия с блокчейном Terra.
  • Terra был создан Terraform Labs

Также обратите внимание, что консенсус Terra - это алгоритм доказательства ставки с использованием Tendermint BFT. Это позволяет держателям ставить свои токены в качестве обеспечения для проверки транзакций. Награды выдаются позже в соответствии с количеством поставленных токенов.

Также важно знать, что LUNA - это криптовалюта Terra, которая используется для работы блокчейна с подтверждением доли владения. Этот блокчейн обеспечивает стабильность цен за счет алгоритмического расширения и сокращения предложения.

Чтобы понять больше, я предлагаю вам прочитать документацию здесь . Наша основная цель в этой статье - это то, как мы можем развернуть наш смарт-контракт в этом протоколе блокчейна.

И, наконец, блокчейн Terra может похвастаться сильным и действенным механизмом консенсуса, который завершает пакеты транзакций за секунды - быстрее, чем Биткойн и Эфириум .

Требования и основы разработки

Давайте посмотрим на требования, необходимые для создания и развертывания смарт-контрактов с использованием протокола Terra:

  • Знание языка программирования Rust
  • Знакомство с экосистемой Terra
  • Докер установлен на вашем компьютере
  • Ядро Земли
  • LocalTerra

Однако не беспокойтесь о вышеуказанных требованиях, если у вас их нет, мы их все рассмотрим. Однако последнее требование, которое необходимо, по мнению команды Terra, - это желание нарушить / помешать традиционным финансам.

Настройка среды

Перед тем, как мы начнем, нам нужно установить несколько вещей. Эта установка поможет нам подключиться к локальной тестовой сети Terra при написании контрактов и предоставить последнюю версию terrad. terradработает с ядром Terra .

Вам также потребуется установить Rust, если у вас его еще нет.

Для начала давайте установим Terra Core, для чего сначала необходимо установить Go. Для этого скачайте Go по этой ссылке и проверьте:

➜  ~ go version
go version go1.17 darwin/amd64

Go версии v1.17 +, которая требуется для использования Terra Core.

Установка Terra Core

Установите Terra Core, клонировав репозиторий с GitHub. Затем перейдите в основную ветку с последней версией:

$ git clone https://github.com/terra-money/core terra-core
$ cd terra-core
$ git checkout main

Затем установите Terra Core, чтобы получить terrad, который будет служить исполняемым файлом для взаимодействия с узлом Terra:

$ make install

Затем убедитесь, что вы успешно установили его:

$ terrad version --long

Ваш результат должен выглядеть примерно так:

name: terra
server_name: terrad
version: 0.5.12-1-gd411ae7
commit: d411ae7a276e7eaada72973a640dcab69825163f
build_tags: netgo,ledger
go: go version go1.17 darwin/amd64

Установка LocalTerra

LocalTerra будет нашей тестовой сетью для тестирования наших смарт-контрактов во время разработки. Наша локальная тестовая сеть состоит из интеграции WebAssembly . Чтобы развернуть LocalTerra, вам нужно иметь Docker иdocker-compose  настроить, потому что LocalTerra контейнерован:

$ git clone --depth 1 https://www.github.com/terra-money/LocalTerra
$ cd LocalTerra

Когда Docker работает в фоновом режиме, выполните следующую команду:

$ docker-compose up

Вы должны получить ответ ниже, который представляет собой журналы:

 11:25PM INF Timed out dur=4955.7669 height=5 module=consensus round=0 step=1
terrad_1         | 11:25PM INF received proposal module=consensus proposal={"Type":32,"block_id":{"hash":"54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E","parts":{"hash":"2517579A126AC2BF6EB9EB6274FAE6748D14115C91FC59FE3A2AF5F061A12740","total":1}},"height":5,"pol_round":-1,"round":0,"signature":"AMxXngubsUHyterTZuZsiLgY0olPDpdpgjMIRZ9L59UR9+JngC93xO63yTxwE0kQLp2HdZ99G8M4ATchS7d1CA==","timestamp":"2021-12-16T23:25:00.8000592Z"}
terrad_1         | 11:25PM INF received complete proposal block hash=54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E height=5 module=consensus
terrad_1         | 11:25PM INF finalizing commit of block hash=54D9C757E9AA84E0F5AAA736E6EED3D83F364A3A62FDC625970539CA81DFA86E height=5 module=consensus num_txs=0 root=84C2F2EF6B7FC8B3ACED8B2B0D2921D649F13CE54C5AB5B032DE988D1392E0FD
terrad_1         | 11:25PM INF minted coins from module account amount=226569846uluna from=mint module=x/bank
terrad_1         | 11:25PM INF executed block height=5 module=state num_invalid_txs=0 num_valid_txs=0
terrad_1         | 11:25PM INF commit synced commit=436F6D6D697449447B5B32382031303020373220323137203234312038352031363320313520313530203137382031353820323235203133312032343620313538203235322031333420313238203134392031383220323033203131372039382031333420312035382032333720323120333620313534203136203134335D3A357D
terrad_1         | 11:25PM INF committed state app_hash=1C6448D9F155A30F96B29EE183F69EFC868095B6CB756286013AED15249A108F height=5 module=state num_txs=0
terrad_1         | 11:25PM INF indexed block height=5 module=txindex
terrad_1         | 11:25PM INF Ensure peers module=pex numDialing=0 numInPeers=0 numOutPeers=0 numToDial=10
terrad_1         | 11:25PM INF No addresses to dial. Falling back to seeds module=pex
terrad_1         | 11:25PM INF Timed out dur=4975.4085 height=6 module=consensus round=0 step=1
terrad_1         | 11:25PM INF received proposal module=consensus proposal={"Type":32,"block_id":{"hash":"5FE8526C43C0B32BEF011299D67FDA44DBD625E0B69836D175C25C1F914DD06E","parts":{"hash":"BE583EC25B30F52E652FA28DEAB869D98602B3FB82CD0D9C80ADF96A210CC8D4","total":1}},"height":6,"pol_round":-1,"round":0,"signature":"Bx3WaDl3hhR9IkDjXRa+dXkSIK0Tezl07gZhDm4RXyJyHq0oriAkQD23Q9+ly1+cFhGIdKF3hyvH3GcjCNLvAQ==","timestamp":"2021-12-16T23:25:05.823444Z"}

Теперь мы подключены к сети LocalTerra. Ниже приведены номера портов для подключения:

Установка Rust

Rust - это то, что Terra выбрала для использования и написания смарт-контрактов, потому что Rust может компилироваться в WebAssembly, а инструменты WebAssembly хорошо разработаны и созданы для Terra.

Чтобы установить Rust на MacOS или любую Linux-подобную ОС, выполните следующую команду:

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Если вы используете Windows, воспользуйтесь этой ссылкой .

После успешной установки мы должны добавить wasm32-unknown-unknownцель для компиляции:

$ rustup target add wasm32-unknown-unknown

Наконец, давайте установим, cargo-generateчтобы сформировать шаблон смарт-контракта CosmWasm и cargo-run-scriptоптимизировать наши смарт-контракты:

$ cargo install cargo-generate --features vendored-openssl
$ cargo install cargo-run-script

Наконец-то мы закончили установку🙂!

Написание и исследование смарт-контракта в Terra

Когда наша сеть LocalTerra запущена и ждет нас, мы готовы написать небольшой смарт-контракт, развернуть их, и на этом все готово!

С тех пор, как мы установили cargo-generate, мы можем быстро построить рабочий проект. Это поможет нам со структурой папок для написания наших контрактов. Для этого используйте следующую команду:

$ cargo generate --git https://github.com/CosmWasm/cw-template.git --name PROJECT_NAME

Ибо PROJECT_NAMEвы должны назвать это именем вашего проекта. Ниже показано, что вы должны получить после выполнения предыдущей команды:

Vectormikes-MacBook-Pro:Projects macbookpro$ cargo generate --git https://github.com/CosmWasm/cw-template.git --name terra-demo
   Generating template ...
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 5/34]   Done: .editorconfig
[ 6/34]   Done: .github/workflows/Basic.yml
[ 7/34]   Done: .github/workflows
[ 8/34]   Done: .github
[ 9/34]   Done: .gitignore
[10/34]   Done: .gitpod.Dockerfile
[11/34]   Done: .gitpod.yml
[ 1/34]   Done: .cargo/config
[ 2/34]   Done: .cargo
[ 3/34]   Skipped: .circleci/config.yml
[ 4/34]   Done: .circleci
[ 5/34]   Done: .editorconfig
[ 6/34]   Done: .github/workflows/Basic.yml
[ 7/34]   Done: .github/workflows
[ 8/34]   Done: .github
[ 9/34]   Done: .gitignore
[10/34]   Done: .gitpod.Dockerfile
[11/34]   Done: .gitpod.yml
[12/34]   Done: Cargo.lock
[13/34]   Done: Cargo.toml
[14/34]   Done: Developing.md
[15/34]   Done: Importing.md
[16/34]   Done: LICENSE
[17/34]   Done: NOTICE
[18/34]   Done: Publishing.md
[19/34]   Done: README.md
[20/34]   Done: examples/schema.rs
[21/34]   Done: examples
[22/34]   Done: rustfmt.toml
[23/34]   Done: schema/count_response.json
[24/34]   Done: schema/execute_msg.json
[25/34]   Done: schema/instantiate_msg.json
[26/34]   Done: schema/query_msg.json
[27/34]   Done: schema/state.json
[28/34]   Done: schema
[29/34]   Done: src/contract.rs
[30/34]   Done: src/error.rs
[31/34]   Done: src/lib.rs
[32/34]   Done: src/msg.rs
[33/34]   Done: src/state.rs
[34/34]   Done: src
   Moving generated files into: `/Users/macbookpro/Desktop/Projects/terra-demo`...
   Done! New project created /Users/macbookpro/Desktop/Projects/terra-demo

Глядя на src/msg.rsфайл, мы видим три типа сообщений, которые мы можем отправить нашему смарт-контракту. Во-первых, это включает в себя InstantiateMsg, который устанавливает состояние в смарт-контракте, то есть начальное состояние должно быть присвоено смарт-контракту при его развертывании.

Во-вторых, ExecuteMsgэто сообщение, которое выполняет действие по изменению состояния, такое как отправка сообщения в цепочку блоков. И, наконец, QueryMsgэто так, как кажется: он работает как запрос к цепочке, получая из нее данные.

Давайте посмотрим, как их использовать в коде:

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
    pub count: i32,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
    Increment {},
    Reset { count: i32 },
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
    // GetCount returns the current count as a json-encoded number
    GetCount {},
}
// We define a custom struct for each query response
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct CountResponse {
    pub count: i32,
}

Прежде чем мы перейдем к контракту, давайте посмотрим, какой интерфейс у нас Stateвнутри src/state.rsфайла:

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cosmwasm_std::Addr;
use cw_storage_plus::Item;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct State {
    pub count: i32,
    pub owner: Addr,
}
pub const STATE: Item<State> = Item::new("state");

Наша структура Stateдолжна содержать countof i32и ownerof Addr. Согласно Terra, наше состояние является постоянным из-за активного LevelDB Terra , который представляет собой хранилище значений ключей .

Имея это в виду, наш контракт находится в src/contract.rsфайле:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn instantiate(
    deps: DepsMut,
    _env: Env,
    info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let state = State {
        count: msg.count,
        owner: info.sender.clone(),
    };
    set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
    STATE.save(deps.storage, &state)?;
    Ok(Response::new()
        .add_attribute("method", "instantiate")
        .add_attribute("owner", info.sender)
        .add_attribute("count", msg.count.to_string()))
}

instantiateМетод ожидает четыре аргумента, deps_ env, infoи msg, с их поддерживающими интерфейсами. Затем мы ожидаем результата, который будет либо нашим ожидаемым, Responseлибо ContractError.

Здесь мы определили наш ContractErrorв src/error.rsфайле:

use cosmwasm_std::StdError;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ContractError {
    #[error("{0}")]
    Std(#[from] StdError),
    #[error("Unauthorized")]
    Unauthorized {},
    // Add any other custom errors you like here.
    // Look at https://docs.rs/thiserror/1.0.21/thiserror/ for details.
}

Несколько других интерфейсов, например, Responseтакже были импортированы из cosmwasm_std:

#[cfg(not(feature = "library"))]
use cosmwasm_std::entry_point;
use cosmwasm_std::{to_binary, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult};
use cw2::set_contract_version;

Далее, для методов у нас также есть executeи queryв нашем контракте:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn execute(
    deps: DepsMut,
    _env: Env,
    info: MessageInfo,
    msg: ExecuteMsg,
) -> Result<Response, ContractError> {
    match msg {
        ExecuteMsg::Increment {} => try_increment(deps),
        ExecuteMsg::Reset { count } => try_reset(deps, info, count),
    }
}

pub fn try_increment(deps: DepsMut) -> Result<Response, ContractError> {
    STATE.update(deps.storage, |mut state| -> Result<_, ContractError> {
        state.count += 1;
        Ok(state)
    })?;
    Ok(Response::new().add_attribute("method", "try_increment"))
}
pub fn try_reset(deps: DepsMut, info: MessageInfo, count: i32) -> Result<Response, ContractError> {
    STATE.update(deps.storage, |mut state| -> Result<_, ContractError> {
        if info.sender != state.owner {
            return Err(ContractError::Unauthorized {});
        }
        state.count = count;
        Ok(state)
    })?;
    Ok(Response::new().add_attribute("method", "reset"))
}

Здесь,, try_incrementкоторый увеличивает состояние счетчика 1, и try_reset, который сбрасывает состояние счета, являются функциями, используемыми в executeфункции.

Наконец, queryподсчет, который получает состояние или информацию из хранилища для нас, можно увидеть выполненным ниже:

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
    match msg {
        QueryMsg::GetCount {} => to_binary(&query_count(deps)?),
    }
}
fn query_count(deps: Deps) -> StdResult<CountResponse> {
    let state = STATE.load(deps.storage)?;
    Ok(CountResponse { count: state.count })
}

Загрузка смарт-контракта в LocalTerra

Теперь мы можем создать наш смарт-контракт, чтобы проверять ошибки во время компиляции, чтобы мы могли их исправить. Для этого мы запускаем следующее:

$ cargo wasm

И так же, как мы установили, cargo-run-scriptчтобы помочь оптимизировать наши сборки, теперь мы должны использовать его:

$ cargo run-script optimize

В каталоге проекта мы должны увидеть код artifacts/terra_demo.wasm, который мы вскоре загрузим в LocalTerra. Теперь мы можем создать имя локальной тестовой сети и прозвище узла:

$ terrad init --chain-id=<testnet_name> <node_moniker>

Затем вам будет предложено ввести свою мнемонику:

 $ terrad keys add <account_name>

По словам Терры, учетная запись с мнемоникой ниже является единственным валидатором в сети:

удовлетворить настройку древесины высокая покупка табуретка вера штраф установить, что вы не знаете, кормить лицензию на домен наложить босса человек нетерпеливый шляпа аренда наслаждайтесь рассветом

Далее мы можем загрузить код в сеть Terra:

terrad tx wasm store artifacts / terra_demo.wasm --from demo --chain-id = localterra --gas = auto --fees = 100000uluna --broadcast-mode = block

Это запросит разрешение, в котором вы должны ввести «да», чтобы разрешить отправку на LocalTerra. В случае успеха ваш контракт теперь транслируется в сеть LocalTerra.

Вывод

Мы только начали поверхностно разбираться в смарт-контрактах в Terra, и это должно дать лишь обзор того, как создать dApp на протоколе Terra.

Настоятельно рекомендуется использовать этот протокол, поскольку он активно растет, а стейблкоины Terra, включая LUNA, добавляются в платежные решения, что является хорошей новостью.

Он также имеет быстрый и эффективный консенсус с более высокой эффективностью в будущих выпусках.

Lisa joly

Lisa joly

1624715501

Terra Virtua NFT Marketplace DeF Trading LIVE, Potential 5X-10X | Terra Virtua (TVK) token

Terra Virtua the world’s first immersive digital collectible platform! Choose amazing digital merch from some of the biggest names in the entertainment industry, or check out our limited edition vFlect collectibles. Share, Showcase, Trade and more in the world of Terra Virtua!

📺 The video in this post was made by Crypto expat
The origin of the article: https://www.youtube.com/watch?v=r7PiI4avaoM
🔺 DISCLAIMER: The article is for information sharing. The content of this video is solely the opinions of the speaker who is not a licensed financial advisor or registered investment advisor. Not investment advice or legal advice.
Cryptocurrency trading is VERY risky. Make sure you understand these risks and that you are responsible for what you do with your money
🔥 If you’re a beginner. I believe the article below will be useful to you ☞ What You Should Know Before Investing in Cryptocurrency - For Beginner
⭐ ⭐ ⭐The project is of interest to the community. Join to Get free ‘GEEK coin’ (GEEKCASH coin)!
☞ **-----CLICK HERE-----**⭐ ⭐ ⭐
Thanks for visiting and watching! Please don’t forget to leave a like, comment and share!

#bitcoin #blockchain #nft #terra virtua #terra virtua nft marketplace def trading #token

Terra Cosmwasm: Terra Bindings for CosmWasm

Terra Bindings for CosmWasm

​ This crate provides Terra-specific bindings to enable your CosmWasm smart contracts to interact with the Terra blockchain by exposing messages and queriers that can be emitted and used from within your contract. ​

Installation

​ Add the following to your smart contract's Cargo.toml: ​

[dependencies]
terra-cosmwasm = { version = "1.2" }

Contents

​ Currently, the Terra bindings include: ​

  • Query support for:
    • Market
      • swap rate between 2 currencies at market price
    • Treasury
      • current tax cap for a denomination
      • current tax rate
    • Oracle
      • exchange rates for the given base_denom / quote_denoms ​
  • Messages
    • MsgSwap
    • MsgSwapSend

Usage

Querying

​ In order to use the query functions enabled by the bindings, create a TerraQuerier instance within your contract logic -- in either init(), handle(), or query() entrypoints. You can access all the enabled queries through this object. ​​

// src/contract.rs
use cosmwasm_std::Coin;
use terra_cosmwasm::{ TerraQuerier, SwapResponse, TaxRateResponse, TaxCapResponse, ExchangeRatesResponse };
​
...
​
// handler
pub fn try_something<S: Storage, A: Api, Q: Querier>(
    deps: &mut Extern<S, A, Q>,
    env: Env,
    offer: &Coin
) -> StdResult<HandleResponse> {
    let querier = TerraQuerier::new(&deps.querier);
    let swap_rate: SwapResponse = querier.query_swap(offer.clone(), "uusd")?;
    let tax_cap: TaxCapResponse = querier.query_tax_cap("usdr")?;
    let tax_rate: TaxRateResponse = querier.query_tax_rate()?;
    let exchange_rates: ExchangeRatesResponse = querier.query_exchange_rates("uusd", vec!["uluna", "ukrw"])?;
    ...
}

Creating Messages​

NOTE: The Terra bindings do not cover messages that have already been implemented by the CosmWasm team, such as staking-related messages and fundamental ones like MsgSend. ​ You may want your contract to perform messages such as MsgSwap and MsgSwapSend operations at the end of its execution. To do this, create a message using the predefined functions: ​

  • create_swap_msg
  • create_swap_send_msg ​ And add it to the vector of messages in your HandleResponse before you return Ok. ​
use cosmwasm_std::CosmosMsg;
use terra_cosmwasm::{create_swap_msg, TerraMsgWrapper};
​
...
​
pub fn try_something<S: Storage, A: Api, Q: Querier>(
  deps: &mut Extern<S, A, Q>,
  env: Env,
  offer: &Coin
) -> StdResult<HandleResponse<TerraMsgWrapper>> {
  ...
​
  let msg: CosmosMsg<TerraMsgWrapper> = create_swap_msg(contract_addr, offer_coin, ask_denom);
  let res = HandleResponse {
      messages: vec![msg],
      log: vec![],
      data: None
  };
  Ok(res)
}

Download Details:
Author: terra-money
Source Code: https://github.com/terra-money/terra-cosmwasm
License:

#rust  #blockchain  #terra #CosmWasm #smartcontract 

Terra Token: Simple CosmWasm Smart Contract on Terra

CosmWasm Starter Pack

This is a template to build smart contracts in Rust to run inside a Cosmos SDK module on all chains that enable it. To understand the framework better, please read the overview in the cosmwasm repo, and dig into the cosmwasm docs. This assumes you understand the theory and just want to get coding.

Creating a new repo from template

Assuming you have a recent version of rust and cargo installed (via rustup), then the following should get you a new repo to start a contract:

First, install cargo-generate. Unless you did that before, run this line now:

cargo install cargo-generate --features vendored-openssl

Now, use it to create your new contract. Go to the folder in which you want to place it and run:

Stable (0.8)

cargo generate --git https://github.com/CosmWasm/cosmwasm-template.git --name YOUR_NAME_HERE

You will now have a new folder called YOUR_NAME_HERE (I hope you changed that to something else) containing a simple working contract and build system that you can customize.

Create a Repo

After generating, you have a initialized local git repo, but no commits, and no remote. Go to a server (eg. github) and create a new upstream repo (called YOUR-GIT-URL below). Then run the following:

# this is needed to create a valid Cargo.lock file (see below)
cargo check
git checkout -b master # in case you generate from non-master
git add .
git commit -m 'Initial Commit'
git remote add origin YOUR-GIT-URL
git push -u origin master

CI Support

We have template configurations for both GitHub Actions and Circle CI in the generated project, so you can get up and running with CI right away.

One note is that the CI runs all cargo commands with --locked to ensure it uses the exact same versions as you have locally. This also means you must have an up-to-date Cargo.lock file, which is not auto-generated. The first time you set up the project (or after adding any dep), you should ensure the Cargo.lock file is updated, so the CI will test properly. This can be done simply by running cargo check or cargo unit-test.

Using your project

Once you have your custom repo, you should check out Developing to explain more on how to run tests and develop code. Or go through the online tutorial to get a better feel of how to develop.

Publishing contains useful information on how to publish your contract to the world, once you are ready to deploy it on a running blockchain. And Importing contains information about pulling in other contracts or crates that have been published.

Please replace this README file with information about your specific project. You can keep the Developing.md and Publishing.md files as useful referenced, but please set some proper description in the README.

Download Details:
Author: terra-money
Source Code: https://github.com/terra-money/my-terra-token
License: Apache-2.0 License

#rust  #blockchain  #terra 

Terra là gì? Tìm hiểu về dự án Terra coin đầy tiềm năng

Terra là gì? Tìm hiểu về dự án Terra coin đầy tiềm năng
14/05/2021 Kiến thức, Kiến thức tiền ảo
Trong thời điểm bùng nổ các dự án DeFi và Blockchain. Mọi người bắt đầu nhận thấy tầm quan trọng của các stablecoin đối với Blockchain. Nếu chú ý, bạn có thể thấy đa số các dự án DeFi đều sử dụng stablecoin như BUSD, USDT, USDC… Nguyên nhân là do sự thay đổi giá quá nhanh của sàn tiền ảo uy tín thông thường. Điều này khiến chúng không thể áp dụng vào xây dựng các nền kinh tế. Bởi vì phần lớn các token bị đầu cơ, làm giá khiến giá thay đổi quá thất thường. Chính vì vậy, trong nhiều năm qua đã có rất nhiều dự án Blockchain, nhưng chưa có dự án nào thực sự được ứng dụng vào thực tế. Hay có thể nói, chưa có loại tiền kỹ thuật số nào có thể thanh toán trong đời sống. Trong tình hình đó, dự án Terra coin được tạo ra nhằm tạo ra stablecoin có thể được giao dịch trong cuộc sống, nhằm xây dựng các hệ sinh thái hữu ích cho xã hội. Vậy Terra là gì? Hãy cùng kiemtien.com đi tìm hiểu đồng tiền đầy tiềm năng này nhé!

Thế nào là Terra?
Đây một dự án blockchain dành cho thương mại điện tử. Dự án này đã tạo ra stablecoin của riêng họ dùng để thanh toán và giảm phí giao dịch. Một phần phí giao dịch sẽ được giữ lại sẽ để đưa vào quỹ bình ổn giá của họ. Trong đó bao gồm LUNA – loại crypto thứ hai. LUNA sẽ hoạt động để giữ cho giá Terra coin ổn định như một loại stablecoin.

#terra