본문으로 건너뛰기

뼈대 및 Rust 아키텍처

In this article, you'll learn about the basic architecture behind the NFT contract that you'll develop while following this "Zero to Hero" series.

You'll discover the contract's layout and you'll see how the Rust files are structured in order to build a feature-complete smart contract.

Skeleton Contract You can find the skeleton contract in our GitHub repository :::
Rust가 처음이신가요? If you are new to Rust and want to dive into smart contract development, our Quick-start guide is a great place to start. :::

소개

이 튜토리얼은 NFT 스마트 컨트랙트의 코드 뼈대와 파일 구조를 보여줍니다.

Once every file and functions have been covered, we will guide you through the process of building the mock-up contract to confirm that your Rust setup works.


파일 구조

Following a regular Rust project, the file structure for this smart contract has:

nft-contract
├── Cargo.lock
├── Cargo.toml
├── README.md
└── src
├── approval.rs
├── enumeration.rs
├── lib.rs
├── metadata.rs
├── mint.rs
├── nft_core.rs
├── events.rs
└── royalty.rs
  • The file Cargo.toml defines the code dependencies
  • The src folder contains all the Rust source files

소스 파일

Here is a brief description of what each source file is responsible for:

파일설명
approval.rsHas the functions that controls the access and transfers of non-fungible tokens
enumeration.rsContains the methods to list NFT tokens and their owners
lib.rsHolds the smart contract initialization functions
metadata.rsDefines the token and metadata structure
mint.rsContains token minting logic
nft_core.rs사용자 간에 NFT를 전송할 수 있는 내부 핵심 로직을 포함합니다.
royalty.rsContains payout-related functions
events.rsContains events related structures
Explore the code in our GitHub repository. :::

approval.rs

이를 통해 사람들은 다른 계정을 NFT를 대신 전송할 수 있게끔 승인할 수 있습니다.

이 파일에는 표준의 승인 관리 확장을 준수하는 내부 로직이 포함되어 있습니다. 다음은 메서드 및 함수에 대한 분석입니다.

메서드설명
nft_approve사용자를 대신하여 토큰을 전송할 계정 ID를 승인합니다.
nft_is_approved입력 계정에 토큰 ID를 승인할 수 있는 액세스 권한이 있는지 확인합니다.
nft_revoke사용자를 대신하여 토큰을 전송하는 특정 계정을 취소합니다.
nft_revoke_all사용자를 대신하여 토큰을 전송하는 모든 계정을 취소합니다.
nft_on_approve이 콜백 함수는 nft_approve에 의해 시작되어, 외부 컨트랙트로의 교차 컨트랙트 호출을 실행합니다.

You'll learn more about these functions in the approvals section of the Zero to Hero series.


enumeration.rs

이 파일은 NFT에 대한 정보를 보는 데 필요한 내부 함수들을 제공하며 표준의 열거(Enumeration) 확장자를 따릅니다.

메서드설명
nft_total_supplyReturns the total amount of NFTs stored on the contract
nft_tokens소유자와 관계없이 컨트랙트에 저장된 페이지가 매겨진 NFT 목록을 반환합니다.
nft_supply_for_ownerAllows you view the total number of NFTs owned by any given user
nft_tokens_for_ownerReturns a paginated list of NFTs owned by any given user

튜토리얼 시리즈의 열거 섹션에서 이러한 함수에 대해 자세히 알아볼 수 있습니다.


lib.rs

이 파일은 컨트랙트가 저장하고 추적하는 정보를 간략하게 설명합니다.

메서드설명
new_default_meta기본 metadata를 이용해 컨트랙트를 초기화해, 사용자가 입력값을 제공하지 않아도 되도록 합니다.
new사용자가 제공한 metadata로 컨트랙트를 초기화합니다.
기억해 두세요 초기화 함수(new, new_default_meta) 한 번만 호출될 수 있습니다. :::

튜토리얼 시리즈의 발행 섹션에서 이러한 기능에 대해 자세히 알아볼 것입니다.


metadata.rs

이 파일은 토큰 및 메타데이터에 대해 저장할 정보를 추적하는 데 사용됩니다. 또한 표준 메타데이터 확장의 일부인 컨트랙트의 메타데이터를 보는 기능을 정의할 수 있습니다.

이름설명
TokenMetadataThis structure defines the metadata that can be stored for each token (title, description, media, etc.).
Token이 구조는 각 토큰에 대한 컨트랙트에 어떤 정보가 저장될 것인지를 설명합니다.
JsonTokenView 호출을 통해 NFT에 대한 정보를 조회할 때, 반환된 정보는 이 JSON 토큰에 저장됩니다.
nft_metadata이 함수를 통해 사용자는 컨트랙트의 내부 메타데이터를 쿼리할 수 있습니다.

튜토리얼 시리즈 내 발행 섹션에서 이러한 함수에 대해 더 많이 배울 수 있습니다.


mint.rs

Contains the logic to mint the non-fungible tokens

메서드설명
nft_mint이 함수는 대체 불가능 토큰을 생성합니다.

nft_core.rs

Core logic that allows to transfer NFTs between users.

메서드설명
nft_transferNFT를 수신자 ID로 전송합니다.
nft_transfer_callNFT가 nft_transfer_call 메서드를 통해 컨트랙트 계정으로 전송될 때 다른 컨트랙트에 의해 호출됩니다. 토큰이 보낸 사람에게 다시 반환되어야 하면 true를 반환합니다.
nft_token사용자가 특정 NFT에 대한 정보를 쿼리할 수 있도록 합니다.
nft_on_transfernft_transfer_call을 시작하고 NFT를 전송할 때 표준에 따르면 수신자의 컨트랙트에 있는 메서드도 호출해야 합니다. 수신자가 발신자에게 NFT를 반환해야 하는 경우(nft_on_transfer 메서드의 반환 값에 따라) 이 함수를 사용하면 해당 로직을 실행할 수 있습니다.
nft_resolve_transfernft_transfer_call을 시작하고 NFT를 전송할 때의 표준에 따르면, 수신자의 컨트랙트에 있는 메서드도 호출해야 합니다. 수신자가 발신자에게 NFT를 반환해야 하는 경우(nft_on_transfer 메서드의 반환 값에 따라) 이 함수를 사용하면 해당 로직을 실행할 수 있습니다.

You'll learn more about these functions in the core section of the tutorial series.


royalty.rs

내부 지불 관련 함수를 포함합니다.

메서드설명
nft_payout이 view 메서드는 주어진 토큰에 대한 지불금을 계산합니다.
nft_transfer_payout토큰을 수신자 ID로 전송하고 주어진 잔고에 대해 지불해야 하는 지불 객체를 반환하는 내부 메서드입니다.

튜토리얼 시리즈의 로열티 섹션에서 이러한 함수들에 대해 자세히 알아볼 수 있습니다.


events.rs

Contains events-related structures.

MethodDescription
EventLogVariantThis enum represents the data type of the EventLog.
EventLogInterface to capture data about an event.
NftMintLogAn event log to capture token minting.
NftTransferLogAn event log to capture token transfer.

You'll learn more about these functions in the events section of the tutorial series.


뼈대 구축

아직 기본 레퍼지토리를 복제하지 않은 경우 터미널을 열고 다음을 실행합니다.

git clone https://github.com/near-examples/nft-tutorial/

Next, go to the nft-contract-skeleton/ folder and build the contract with cargo-near:

cd nft-tutorial
cd nft-contract-skeleton/
cargo near build

이 소스는 뼈대일 뿐이므로 다음과 같이 사용하지 않는 코드에 대한 많은 경고를 받게 됩니다.

   Compiling nft_contract_skeleton v0.1.0 (/Users/near-examples/Documents/my/projects/near/examples/nft-tutorial/nft-contract-basic)
│ warning: unused imports: `LazyOption`, `LookupMap`, `UnorderedMap`, `UnorderedSet`
│ --> src/lib.rs:3:29
│ |
│ 3 | use near_sdk::collections::{LazyOption, LookupMap, UnorderedMap, UnorderedSet};
│ | ^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^
│ |
│ = note: `#[warn(unused_imports)]` on by default

│ warning: unused import: `Base64VecU8`
│ --> src/lib.rs:4:28
│ |
│ 4 | use near_sdk::json_types::{Base64VecU8, U128};
│ |

│ warning: `nft_contract_skeleton` (lib) generated 48 warnings (run `cargo fix --lib -p nft_contract_skeleton` to apply 45 suggestions)
│ Finished release [optimized] target(s) in 11.01s
✓ Contract successfully built!

이러한 경고에 대해 걱정하지 마세요. 아직 이 컨트랙트를 배포하지 않을 것입니다. 뼈대 구축하는 것은 Rust 툴체인이 제대로 작동하는지 확인하는 것이고, 이는 다음 튜토리얼에서 이 NFT 컨트랙트의 개선된 버전을 컴파일할 수 있는지 확인하는 데 유용합니다.


결론

이 NFT 스마트 컨트랙트의 레이아웃과 다양한 소스 파일에 모든 함수가 어떻게 배치되어 있는지 확인했습니다. Using yarn, you've been able to compile the contract, and you'll start fleshing out this skeleton in the next Minting tutorial.

이 문서의 버전 관리 이 글을 쓰는 시점에서 이 예제는 다음 버전에서 작동합니다.
  • rustc: 1.76.0
  • near-sdk-rs: 5.1.0
  • cargo-near: 0.6.1
  • NFT standard: NEP171, version 1.0.0
Was this page helpful?