Neo N3 블록체인 컨트렉트 개발 입문 튜토리얼

네오 블록체인·2025년 8월 22일

Neo N3

목록 보기
1/8

이 튜토리얼에서는 Neo 블록체인에서의 예제 컨트랙트를 통해 개발 환경 설정 및 구성, 컴파일, 배포, 그리고 프라이빗 체인과 테스트넷에서의 스마트 컨트랙트 호출 작업을 안내합니다. 이 튜토리얼은 기본적인 개발 및 테스트 환경을 구축하고, 주요 기술 개념들을 강조하는 것을 목적으로 합니다.

이 튜토리얼은 다음 주제들을 포함합니다:

개발 환경

시스템 환경

다음과 같은 테스트된 환경에서 Neo-CLI를 실행하는 것을 권장합니다:

  • Windows 10
  • Ubuntu 16.04/18.04
  • CentOS 7.4/7.6
  • macOS Big Sur/버전 11.1

네트워크 연결

Neo는 라이브 네트워크에 게시하기 전에 프로그램을 개발, 디버그 및 테스트할 수 있는 테스트 네트워크를 제공합니다. 테스트넷에 노드를 연결하려면 여기의 자세한 지침을 참조하세요.

또는 충분한 테스트 토큰으로 더 많은 유연성을 얻을 수 있는 자체 프라이빗 체인을 설정할 수도 있습니다.

프라이빗 체인 설정

다음 옵션 중 하나를 선택할 수 있습니다:

  • 단일 노드로 프라이빗 체인 구축

    Neo-CLI는 합의 노드 없이 블록 생성을 지원하므로, 단일 노드로 프라이빗 체인을 설정할 수 있습니다. 이를 달성하는 방법은 두 가지가 있으며, 원하는 방법을 선택할 수 있습니다.

    • Neo-Private-Net 프로젝트를 직접 다운로드하여 프라이빗 체인을 빠르게 실행합니다.
    • 또는 처음부터 단일 노드로 프라이빗 체인을 구축합니다. 자세한 내용은 가이드를 확인하세요.
  • 다중 노드로 프라이빗 체인 구축

    합의 메커니즘을 연습하기 위해 다중 노드로 프라이빗 체인을 구축할 수도 있습니다. 가이드에서 Windows 시스템 컴퓨터에서 프라이빗 체인을 구축하는 방법을 보여줍니다.

위 링크의 지침을 참조하여 프라이빗 체인을 설정하고 제네시스 블록에서 NEO와 GAS를 인출하세요.

지갑 파일 준비

이제 스마트 컨트랙트 배포에 사용할 새로운 지갑 파일을 생성해보겠습니다:

  1. 0.json이라는 이름의 새로운 지갑 파일을 생성하고 나중에 사용할 기본 주소를 복사합니다.
  2. 제네시스 블록에서 NEO와 GAS를 인출한 지갑을 열고, 지갑의 모든 자산을 0.json으로 이체하고 거래가 확인될 때까지 기다립니다.
  3. 0.json을 열어 자산이 수신되었는지 확인합니다.

컨트랙트 개발

개발 도구 구성

공식 가이드를 참조하여 도구와 컨트랙트 템플릿을 설치한 후, 다음 명령으로 Contract1이라는 컨트랙트 프로젝트를 생성합니다:

dotnet new neo3-contract -n Contract1

컨트랙트 편집

여기서는 C#으로 작성된 간단한 스마트 컨트랙트를 제공합니다. 소스 코드는 다음과 같습니다:

using Neo.SmartContract.Framework;
using Neo.SmartContract.Framework.Native;
using Neo.SmartContract.Framework.Services;
using System;
using System.ComponentModel;
using Neo;
using Neo.SmartContract;

namespace Example
{
    [ManifestExtra("Email", "dev@neo.org")]
    [ManifestExtra("Description", "This is a example contract")]
    public class Contract1 : SmartContract
    {
        //TODO: Replace it with your own address.
        [InitialValue("NiNmXL8FjEUEs1nfX9uHFBNaenxDHJtmuB", ContractParameterType.Hash160)]
        static readonly UInt160 Owner = default;

        private static bool IsOwner() => Runtime.CheckWitness(Owner);

        // When this contract address is included in the transaction signature,
        // this method will be triggered as a VerificationTrigger to verify that the signature is correct.
        // For example, this method needs to be called when withdrawing token from the contract.
        public static bool Verify() => IsOwner();

        // TODO: Replace it with your methods.
        public static string MyMethod()
        {
            return Storage.Get(Storage.CurrentContext, "Hello");
        }

        // This method will be executed immediately after the contract is deployed.
        public static void _deploy(object data, bool update)
        {
            if (update) return;

            // It will be executed during deploy
            Storage.Put(Storage.CurrentContext, "Hello", "World");
        }

        public static void Update(ByteString nefFile, string manifest)
        {
            if (!IsOwner()) throw new Exception("No authorization.");
            ContractManagement.Update(nefFile, manifest, null);
        }

        public static void Destroy()
        {
            if (!IsOwner()) throw new Exception("No authorization.");
            ContractManagement.Destroy();
        }
    }
}

위의 예제 컨트랙트에서 다음 메서드들을 주목하세요:

  • Update: 이 메서드는 컨트랙트 업데이트 기능을 활성화합니다. 호출되면 컨트랙트가 업그레이드되며 컨트랙트 해시나 스토리지 영역은 변경되지 않습니다. 여기를 참조하여 컨트랙트를 업데이트할 수 있습니다.
  • Destroy: 이 메서드는 인수를 받지 않습니다. 호출되면 컨트랙트와 해당 스토리지(있는 경우)가 삭제됩니다. 그 후 컨트랙트는 더 이상 사용할 수 없습니다.

컨트랙트 컴파일

다음 명령을 실행하여 컨트랙트를 빌드합니다:

dotnet build

관련 컨트랙트 파일들은 컨트랙트 프로젝트 디렉토리의 \bin\Debug\net5.0 경로 아래에 출력됩니다.

컨트랙트 배포

이전에 예제 컨트랙트 파일(Contract1.nef)과 컨트랙트 설명 파일(Contract1.manifest.json)을 컴파일했습니다. 다음으로 Neo-CLI를 사용하여 컨트랙트의 배포 및 호출을 진행하겠습니다.

Neo-CLI에서 deploy <nefFilePath> [manifestFile] 명령을 입력합니다. 예를 들어:

deploy Contract1.nef

또는

deploy Contract1.nef Contract1.manifest.json

명령이 실행된 후, 컨트랙트가 배포되고 관련 수수료는 시스템에서 자동으로 차감됩니다. 자세한 정보는 공식 가이드를 참조하세요.

컨트랙트 호출

블록체인에 스마트 컨트랙트를 배포한 후, 스크립트 해시로 호출할 수 있습니다. 컨트랙트 일반 정보, 메서드, 알림 등과 같은 컨트랙트 세부 정보를 쿼리할 수 있습니다.

Neo-CLI에서 명령줄을 사용하여 컨트랙트를 호출합니다:

invoke <scriptHash> <operation> [contractParameters=null] [witnessAddress=null]

예를 들어:

invoke 0xb7f4d011241ec13db16c0e3484bdd5dd9a536f26 symbol

성공적으로 실행된 후, 다음 정보가 출력됩니다:

Invoking script with: '10c00c046e616d650c14f9f81497c3f9b62ba93f73c711d41b1eeff50c2341627d5b52'
VM State: HALT
Gas Consumed: 0.0103609
Evaluation Stack: [{"type":"ByteArray","value":"VG9rZW5TeW1ib2w="}]

relay tx(no|yes):

여기서:

  • VM State: HALT는 VM이 성공적으로 실행되었음을 나타냅니다. FAULT는 VM이 예외로 인해 실행 중에 종료되었음을 나타냅니다.

  • Evaluation Stack: 컨트랙트 실행 결과로, 값이 문자열이나 ByteArray일 때 Base64로 인코딩됩니다.

  • 여기에서 데이터 형식 변환을 할 수 있습니다. VG9rZW5TeW1ib2w= => TokenSymbol

자세한 내용은 가이드를 확인하세요.

NeoLine 지갑을 사용한 인터페이싱

블록체인에 배포된 스마트 컨트랙트와 사용자 간의 상호작용은 다양한 장치와 플랫폼에서 발생할 수 있습니다.

이 예제에서는 NeoLine 확장 플러그인 지갑을 사용하여 체인과 인터페이싱하고 간단한 사용자 인터페이스에서 결과를 노출합니다.

설치

NeoLine 플러그인을 설치하기 위해 다음 옵션들을 사용할 수 있으며, 원하는 것을 선택할 수 있습니다.

  • 원하는 체인을 빠르게 실행하기 위해 NeoLine 확장 플러그인 지갑을 직접 다운로드합니다.
  • 여기에서 최신 crx 릴리스를 가져옵니다.
  • 또는 프로젝트를 빌드합니다. 자세한 내용은 README를 확인하세요.

NeoLine 사용

NeoLine을 설치하고 브라우저 바로가기에 고정한 후, 아래 gif를 참조하여 지갑을 생성하세요.

다음은 N3 Gas를 이체하는 방법을 보여줍니다. N3 NeoTube에서 거래를 확인할 수 있습니다.

dAPI 호출

위의 지침을 완료한 후, Neo의 전체 노드를 배포하지 않고도 NeoLine의 dAPI를 호출하고 브라우저에서 직접 실행할 수 있습니다.

NeoLine N3 dAPI 초기화 예제.

window.addEventListener("NEOLine.NEO.EVENT.READY", () => {
  const neoline = new neoline.Init();
  const neolineN3 = new neolineN3.Init();
});

neolineN3.getBalance().then((result) => console.log(result));

자세한 내용은 다음 링크를 확인하세요:

profile
스마트 이코노미를 위한 퍼블릭 블록체인, 네오에 대한 모든것

0개의 댓글