본문 바로가기

블록체인/테라

CosWasm-plus를 이용한 스마트컨트랙트 만들기 - 1

테라 생태계에서 스마트 컨트랙트를 개발하는 데 사용하는 CosWasm을 활용해 간단한 스마트컨트랙트를 개발해보겠습니다.

개발할 스마트 컨트랙트는 가위바위보 게임입니다.

 

  • 내기로 가위바위보 새 게임 시작(금액은 에스크로에 보관)
  • 두 선수 모두가 자신이 무엇을 냈는지 확정하기 전까지는 비공개여야한다.
  • 게임에서 이기면 배팅 금액을 얻고 리더보드에 표시된다.

CosWasm-plus

먼저 요청 들어온 상대방의 지갑 주소가 유효한 것인지 확인하는 기능을 먼저 만들겠습니다.

/packages/cw20/src/msg.rs의 Cw20ExecuteMsg에 StartGame을 추가해줍니다. 

StartGame {
    opponent : String,
}

 

그 후 contracts/cw20-base/src/contracts.rs의 execute 함수에 방금 추가한 StartGame을 추가해줍니다.

ExecuteMsg::StartGame { opponent } => execute_addr_validate(deps,opponent.as_str())

StartGame이라는 메시지가 들어온다면 지갑 주소가 유효한지 확인하는 함수를 실행시키는 것입니다.

그다음 execute_addr_validate 함수를 구현해주겠습니다.

pub fn execute_addr_validate(deps: DepsMut,address: &str) -> Result<Response, ContractError> {
    let _adr = deps.api.addr_validate(&address)?;
    let res : Response = Response::new().add_attribute("action", "validating address");
    Ok(res)
}

 

테스트 함수를 작성해서 문제가 없는지 확인합니다.

    #[test]
    fn validate_opponent_addr() { 
        let mut deps = mock_dependencies();
        let env = mock_env();
        let info = mock_info("addr0000", &[]);
        let msg = ExecuteMsg::StartGame { opponent: "addr0000".to_string() };
        let res = execute(deps.as_mut(), env, info, msg).unwrap();
        // Ok(Addr::unchecked(input))
        //addresss => "addr0000"
        assert_eq!(res.messages, vec![]);

    }

테스트 결과