솔리디티 프로그래밍 하면서 중요한 내용 정리한 페이지
- 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 설치 및 사용 방법
- remixd 설치:
- 먼저 Node.js가 설치되어 있어야 합니다.
- 그런 다음, npm을 사용하여 remixd를 설치합니다.
npm install -g @remix-project/remixd
- remixd 실행:
- 로컬 디렉토리를 Remix IDE와 연결하기 위해 remixd를 실행합니다. 예를 들어,
/path/to/your/project
디렉토리를 연결하려면 다음 명령을 사용합니다.
remixd -s /path/to/your/project --remix-ide https://remix.ethereum.org
- 로컬 디렉토리를 Remix IDE와 연결하기 위해 remixd를 실행합니다. 예를 들어,
- Remix IDE에서 연결:
- 웹 브라우저에서 Remix IDE를 엽니다.
- 왼쪽 메뉴에서 “File Explorers”를 선택한 후, “Connect to Localhost” 버튼을 클릭합니다.
- 연결이 성공하면, 로컬 파일 시스템에 있는 파일들이 Remix IDE에 표시됩니다.
이렇게 하면 로컬에서 개발한 Solidity 스마트 계약 파일들을 웹 기반의 Remix IDE에서 직접 접근하고 수정할 수 있으며, 이를 통해 더 편리하게 스마트 계약을 개발하고 테스트할 수 있습니다.
테스트 넷 선정
이더리움 테스트 서버(네트워크)는 스마트 계약과 분산 애플리케이션(DApp)을 실제 이더리움 메인넷에서 배포하기 전에 테스트할 수 있는 환경을 제공합니다. 주요 이더리움 테스트 네트워크는 다음과 같습니다:
- Ropsten Testnet:
- 이더리움의 PoW (Proof of Work) 테스트 네트워크입니다.
- 메인넷과 유사한 환경을 제공하며, 다양한 테스트 시나리오에 유용합니다.
- Rinkeby Testnet:
- PoA (Proof of Authority) 합의 알고리즘을 사용하는 테스트 네트워크입니다.
- 안정적이고 예측 가능한 환경을 제공하여 개발자들에게 인기가 많습니다.
- Goerli Testnet:
- 여러 클라이언트를 지원하는 PoA 테스트 네트워크입니다.
- 다양한 이더리움 클라이언트와의 호환성을 테스트하는 데 유용합니다.
- Kovan Testnet:
- PoA 합의 알고리즘을 사용하는 또 다른 테스트 네트워크입니다.
- 일반적으로 Parity 클라이언트와 함께 사용됩니다.
테스트넷 사용 방법
- 테스트넷 선택:
- 테스트하려는 환경에 따라 적절한 테스트넷을 선택합니다. 일반적으로 Rinkeby 또는 Goerli를 많이 사용합니다.
- 테스트 이더 획득:
- 테스트넷에서 거래를 수행하려면 테스트 이더가 필요합니다. 이를 위해 해당 테스트넷의 파우셋(faucet)에서 무료로 테스트 이더를 받을 수 있습니다.
- 예: Rinkeby Faucet, Goerli Faucet
- 테스트넷에 연결:
- 개발 도구(예: Remix IDE, Truffle, Hardhat)에서 테스트넷에 연결하여 스마트 계약을 배포하고 테스트할 수 있습니다.
예시: Remix IDE에서 Rinkeby 테스트넷 사용하기
- 메타마스크 설치:
- 메타마스크를 브라우저에 설치하고 설정합니다.
- 테스트넷 네트워크를 선택합니다. 예를 들어, Rinkeby 테스트넷.
- 테스트 이더 받기:
- Rinkeby 파우셋을 사용하여 테스트 이더를 받습니다.
- Remix IDE 설정:
- Remix IDE를 열고, 환경 설정에서 “Injected Web3”를 선택합니다.
- 메타마스크와 연결하여 Rinkeby 테스트넷에 배포할 수 있습니다.
- 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로 바꿔야 합니다.