1641289217
Узнайте, как разрабатывать смарт-контракты и развертывать их в сети блокчейнов Terra для создания децентрализованных приложений.
Создание собственных смарт-контрактов существует с момента появления Web 3, что позволяет людям создавать программы для развертывания в блокчейне.
Блокчейны, которые развертывают смарт-контракты, варьируются от Ethereum до Bitcoin и не только. Кроме того, смарт-контракты работают вместе для создания децентрализованных приложений, которые можно разрабатывать на таких платформах, как Truffle, Hardhat и Embark.
В этой статье мы рассмотрим, как мы можем разработать смарт-контракты и развернуть их в сети блокчейнов Terra, которая похожа на Ethereum.
Перед тем, как продолжить чтение, следует обратить внимание на несколько вещей о Terra:
Также обратите внимание, что консенсус Terra - это алгоритм доказательства ставки с использованием Tendermint BFT. Это позволяет держателям ставить свои токены в качестве обеспечения для проверки транзакций. Награды выдаются позже в соответствии с количеством поставленных токенов.
Также важно знать, что LUNA - это криптовалюта Terra, которая используется для работы блокчейна с подтверждением доли владения. Этот блокчейн обеспечивает стабильность цен за счет алгоритмического расширения и сокращения предложения.
Чтобы понять больше, я предлагаю вам прочитать документацию здесь . Наша основная цель в этой статье - это то, как мы можем развернуть наш смарт-контракт в этом протоколе блокчейна.
И, наконец, блокчейн Terra может похвастаться сильным и действенным механизмом консенсуса, который завершает пакеты транзакций за секунды - быстрее, чем Биткойн и Эфириум .
Давайте посмотрим на требования, необходимые для создания и развертывания смарт-контрактов с использованием протокола Terra:
Однако не беспокойтесь о вышеуказанных требованиях, если у вас их нет, мы их все рассмотрим. Однако последнее требование, которое необходимо, по мнению команды 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, клонировав репозиторий с 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 будет нашей тестовой сетью для тестирования наших смарт-контрактов во время разработки. Наша локальная тестовая сеть состоит из интеграции 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. Ниже приведены номера портов для подключения:
26657
1317
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
Наконец-то мы закончили установку!
Когда наша сеть 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
должна содержать count
of i32
и owner
of 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 })
}
Теперь мы можем создать наш смарт-контракт, чтобы проверять ошибки во время компиляции, чтобы мы могли их исправить. Для этого мы запускаем следующее:
$ 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, добавляются в платежные решения, что является хорошей новостью.
Он также имеет быстрый и эффективный консенсус с более высокой эффективностью в будущих выпусках.
1641289217
Узнайте, как разрабатывать смарт-контракты и развертывать их в сети блокчейнов Terra для создания децентрализованных приложений.
Создание собственных смарт-контрактов существует с момента появления Web 3, что позволяет людям создавать программы для развертывания в блокчейне.
Блокчейны, которые развертывают смарт-контракты, варьируются от Ethereum до Bitcoin и не только. Кроме того, смарт-контракты работают вместе для создания децентрализованных приложений, которые можно разрабатывать на таких платформах, как Truffle, Hardhat и Embark.
В этой статье мы рассмотрим, как мы можем разработать смарт-контракты и развернуть их в сети блокчейнов Terra, которая похожа на Ethereum.
Перед тем, как продолжить чтение, следует обратить внимание на несколько вещей о Terra:
Также обратите внимание, что консенсус Terra - это алгоритм доказательства ставки с использованием Tendermint BFT. Это позволяет держателям ставить свои токены в качестве обеспечения для проверки транзакций. Награды выдаются позже в соответствии с количеством поставленных токенов.
Также важно знать, что LUNA - это криптовалюта Terra, которая используется для работы блокчейна с подтверждением доли владения. Этот блокчейн обеспечивает стабильность цен за счет алгоритмического расширения и сокращения предложения.
Чтобы понять больше, я предлагаю вам прочитать документацию здесь . Наша основная цель в этой статье - это то, как мы можем развернуть наш смарт-контракт в этом протоколе блокчейна.
И, наконец, блокчейн Terra может похвастаться сильным и действенным механизмом консенсуса, который завершает пакеты транзакций за секунды - быстрее, чем Биткойн и Эфириум .
Давайте посмотрим на требования, необходимые для создания и развертывания смарт-контрактов с использованием протокола Terra:
Однако не беспокойтесь о вышеуказанных требованиях, если у вас их нет, мы их все рассмотрим. Однако последнее требование, которое необходимо, по мнению команды 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, клонировав репозиторий с 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 будет нашей тестовой сетью для тестирования наших смарт-контрактов во время разработки. Наша локальная тестовая сеть состоит из интеграции 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. Ниже приведены номера портов для подключения:
26657
1317
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
Наконец-то мы закончили установку!
Когда наша сеть 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
должна содержать count
of i32
и owner
of 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 })
}
Теперь мы можем создать наш смарт-контракт, чтобы проверять ошибки во время компиляции, чтобы мы могли их исправить. Для этого мы запускаем следующее:
$ 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, добавляются в платежные решения, что является хорошей новостью.
Он также имеет быстрый и эффективный консенсус с более высокой эффективностью в будущих выпусках.
1624715501
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
1648829108
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.
Add the following to your smart contract's Cargo.toml
:
[dependencies]
terra-cosmwasm = { version = "1.2" }
Currently, the Terra bindings include:
MsgSwap
MsgSwapSend
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"])?;
...
}
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
1648843860
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.
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.
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
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
.
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
1621129196
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