BLOG
웹 3.0 프로토콜의 상용화로 인해 분산 금융(DeFi) 및 블록체인 디지털 자산 토큰화(공개 및 사설 모두) 영역에서 애플리케이션이 폭발적으로 증가하였습니다. NFT(Non-Fungible Token)는 디지털 자산의 소유권 및 신뢰성 증명을 제공할 수 있다는 점에서 큰 인기를 얻고 있습니다. 많은 대기업, 특히 대규모 지적 재산을 보유한 기업은 NFT 형태의 디지털 항목, 수집품, 콘텐츠 등을 사용하여 새로운 고객 경험과 제품 제공을 구축하기 위해 노력하고 있습니다.
Fungibility(대체 가능성)의 개념은 자산이 같은 종류의 다른 자산과 동등하게 교환될 수 있는 능력을 나타냅니다. 대체 가능한 자산의 실제적인 예는 미국 달러로, 보유하고 있는 달러에 관계없이 가치가 동일하여 1달러를 다른 달러와 교환할 수 있습니다. 대체 가능 자산과 달리 대체 불가능 자산은 고유한 속성과 희소성에 따라 다르게 평가됩니다. 야구 카드와 같은 수집품이 여기에 해당됩니다.
NFT를 생성하려는 개발자는 이더리움 네트워크와 같은 퍼블릭 블록체인에 필요한 기능을 가진 스마트 계약을 배포하여야 합니다. 현재 ERC-721을 포함하여 잘 정립된 여러 NFT 스마트 계약 표준이 있는데요, 오늘 포스팅에서 이러한 표준 계약을 배포하는 방법을 배워 보겠습니다. Amazon Managed Blockchain을 사용하면 NFT 개발자들은 블록체인 거래를 중계하거나 블록체인 데이터 상태를 쿼리하기 위해 신뢰할 수 있는 이더리움 노드를 유지에 하는 것에 대한 걱정없이 오로지 스마트 계약 개발에만 집중할 수 있습니다
NFT 개요
Managed Blockchain을 사용하여 NFT를 구축하고 Ethereum에 배포하는 방법을 알아보기 전에 먼저 NFT의 몇 가지 중요한 개념과 응용 프로그램을 확인해 보겠습니다.이더리움 블록체인의 NFT에 대한 가장 일반적인 표준은 ERC-721입니다. 이는 지갑, 브로커 또는 경매 애플리케이션이 이더리움 블록체인의 모든 NFT와 함께 작동할 수 있도록 하는 인터페이스를 규정합니다. 다른 잘 알려진 표준에는 대체 가능한 토큰에 대한 ERC-20과 반 대체 가능한 토큰에 대한 ERC-1155가 있습니다. Ethereum에서 토큰은 Solidity로 작성된 스마트 계약입니다. NFT 개발자는 토큰 소유자가 다양한 방식으로 계약을 맺고 상호 작용할 수 있도록 스마트 계약을 사용자 지정할 수 있습니다.
NFT에는 다양한 사용 사례가 있습니다.
- 디지털 아트 – NFT 아트 시장은 2021년 3분기까지 35억 달러 이상의 매출을 기록했으며, Sotheby’s와 같은 경매 회사는 NFT 전용 마켓플레이스를 출시하기도 했습니다.
- 스포츠 기념품 – NFT는 실제 카드 컬렉션과 같은 디지털 수집품을 완전한 디지털 형식으로 제시할 수 있으며, 스포츠 단체는 스포츠의 상징적인 순간을 NFT로 토큰화하여 팬들의 참여도를 높일 수 있습니다.
- 게임 – 블록체인 기반 게임과 수집품의 게임 내 구매는 게임 회사의 성장하는 수익원이 되었습니다.
- 이벤트 티켓팅 – 아티스트와 경기장은 기억에 남는 콘서트 경험을 위한 사기 방지 티켓과 장소를 제공하여 팬들과 소통할 수 있습니다.
- 공급망 – 공급망의 다양한 접점을 따라 개선된 추적성, 투명성 및 소유권 증명은 기업이 ESG 보고 요구 사항을 충족하는 데 도움이 될 수 있습니다.
- 특허 – Illiquid 지적 재산은 특허 소유자가 토큰화할 수 있으며 출처 및 진정성을 보장하여 거래에 사용할 수 있습니다.
솔루션 개요
솔루션에 대한 다음의 참조 아키텍처를 통해 NFT 작성자는 ERC-721 계약을 공개 Ethereum Rinkeby 테스트넷 및 mint NFT에 배포할 수 있습니다.
이 예에서 NFT 작성자는 Managed Blockchain의 인스턴스에서 실행되는 Ethereum Geth 노드를 통해 Ethereum의 Rinkeby 테스트넷에서 거래할 수 있습니다. NFT 생성을 시작하기 위해 JSON RPC 요청이 Amazon API Gateway REST API 엔드포인트로 전송되어 AWS Lambda로 요청을 전달합니다.
프록시 통합으로 구성된 Lambda는 토큰을 배포하고 발행하고 소유권을 가져오는 논리를 구현합니다. 서명된 트랜잭션을 이더리움 블록체인으로 보내는 Managed Blockchain HTTP 끝점으로 요청을 전달합니다. 이더리움 네트워크로 전송된 거래는 네트워크 트래픽과 지불한 gas 요금에 따라 확인하는 데 몇 분이 걸릴 수 있습니다. 이 경우 거래가 취소되지 않도록 블록체인에서 고정된 최소 확인 횟수(구성 가능한 매개변수)가 완료될 때까지 기다리는 것이 좋습니다. Lambda의 가능한 시간 초과를 방지하기 위해 AWS Fargate 작업은 블록체인을 폴링하여 필요한 확인 횟수를 확인합니다. 필요한 수의 확인이 완료되면 Fargate가 NFT 개발자에게 Amazon Simple Notification Service(Amazon SNS)를 보냅니다.
다음 단계에 따라 솔루션을 배포합니다.
- 전제 조건을 설정합니다.
- Ethereum 노드, API Gateway, Lambda, Fargate, SNS 주제 및 Amazon Simple Storage Service (Amazon S3) 버킷으로 구성된 NFT 스택을 배포합니다.
- JSON RPC 명령을 보내 스마트 계약을 배포하거나 토큰을 발행합니다.
코드 리포지토리는 GitHub에서 사용할 수 있습니다.
전제 조건
이 연습의 경우 다음 전제 조건이 있어야 합니다.
- AWS 계정의 VPC 및 공공 서브넷
- 설치된 AWS SAM CLI
- npm 패키지 관리 도구를 포함한 Node.js 14
- Docker 커뮤니티 에디션
GitHub 리포지토리를 복제하여 시작합니다.
git clone https://github.com/aws-samples/nft-deployment-amazon-managed-blockchain.git
Ethereum 노드 및 서버리스 구성 요소 배포
우리는 AWS Serverless Application Model (AWS SAM) 템플릿을 사용하여 스택을 배포합니다.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── images
└── serverless
cd serverless/
sam build
….
Building codeuri: serverless/lambdas/nftmain runtime: nodejs14.x metadata: {} architecture: x86_64 functions: [‘nftmain’]
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrc
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc
Build Succeeded
빌드가 완료되면 스택을 배포합니다.
sam deploy –guided –capabilities CAPABILITY_NAMED_IAM
매개변수 값을 입력하고 배포할 변경 사항을 확인합니다.
Stack Name [nft-stack]: #name of stack
AWS Region [ap-southeast-1]: # region where Amazon Managed Blockchain is supported
Parameter pEmail [name@example.com]: # email id to receive Amazon SNS messages
Parameter pSubnetId [subnet-xxxxxxx]: # public subnet to run AWS Fargate task
Parameter pNftBucketName [nftmetadata]: # bucket to store NFT metadata
Parameter pConfirmationBlocks [50]: # number of confirmations to await
Parameter pClusterName [nftcluster]: # Amazon ECS cluster name
Parameter pContainerName [rinkeby]: # name of container
Parameter pRepositoryName [nftrepository]: #Amazon ECR to store Docker images
Parameter pIpRangeWhitelist [**.**.**.**/**]: #Whitelisted IP CIDR block
Parameter pNetworkId [n-ethereum-rinkeby]: #default network is Rinkeby
Parameter pInstanceType [bc.t3.large]: #choose desired instance size
Parameter pAvailabilityZone [ap-southeast-1a]: # choose AZ based on region
Confirm changes before deploy [Y/n]: # confirm changes Y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: # choose Y
Save arguments to configuration file [Y/n]: # choose Y
SAM configuration file [samconfig.toml]: # default file to save the samconfig
SAM configuration environment [default]:
AWS SAM 배포는 다음 스크린샷과 같이 AWS CloudFormation 스택 변경 집합을 생성합니다.
배포 후 다음 리소스가 생성됩니다.
- Ethereum node– Rinkeby 테스트 네트워크에 연결된 관리형 블록체인 이더리움 노드입니다.
- nftMetadataBucket – NFT 메타데이터 파일을 저장하는 S3 버킷입니다.
- Nftmain – ERC-721 계약을 Ethereum Rinkeby 테스트 네트워크에 배포하고, 새 토큰을 발행하고, 지정된 토큰의 소유자를 발행하기 위한 API를 제공하는 Lambda 함수입니다. 계약이 성공적으로 배포되면 SNS 메시지가 게시됩니다.
- invokeFargateTask – 이 Lambda 함수는 nftmain Lambda 함수에 의해 게시된 SNS 메시지에 의해 트리거됩니다. Rinkeby 블록체인이 계약 배포 트랜잭션을 고정되지만 구성 가능한 횟수로 확인할 때까지 기다리는 Fargate 작업을 호출합니다. 기본 확인 횟수는 50으로 설정됩니다.
- ethTxnTopic – nftmain성공적인 계약 배포 시 함수가 트랜잭션 ID를 게시하는 SNS 주제입니다.
- ethConfirmationTopic – Fargate 작업이 Rinkeby 네트워크에서 50개의 확인을 완료하면 메시지를 게시하는 SNS 주제입니다.
- cluster 및 taskDefinition – 확인 논리에 대한 계산을 제공하는 Fargate 클러스터 및 작업 정의입니다.
- Nftapi – NFT 작성자가 JSON RPC 요청을 보낼 수 있도록 하는 API 게이트웨이 REST API 끝점입니다.
- ecrRepository – Docker 이미지가 저장되는 Amazon Elastic Container Registry (Amazon ECR)입니다.
Docker 이미지를 생성하고 Amazon ECR에 푸시
배포를 완료하려면 Docker 이미지를 생성하고 다음 이미지를 빌드, 태그 지정 및 푸시하여 Amazon ECR에 푸시합니다.
aws ecr get-login-password –region <region> | docker login –username AWS –password-stdin <account id>.dkr.ecr.<region>.amazonaws.com
docker build -t nftrepository .
docker tag nftrepository:latest <account>.dkr.ecr.<region>.amazonaws.com/nftrepository:latest
docker push <account>.dkr.ecr.<region>.amazonaws.com/nftrepository:latest
네트워크에서 트랜잭션 서명을 위한 개인 키 생성
Ethereum Rinkeby 네트워크에서 트랜잭션을 생성하려면 개인-공개 키 쌍이 필요합니다. 인기 있는 이더리움 라이브러리 Web3 및 Ethers를 사용하여 프로그래밍 방식으로 자신만의 이더리움 지갑을 만들 수 있습니다 .
이 지갑이 실제 자금으로 사용되지 않도록 각별히 주의하십시오. 프라이빗 키를 생성하고 ethSystemKey 아래에 암호화된 문자열로 AWS Systems Manager Parameter Store에 업로드합니다. 보안 문자열 값이 개인 키의 처음 두 문자 0x를 제외하도록 합니다.
공개 키를 입력하고 https://faucet.rinkeby.io/ 테스트 토큰을 요청하여 Rinkeby 네트워크용 이더리움 테스트 토큰을 추가합니다. 지출 키(개인 키)에는 특별한 주의가 필요하며 AWS Systems Manager 는 경우에 따라 실제 자금을 보관하는 지갑에 적합하지 않을 수 있습니다.
참고: 위의 Rinkeby faucet에서 테스트넷 Ether를 요청하는 데 문제가 있는 경우 Chainlink Faucet을 사용하여 소량의 테스트넷 Ether를 얻을 수 있습니다.
테스트 계약 배포, NFT 발행 및 토큰 소유권 확인
이제 ERC-721 스마트 계약을 네트워크에 배포할 준비가 되었습니다. 배포할 계약은 다음 NFTSamples 아래의 nftmain 디렉토리에 저장됩니다 .
.
├── NFTSamples
│ ├── build
│ │ └── NFT_BaseURI.json
│ └── contracts
│ ├── NFTSample.sol
│ └── NFT_BaseURI.sol
├── aws-web3-http-provider.js
├── deploy_contract.js
├── get_owner.js
├── index.js
├── mint_nft.js
├── package-lock.json
├── package.json
└── utils.js
NFT를 배포하고 발행하기 위해 curl -X POST를 사용합니다. 아래 APIs page의 Stages상의 API 게이트웨이 콘솔에서 API 엔드 포인트(InvokeURL)를 구합니다.
cd serverless/test-events
serverless/test-events
├── deploy.json
├── getowner.json
└── mint.json
1.NFT 메타데이터 값을 입력하도록 deploy.json 파일을 편집합니다.
cat deploy.json
{
“requestType”: “deploy”,
“tokenName”: “coolnft”,
“tokenTicker”: “SYMB”,
“metadataFilename”: “metadata.json”,
“metadata”: {
“description”: “useful descriptiom”,
“image”: “<url of the image, eg. an IPFS URL hash>”,
“name”: ” My cool nft”
}
}
- Rinkeby 네트워크에 계약을 배포합니다.
curl -X POST https://<api>.execute-api.<region>.amazonaws.com/nftapi -H “Content-Type: application/json” -d @deploy.json
배포 호출은 트랜잭션 ID 해시와 계약 주소를 반환합니다.
{“Transaction id”:”0x6b2af81c34055b678e5a8ae401f508fcbf950341df7e55e7372e80f75faf8afc”,”ContractAddress”:”0x8A3Ce65B266E8DE37Fe7d2e4911CA4578B5a7445″
}
3. 배포 명령에서 반환된 계약 주소와 상호 작용하여 토큰을 발행합니다.
mintAddress는 토큰의 소유권이 전송되는 퍼블릭 키 / 지갑 주소입니다.
cat mint.json
{“requestType”: “mint”,
“contractAddress”: “0x8A3Ce65B266E8DE37Fe7d2e4911CA4578B5a7445”,
“mintAddress”: “0x905b8699E611a5F1f74BF5Cc3cCa2aCd175ec0c0”
}
curl -X POST https://<api>.execute-api.<region>.amazonaws.com/nftapi -H “Content-Type: application/json” -d @mint.json
응답에는 트랜잭션 ID 해시가 포함됩니다.
{“Mint Tx Hash”:”0x960080892462ea76a90a5a00fe88ebc5d85d0b84d75e781ca5aa14e5829a0a14″}
4. 발행된 토큰 소유자의 주소를 검색합니다.
cat getowner.json
{“requestType”: “mint”,
“contractAddress”: “0x8A3Ce65B266E8DE37Fe7d2e4911CA4578B5a7445”,
“tokenID”: “0“
}
curl -X POST https://<api>.execute-api.<region>.amazonaws.com/nftapi -H “Content-Type: application/json” -d @getowner.json
응답은 토큰이 발행된 소유자의 주소를 제공합니다.
{“Owner address”:”0x905b8699E611a5F1f74BF5Cc3cCa2aCd175ec0c0″}
정리
완료되면 향후 요금이 발생하지 않도록 배포된 리소스를 삭제합니다.
- Nftmetadata S3 버킷을 비웁니다.
- 스택에서 생성한 Amazon Elastic Container Service (Amazon ECS) 리포지토리에서 모든 Docker 이미지를 삭제합니다.
- ethSystemKey매개변수 저장소에서 매개변수를 삭제합니다.
- 마지막으로 배포된 스택을 삭제합니다.
> cd serverless
sam delete nft-stack
결론
이번 포스팅에서는 관리형 블록체인을 이더리움 노드로 사용하는 이더리움 블록체인에서 NFT용 ERC-721 스마트 계약을 배포하는 과정을 알아보았습니다. 특히 NFT 크리에이터를 위한 백엔드 처리 메커니즘을 소개해드렸습니다.
향후에는 NFT 제작자가 NFT 고객과 상호 작용할 수 있도록 분산 응용 프로그램 및 NFT 상점을 설정하는 방법에 대해 알아볼 예정입니다. 앞으로다루었으면 하는 다른 Web3.0 주제가 있다면 알려주세요!
메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글이나 관련 기사 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.