CosmWasm으로 스마트 컨트랙트 작성하기 (4부)

소개



내 시리즈를 계속하면 query를 수행합니다.query는 계약에서 데이터를 가져오기 위한 작업입니다.

메시지 쿼리 스마트 계약 생성


execute 와 마찬가지로 QueryMsg에서 두 개의 구조체QueryResponsesrc/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,
}



QueryResponsequeryQueryMsg를 수행할 때 스마트 계약 반환에 대한 응답입니다. API의 응답과 동일하게 json 데이터를 반환합니다.

다음으로 query.rs 폴더에 src 파일을 만들고 모듈 querylib.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 네트워크에 배포합니다.
읽어주셔서 감사하고 좋은 하루 되세요!

좋은 웹페이지 즐겨찾기