이 튜토리얼에서는 Neo 블록체인에서의 예제 컨트랙트를 통해 개발 환경 설정 및 구성, 컴파일, 배포, 그리고 프라이빗 체인과 테스트넷에서의 스마트 컨트랙트 호출 작업을 안내합니다. 이 튜토리얼은 기본적인 개발 및 테스트 환경을 구축하고, 주요 기술 개념들을 강조하는 것을 목적으로 합니다.
이 튜토리얼은 다음 주제들을 포함합니다:
다음과 같은 테스트된 환경에서 Neo-CLI를 실행하는 것을 권장합니다:
Neo는 라이브 네트워크에 게시하기 전에 프로그램을 개발, 디버그 및 테스트할 수 있는 테스트 네트워크를 제공합니다. 테스트넷에 노드를 연결하려면 여기의 자세한 지침을 참조하세요.
또는 충분한 테스트 토큰으로 더 많은 유연성을 얻을 수 있는 자체 프라이빗 체인을 설정할 수도 있습니다.
다음 옵션 중 하나를 선택할 수 있습니다:
단일 노드로 프라이빗 체인 구축
Neo-CLI는 합의 노드 없이 블록 생성을 지원하므로, 단일 노드로 프라이빗 체인을 설정할 수 있습니다. 이를 달성하는 방법은 두 가지가 있으며, 원하는 방법을 선택할 수 있습니다.
다중 노드로 프라이빗 체인 구축
합의 메커니즘을 연습하기 위해 다중 노드로 프라이빗 체인을 구축할 수도 있습니다. 가이드에서 Windows 시스템 컴퓨터에서 프라이빗 체인을 구축하는 방법을 보여줍니다.
위 링크의 지침을 참조하여 프라이빗 체인을 설정하고 제네시스 블록에서 NEO와 GAS를 인출하세요.
이제 스마트 컨트랙트 배포에 사용할 새로운 지갑 파일을 생성해보겠습니다:
공식 가이드를 참조하여 도구와 컨트랙트 템플릿을 설치한 후, 다음 명령으로 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 플러그인을 설치하기 위해 다음 옵션들을 사용할 수 있으며, 원하는 것을 선택할 수 있습니다.
crx 릴리스를 가져옵니다.NeoLine을 설치하고 브라우저 바로가기에 고정한 후, 아래 gif를 참조하여 지갑을 생성하세요.

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

위의 지침을 완료한 후, 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));
자세한 내용은 다음 링크를 확인하세요: