시작하기 전에 rustup과 함께 최신 버전의 rustc 및 cargo가 설치되어 있는지 확인하세요. 현재 Rust v1.58.1+ 에서 테스트하고 있습니다.또한 wasm32-unknown-unknown 타겟과 cargo-generate Rust crate가 설치되어 있어야 합니다.다음 명령어로 버전을 확인할 수 있습니다:
복사
AI에게 묻기
rustc --versioncargo --versionrustup target list --installed# wasm32가 위에 나열되지 않으면 다음을 실행하세요rustup target add wasm32-unknown-unknown# cargo-generate를 설치하려면 다음을 실행하세요cargo install cargo-generate
스마트 컨트랙트는 블록체인에 내부 상태가 영구 저장되는 싱글톤 객체의 인스턴스로 간주할 수 있습니다. 사용자는 스마트 컨트랙트에 JSON 메시지를 보내 상태 변경을 트리거할 수 있으며, JSON 메시지 형식의 요청을 보내 상태를 쿼리할 수도 있습니다. 이러한 JSON 메시지는 MsgSend 및 MsgExecuteContract와 같은 Injective 블록체인 메시지와 다릅니다.스마트 컨트랙트 작성자로서 스마트 컨트랙트의 인터페이스를 구성하는 3가지 함수를 정의해야 합니다:
instantiate(): 컨트랙트 인스턴스화 중에 호출되어 초기 상태를 제공하는 생성자
execute(): 사용자가 스마트 컨트랙트의 메서드를 호출하려 할 때 호출됩니다
query(): 사용자가 스마트 컨트랙트에서 데이터를 가져오려 할 때 호출됩니다
샘플 카운터 컨트랙트에서는 하나의 instantiate, 하나의 query, 두 개의 execute 메서드를 구현합니다.
Injective 스마트 컨트랙트는 Injective의 네이티브 LevelDB(바이트 기반 키-값 저장소)를 통해 영구 상태를 유지할 수 있습니다. 따라서 영구 저장하려는 모든 데이터에는 데이터를 인덱싱하고 검색하는 데 사용할 수 있는 고유한 키가 할당되어야 합니다.데이터는 원시 바이트로만 영구 저장될 수 있으므로, 구조나 데이터 유형의 개념은 직렬화 및 역직렬화 함수 쌍으로 표현되어야 합니다. 예를 들어, 객체는 바이트로 저장되어야 하므로 블록체인에 저장하기 위해 객체를 바이트로 인코딩하는 함수와 바이트를 컨트랙트 로직이 이해할 수 있는 데이터 유형으로 다시 디코딩하는 함수를 모두 제공해야 합니다.다행히 CosmWasm은 cosmwasm-storage와 같은 유틸리티 크레이트를 제공하며, 이는 구조체 및 Rust 숫자와 같이 일반적으로 사용되는 유형에 대한 직렬화 및 역직렬화를 자동으로 제공하는 “singleton” 및 “bucket”과 같은 데이터 컨테이너에 대한 편리한 고수준 추상화를 제공합니다. 또한 cw-storage-plus 크레이트는 더 효율적인 스토리지 메커니즘에 사용할 수 있습니다.State 구조체가 count와 owner를 모두 보유하는 것을 주목하세요. 또한 derive 속성이 적용되어 몇 가지 유용한 트레이트를 자동 구현합니다:
Serialize: 직렬화를 제공합니다
Deserialize: 역직렬화를 제공합니다
Clone: 구조체를 복사 가능하게 만듭니다
Debug: 구조체를 문자열로 출력할 수 있게 합니다
PartialEq: 동등성 비교를 제공합니다
JsonSchema: JSON 스키마를 자동 생성합니다
Addr은 inj로 시작하는 사람이 읽을 수 있는 Injective 주소를 참조합니다. 예: inj1clw20s2uxeyxtam6f7m84vgae92s9eh7vygagt.
InstantiateMsg는 사용자가 MsgInstantiateContract를 통해 블록체인에 컨트랙트를 인스턴스화할 때 컨트랙트에 제공됩니다. 이것은 컨트랙트에 구성과 초기 상태를 제공합니다.Injective 블록체인에서는 컨트랙트 코드 업로드와 컨트랙트 인스턴스화가 별도의 이벤트로 간주됩니다. 이는 Ethereum과 다릅니다. 이는 검증된 소수의 컨트랙트 아키타입이 동일한 기본 코드를 공유하지만 다른 파라미터로 구성된 여러 인스턴스로 존재할 수 있도록 하기 위함입니다(하나의 정식 ERC20과 해당 코드를 사용하는 여러 토큰을 상상해 보세요).
ExecuteMsg는 MsgExecuteContract를 통해 execute() 함수에 전달되는 JSON 메시지입니다. InstantiateMsg와 달리 ExecuteMsg는 스마트 컨트랙트가 사용자에게 노출하는 다양한 유형의 함수를 설명하기 위해 여러 가지 다른 유형의 메시지로 존재할 수 있습니다. execute() 함수는 이러한 다양한 유형의 메시지를 적절한 메시지 핸들러 로직으로 역다중화합니다.두 개의 ExecuteMsg가 있습니다: Increment와 Reset.
Increment는 입력 파라미터가 없으며 count 값을 1 증가시킵니다.
Reset은 32비트 정수를 파라미터로 받아 count 값을 입력 파라미터로 재설정합니다.
ExecuteMsg의 경우 enum을 사용하여 컨트랙트가 이해할 수 있는 다양한 유형의 메시지를 다중화할 수 있습니다. serde 속성은 속성 키를 snake case와 소문자로 다시 작성하므로, 직렬화 및 역직렬화 시 JSON에서 Increment와 Reset 대신 increment와 reset을 사용하게 됩니다.
먼저, 키 state에 위치한 항목을 업데이트하기 위해 스토리지에 대한 가변 참조를 획득합니다. 그런 다음 새 상태로 Ok 결과를 반환하여 상태의 count를 업데이트합니다. 마지막으로, Response와 함께 Ok 결과를 반환하여 성공을 확인하며 컨트랙트 실행을 종료합니다.
컨트랙트에서 데이터 쿼리를 지원하려면 QueryMsg 형식(요청을 나타냄)과 쿼리 출력 구조(이 경우 CountResponse)를 모두 정의해야 합니다. query()가 구조화된 JSON을 통해 사용자에게 정보를 다시 보내므로 응답의 형태를 알려야 하기 때문입니다. 자세한 내용은 JSON 스키마 생성을 참조하세요.src/msg.rs에 다음을 추가하세요:
복사
AI에게 묻기
// src/msg.rs#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]#[serde(rename_all = "snake_case")]pub enum QueryMsg { // GetCount는 현재 카운트를 json 인코딩된 숫자로 반환합니다 GetCount {},}// 각 쿼리 응답에 대한 사용자 정의 구조체 정의#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]pub struct CountResponse { pub count: i32,}
CosmWasm에는 작고 일관된 빌드 출력을 생성할 수 있는 최적화 컴파일러인 rust-optimizer가 있습니다. 도구를 사용하는 가장 쉬운 방법은 게시된 Docker 이미지를 사용하는 것입니다. 최신 x86 버전은 여기에서, ARM 버전은 여기에서 확인하세요. Docker가 실행 중인 상태에서 다음 명령어를 실행하여 컨트랙트 코드를 /code에 마운트하고 출력을 최적화하세요(먼저 디렉토리로 cd하지 않으려면 $(pwd) 대신 절대 경로를 사용할 수 있습니다):
CosmWasm은 ARM64 버전의 컴파일러가 Intel/AMD 버전과 다른 Wasm 아티팩트를 생성하기 때문에 사용을 권장하지 않습니다. 릴리스/프로덕션의 경우 Intel/AMD 옵티마이저로 빌드된 컨트랙트만 사용하는 것이 좋습니다. CosmWasm의 참고 사항은 여기를 참조하세요.
명령 실행 중 Unable to update registry `crates-io` 오류가 발생할 수 있습니다. 컨트랙트 디렉토리 내의 Cargo.toml 파일에 다음 줄을 추가하고 명령을 다시 실행해 보세요:
이것은 PROJECT_NAME.wasm과 Wasm 파일의 Sha256 해시가 포함된 checksums.txt가 있는 artifacts 디렉토리를 생성합니다. Wasm 파일은 결정론적으로 컴파일됩니다(동일한 git 커밋에서 동일한 docker를 실행하는 다른 사람도 동일한 Sha256 해시를 가진 동일한 파일을 얻어야 합니다).
injectived는 Injective에 연결하고 Injective 블록체인과 상호작용할 수 있게 해주는 명령줄 인터페이스 및 데몬입니다.CLI를 사용하여 로컬에서 스마트 컨트랙트와 상호작용하려면 injectived가 설치되어 있어야 합니다. injectived 설치 가이드의 설치 지침을 따르세요.또는 이 튜토리얼을 더 쉽게 만들기 위해 Docker 이미지가 준비되어 있습니다.
바이너리에서 injectived를 설치하면 docker 명령을 무시하세요.
공개 엔드포인트 섹션에서 메인넷 및 테스트넷과 상호작용하기 위한 올바른 —node 정보를 찾을 수 있습니다.
이 명령을 실행하면 docker 컨테이너가 무기한 실행됩니다.
복사
AI에게 묻기
docker run --name="injective-core-staging" \-v=<directory_to_which_you_cloned_cw-template>/artifacts:/var/artifacts \--entrypoint=sh public.ecr.aws/l9h3g6c6/injective-core:staging \-c "tail -F anything"
참고: directory_to_which_you_cloned_cw-template은 절대 경로여야 합니다. CosmWasm/cw-counter 디렉토리 내에서 pwd 명령을 실행하면 절대 경로를 쉽게 찾을 수 있습니다.새 터미널을 열고 Docker 컨테이너에 들어가 체인을 초기화합니다:
복사
AI에게 묻기
docker exec -it injective-core-staging sh
나중에 필요한 jq 종속성을 추가하는 것으로 시작하겠습니다:
복사
AI에게 묻기
# "injective-core-staging" 컨테이너 내부에서apk add jq
이제 로컬 체인 초기화를 진행하고 testuser라는 테스트 사용자를 추가할 수 있습니다(프롬프트가 나타나면 비밀번호로 12345678을 사용하세요). 테스트 사용자를 사용하여 나중에 테스트넷에서 메시지에 서명하는 데 사용될 새 개인 키를 생성합니다:
- name: testuser type: local address: inj1exjcp8pkvzqzsnwkzte87fmzhfftr99kd36jat pubkey: '{"@type":"/injective.crypto.v1beta1.ethsecp256k1.PubKey","key":"Aqi010PsKkFe9KwA45ajvrr53vfPy+5vgc3aHWWGdW6X"}' mnemonic: ""**Important** write this mnemonic phrase in a safe place.It is the only way to recover your account if you ever forget your password.wash wise evil buffalo fiction quantum planet dial grape slam title salt dry and some more words that should be here
이제 Injective 테스트넷에 testuser를 성공적으로 만들었습니다. faucet에서 testnet 자금을 요청한 후 잔액도 보유해야 합니다.확인하려면 Injective 테스트넷 익스플로러에서 주소를 검색하여 잔액을 확인하세요.또는 은행 잔액 쿼리나 curl로 확인할 수 있습니다:
복사
AI에게 묻기
curl -X GET "https://sentry.testnet.lcd.injective.network/cosmos/bank/v1beta1/balances/<your_INJ_address>" -H "accept: application/json"
이제 이전 단계에서 컴파일한 .wasm 파일을 Injective 테스트넷에 업로드할 시간입니다. 메인넷의 절차는 다르며 거버넌스 제안이 필요합니다.
복사
AI에게 묻기
# "injective-core-staging" 컨테이너 내부에서 또는 로컬로 injectived를 실행하는 경우 컨트랙트 디렉토리에서yes 12345678 | injectived tx wasm store artifacts/my_first_contract.wasm \--from=$(echo $INJ_ADDRESS) \--chain-id="injective-888" \--yes --fees=1000000000000000inj --gas=2000000 \--node=https://testnet.sentry.tm.injective.network:443
다른 스마트 컨트랙트 함수와 마찬가지로 bank send 기능이 예상대로 작동하는지 확인하기 위해 단위 테스트를 추가해야 합니다. 여기에는 다양한 토큰 금액 전송 및 오류 처리와 같은 다양한 시나리오 테스트가 포함됩니다.로컬 Injective 체인을 포함한 통합 테스트 실행에는 test-tube를 사용할 수 있습니다.축하합니다! 첫 번째 Injective 스마트 컨트랙트를 만들고 상호작용했으며 이제 Injective에서 CosmWasm 개발을 시작하는 방법을 알게 되었습니다. 웹 UI 생성 가이드는 컨트랙트용 프론트엔드 생성을 계속하세요.