fnwinter.github.io blog

솔리디티 프로그래밍 정리

솔리디티 프로그래밍 하면서 중요한 내용 정리한 페이지

  • ChatGPT를 유료 결제하면서 이제 블로그 정리할 때, 내가 안쓰고 GPT에 물어보고 답변을 정리하면 될 것 같다.

Remixd 설치하기

  • https://remix-ide.readthedocs.io/en/latest/remixd.html

Remixd는 Remix IDE(Integrated Development Environment)와 함께 사용되는 도구로, 로컬 파일 시스템을 Remix IDE와 연결하여 로컬에서 개발한 스마트 계약 파일들을 웹 기반의 Remix IDE에서 직접 접근하고 수정할 수 있도록 도와줍니다.

Remix IDE는 이더리움 스마트 계약 개발을 위한 웹 기반 IDE로, Solidity 코드를 작성, 컴파일, 배포, 디버깅하는 데 필요한 다양한 도구와 플러그인을 제공합니다. 일반적으로 웹 브라우저에서 직접 실행되지만, 로컬 파일을 쉽게 관리하기 위해서는 remixd를 사용할 수 있습니다.

Remixd 설치 및 사용 방법

  1. remixd 설치:
    • 먼저 Node.js가 설치되어 있어야 합니다.
    • 그런 다음, npm을 사용하여 remixd를 설치합니다.
    npm install -g @remix-project/remixd
    
  2. remixd 실행:
    • 로컬 디렉토리를 Remix IDE와 연결하기 위해 remixd를 실행합니다. 예를 들어, /path/to/your/project 디렉토리를 연결하려면 다음 명령을 사용합니다.
    remixd -s /path/to/your/project --remix-ide https://remix.ethereum.org
    
  3. Remix IDE에서 연결:
    • 웹 브라우저에서 Remix IDE를 엽니다.
    • 왼쪽 메뉴에서 “File Explorers”를 선택한 후, “Connect to Localhost” 버튼을 클릭합니다.
    • 연결이 성공하면, 로컬 파일 시스템에 있는 파일들이 Remix IDE에 표시됩니다.

이렇게 하면 로컬에서 개발한 Solidity 스마트 계약 파일들을 웹 기반의 Remix IDE에서 직접 접근하고 수정할 수 있으며, 이를 통해 더 편리하게 스마트 계약을 개발하고 테스트할 수 있습니다.

테스트 넷 선정

이더리움 테스트 서버(네트워크)는 스마트 계약과 분산 애플리케이션(DApp)을 실제 이더리움 메인넷에서 배포하기 전에 테스트할 수 있는 환경을 제공합니다. 주요 이더리움 테스트 네트워크는 다음과 같습니다:

  1. Ropsten Testnet:
    • 이더리움의 PoW (Proof of Work) 테스트 네트워크입니다.
    • 메인넷과 유사한 환경을 제공하며, 다양한 테스트 시나리오에 유용합니다.
  2. Rinkeby Testnet:
    • PoA (Proof of Authority) 합의 알고리즘을 사용하는 테스트 네트워크입니다.
    • 안정적이고 예측 가능한 환경을 제공하여 개발자들에게 인기가 많습니다.
  3. Goerli Testnet:
    • 여러 클라이언트를 지원하는 PoA 테스트 네트워크입니다.
    • 다양한 이더리움 클라이언트와의 호환성을 테스트하는 데 유용합니다.
  4. Kovan Testnet:
    • PoA 합의 알고리즘을 사용하는 또 다른 테스트 네트워크입니다.
    • 일반적으로 Parity 클라이언트와 함께 사용됩니다.

테스트넷 사용 방법

  1. 테스트넷 선택:
    • 테스트하려는 환경에 따라 적절한 테스트넷을 선택합니다. 일반적으로 Rinkeby 또는 Goerli를 많이 사용합니다.
  2. 테스트 이더 획득:
    • 테스트넷에서 거래를 수행하려면 테스트 이더가 필요합니다. 이를 위해 해당 테스트넷의 파우셋(faucet)에서 무료로 테스트 이더를 받을 수 있습니다.
    • 예: Rinkeby Faucet, Goerli Faucet
  3. 테스트넷에 연결:
    • 개발 도구(예: Remix IDE, Truffle, Hardhat)에서 테스트넷에 연결하여 스마트 계약을 배포하고 테스트할 수 있습니다.

예시: Remix IDE에서 Rinkeby 테스트넷 사용하기

  1. 메타마스크 설치:
    • 메타마스크를 브라우저에 설치하고 설정합니다.
    • 테스트넷 네트워크를 선택합니다. 예를 들어, Rinkeby 테스트넷.
  2. 테스트 이더 받기:
    • Rinkeby 파우셋을 사용하여 테스트 이더를 받습니다.
  3. Remix IDE 설정:
    • Remix IDE를 열고, 환경 설정에서 “Injected Web3”를 선택합니다.
    • 메타마스크와 연결하여 Rinkeby 테스트넷에 배포할 수 있습니다.
  4. Chainlink 테스트넷 파우셋을 사용하여 Sepolia에서 스마트 계약을 테스트하기 위한 테스트넷 ETH 토큰을 요청할 수 있습니다.
    • https://faucets.chain.link/sepolia 로 이동합니다.
    • 테스트넷 ETH를 받을 네트워크가 이더리움 Sepolia 네트워크로 선택되어 있는지 확인합니다.
    • “지갑 연결”을 클릭하여 파우셋 앱이 선택한 네트워크와 지갑 주소를 감지할 수 있도록 합니다.
    • 연결된 주소와 다른 주소로 테스트넷 자금을 받고 싶다면 “지갑 주소” 섹션에 해당 주소를 입력합니다. 이 필드는 기본적으로 연결된 지갑 주소로 설정됩니다.
    • Sepolia 테스트넷 ETH 및/또는 Sepolia 테스트넷 LINK를 받을지 선택합니다.
    • GitHub 계정으로 로그인하여 인증을 통해 스팸 요청으로부터 보호합니다.
    • “요청 보내기”를 클릭합니다. 그러면 지정한 지갑 주소로 파우셋에서 토큰이 전송됩니다.
    • Chainlink 스마트 계약 테스트에 대해 더 알고 싶다면 Chainlink Dev Hub를 방문하세요.
    • 이러한 테스트넷을 사용하면 안전하게 스마트 계약을 테스트하고, 메인넷에서의 예상 동작을 검증할 수 있습니다.

이더리움 지갑 만들기

  • https://metamask.io/
  • 지갑 만들고 account 를 계속 추가 할 수 있다.

간단한 계약 코드

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EtherCollector {
    address payable public account1;
    address payable public account2;
    address payable public recipient;
    uint256 public requiredAmount = 0.01 ether;

    constructor(address payable _account1, address payable _account2, address payable _recipient) {
        account1 = _account1;
        account2 = _account2;
        recipient = _recipient;
    }

    // Function to receive ether from account1
    function depositFromAccount1() external payable {
        require(msg.sender == account1, "Only account1 can deposit.");
        require(msg.value == requiredAmount, "Deposit must be exactly 0.01 ether.");
    }

    // Function to receive ether from account2
    function depositFromAccount2() external payable {
        require(msg.sender == account2, "Only account2 can deposit.");
        require(msg.value == requiredAmount, "Deposit must be exactly 0.01 ether.");
    }

    // Function to transfer 0.02 ether to recipient after both deposits
    function transferToRecipient() external {
        require(address(this).balance >= 0.02 ether, "Insufficient funds to transfer.");
        recipient.transfer(0.02 ether);
    }

    // Function to check the contract balance
    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

실제 계약 성공 링크

  • https://sepolia.etherscan.io/address/0x931e8b7ffe1c7ca220b69e4bde807a88bd3021b0
  • 인터널 TR 에서 0.002 Eth가 들어온 걸 볼 수 있다.
  • https://sepolia.etherscan.io/address/0x931e8b7ffe1c7ca220b69e4bde807a88bd3021b0#internaltx

dot Net Ethereum library

  • https://github.com/Nethereum/Nethereum
  • Nethereum을 사용하여 이더리움 스마트 계약을 실행하는 코드를 작성하기 위해서는 먼저 계약 ABI(응용 프로그램 바이너리 인터페이스)와 계약 주소가 필요합니다. 아래 예제에서는 C#을 사용하여 스마트 계약을 배포하고 호출하는 방법을 보여 드리겠습니다.
  • 우선, Nethereum 라이브러리를 설치해야 합니다. NuGet 패키지 관리자를 사용하여 설치할 수 있습니다:

  • shell
    • 코드 복사
    • dotnet add package Nethereum.Web3
    • dotnet add package Nethereum.Contracts

스마트 계약 예제

  • 다음은 Solidity로 작성된 간단한 스마트 계약의 예제입니다. ~~~solidity 코드 복사 pragma solidity ^0.8.0;

contract SimpleStorage { uint256 storedData;

function set(uint256 x) public {
    storedData = x;
}

function get() public view returns (uint256) {
    return storedData;
} } ~~~

Nethereum을 사용한 스마트 계약 실행 예제

  • 이제 이 계약을 Nethereum으로 실행하는 코드를 작성하겠습니다. ~~~C# csharp 코드 복사 using System; using System.Threading.Tasks; using Nethereum.Web3; using Nethereum.Web3.Accounts; using Nethereum.Contracts; using Nethereum.ABI.FunctionEncoding.Attributes;

// 계약의 ABI를 정의합니다. [Function(“set”, “bool”)] public class SetFunction : FunctionMessage { [Parameter(“uint256”, “x”, 1)] public uint X { get; set; } }

[Function(“get”, “uint256”)] public class GetFunction : FunctionMessage { }

public class Program { private static async Task Main(string[] args) { // 이더리움 노드에 연결합니다. var url = “https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID”; var privateKey = “YOUR_PRIVATE_KEY”; // 개인 키 var account = new Account(privateKey); var web3 = new Web3(account, url);

    // 스마트 계약 주소 및 ABI
    var contractAddress = "YOUR_CONTRACT_ADDRESS";

    // 계약의 함수 설정
    var setFunctionMessage = new SetFunction()
    {
        X = 42
    };

    var getFunctionMessage = new GetFunction();

    // set 함수 호출
    var setHandler = web3.Eth.GetContractTransactionHandler<SetFunction>();
    var transactionReceipt = await setHandler.SendRequestAndWaitForReceiptAsync(contractAddress, setFunctionMessage);

    Console.WriteLine($"Transaction Hash: {transactionReceipt.TransactionHash}");

    // get 함수 호출
    var getHandler = web3.Eth.GetContractQueryHandler<GetFunction>();
    var result = await getHandler.QueryAsync<uint>(contractAddress, getFunctionMessage);

    Console.WriteLine($"Stored Data: {result}");
} } ~~~

코드 설명

  • Web3 초기화: Web3 객체는 이더리움 네트워크와 상호 작용하는데 사용됩니다. 여기서 Infura 노드에 연결합니다. 자신의 Infura 프로젝트 ID와 개인 키를 사용해야 합니다.

  • 계약 함수 정의: SetFunction과 GetFunction 클래스를 통해 스마트 계약의 함수를 정의합니다. Nethereum의 FunctionMessage를 상속받아 각 함수의 파라미터와 리턴 타입을 정의합니다.

  • 함수 호출: GetContractTransactionHandler를 사용하여 상태를 변경하는 set 함수를 호출하고, GetContractQueryHandler를 사용하여 데이터를 조회하는 get 함수를 호출합니다.

  • 결과 출력: 트랜잭션 해시와 조회된 데이터를 출력합니다.

  • 이 코드를 실행하기 전에 반드시 자신의 Infura 프로젝트 ID, 개인 키 및 스마트 계약 주소로 값을 바꿔야 합니다. 이 코드 예제는 메인넷에 연결되도록 설정되어 있으므로, 테스트넷에서 실행하려면 해당 URL로 바꿔야 합니다.

comments powered by Disqus