CosmWasm으로 스마트 컨트랙트 작성하기 (4부)
14797 단어 beginnerssmartcontracrustcosmwasm
소개
내 시리즈를 계속하면
query
를 수행합니다.query
는 계약에서 데이터를 가져오기 위한 작업입니다.메시지 쿼리 스마트 계약 생성
execute
와 마찬가지로 QueryMsg
에서 두 개의 구조체QueryResponse
와 src/msg.rc
를 정의하여 수신하고 응답하려는 데이터 유형을 시각화해야 합니다. 아래 코드를 삽입합니다.
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Counter {},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct QueryResponse {
pub counter: i32,
}
QueryResponse
는 query
로 QueryMsg
를 수행할 때 스마트 계약 반환에 대한 응답입니다. API의 응답과 동일하게 json
데이터를 반환합니다.다음으로
query.rs
폴더에 src
파일을 만들고 모듈 query
을 lib.rs
로 가져옵니다. 당사lib.rs
는 다음을 표시합니다.pub mod contract;
mod error;
pub mod execute;
pub mod msg;
pub mod query;
pub mod state;
pub use crate::error::ContractError;
query.rs
파일에서 이름이 query_counter
인 함수를 구현하고 deps
를 매개변수로 전달합니다. 함수는 a StdResult<Binary>
를 반환합니다. 아래 코드를 업데이트합니다.#[cfg(not(feature = "library"))]
use cosmwasm_std::{to_binary, Binary, Deps, Env, StdResult};
use crate::msg::QueryResponse;
use crate::state::STATE;
pub fn query_counter(deps: Deps, _env: Env) -> StdResult<Binary> {
let current_state = STATE.load(deps.storage)?;
let counter = current_state.counter;
let resp = to_binary(&QueryResponse { counter }).unwrap();
Ok(resp)
}
좋아요. 간단하게 스마트 계약에 저장된 데이터를 쿼리하는 논리를 구현합니다.
json
에서 to_binary
함수 지원으로 cosmwasm-std
데이터에 대한 응답을 바인딩해야 합니다.src/contract.rs
에 새 진입점을 추가하는 것을 잊지 마십시오.#[cfg_attr(not(feature = "library"), entry_point)]
pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult<Binary> {
match msg {
QueryMsg::Counter {} => query_counter(deps, env),
}
}
시리즈 전반에 걸쳐 이 구문에 익숙하다고 생각합니다.
우리 계약의 마지막 진입점이 나타났다. 우리는 그것을 테스트해야합니다.
테스트 모듈
아직 파일에 있음:
src/query.rs
. 아래 코드를 맨 아래로 업데이트하십시오.#[cfg(test)]
mod tests {
use crate::contract::{execute, instantiate, query};
use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg, QueryResponse};
use cosmwasm_std::testing::{mock_dependencies, mock_env, mock_info};
use cosmwasm_std::to_binary;
const ADDR: &str = "addr1";
#[test]
fn test_query() {
let mut deps = mock_dependencies();
let env = mock_env();
let info = mock_info(ADDR, &[]);
let expect_data_0 = to_binary(&QueryResponse { counter: 0 }).unwrap();
let expect_data_1 = to_binary(&QueryResponse { counter: 1 }).unwrap();
let msg = InstantiateMsg {};
let _resp = instantiate(deps.as_mut(), env.clone(), info.clone(), msg).unwrap();
// query one time.
let msg = QueryMsg::Counter {};
let resp = query(deps.as_ref(), env.clone(), msg).unwrap();
assert_eq!(resp, expect_data_0);
// query two time
let msg = ExecuteMsg::Update {};
let _resp = execute(deps.as_mut(), env.clone(), info, msg).unwrap();
let msg = QueryMsg::Counter {};
let resp = query(deps.as_ref(), env, msg).unwrap();
assert_eq!(resp, expect_data_1);
}
}
query
테스트 모듈에서는 계약 생성, 계약 실행 및 쿼리 계약을 포함한 스마트 계약의 모든 로직을 다룰 것입니다.모듈 테스트 및 단위 테스트 기능을 생성합니다
test_query
.우리는 여전히 모든 종속성을 가져오고 예상되는 두 개의 값을 생성합니다. 하나는 계약을 인스턴스화한 후 상태를 가져오기 위한 것이고, 두 개는 계약을 실행한 후 상태를 가져오기 위한 것입니다.
터미널에서
cargo-test
실행출력이 아래와 같으면 모든 것이 올바른 것입니다.
running 1 test
test query::tests::test_query ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s
요약
나는 스마트 계약의 모든 진입점을 언급했고 스마트 계약의 논리에 대한 논리 연결 테스트 케이스를 작성했습니다.
다음 부분에서는 계약을 구축하고
testnet
네트워크에 배포합니다.읽어주셔서 감사하고 좋은 하루 되세요!
Reference
이 문제에 관하여(CosmWasm으로 스마트 컨트랙트 작성하기 (4부)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/im6h/writing-a-smart-contract-with-cosmwasm-part-4-4po2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)