1. 로컬 테스트넷 실행 $ anvil 2. 최상위 경로에 .env 파일 생성 PRIVATE_KEY= RPC_ENDPOINT=http://localhost:8545 이 때 PRIVATE\_KEY가 0x로 시작하면 파싱에서가 발생하므로 0x를 지워준 16진수값만 넣어줍니다. 3. 배포 코드 작성 cmd/deploy/main.go package main import ( "context" "crypto/ecdsa" "fmt" token "go-ethereum-example/gen" "math/big" "os" _ "github.com/joho/godotenv/autoload" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go..
1. 스마트 컨트랙트 contracts/MyToken.sol // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.19; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MyToken is ERC20 { constructor(uint256 initialSupply) ERC20("MyToken", "MTK") { _mint(msg.sender, initialSupply); } } @openzeppelin/contracts 라이브러리의 ERC20.sol 컨트랙트를 상속하여 MyToken 컨트랙트를 작성 2. solc를 사용해 abi 및 binary 파일 생성 build 디렉토리 생성 $ mkd..
1. 사용한 기술 linux 환경 기반 go 1.21 (스마트 컨트랙트 배포 및 상호작용) node v20.3.0 (OpenZeppelin 라이브러리 사용) solc 0.8.22+commit.4fc1097e (Solidity 파일 컴파일) abigen 1.13.4-stable (abi 파일을 사용해 go 코드 생성) anvil 0.2.0 (로컬 테스트넷 실행 - ganache cli나 다른 로컬 테스트넷도 가능) alchemy (RPC Endpoint 제공) polygonscan (mumbai 테스트넷에 배포된 스마트 컨트랙트 검증) 2. solc 및 geth 설치 solc 설치 Installing the Solidity Compiler — Solidity 0.8.24 documentation Insta..
Foundry는 Solidity를 사용해 테스트를 작성합니다. 이 점에서 Javascript를 사용해야 하는 Truffle, Hardhat같은 툴체인과 차별점이 있습니다. 일반적으로 테스트는 'test' 디렉터리에 저장되며, '.t.sol' 확장자를 가집니다. 테스트 함수가 revert되면 테스트는 실패하는 것이고, 그 반대에는 테스트가 성공한 것으로 간주됩니다. 테스트 예제 Foundry 테스트는 Forge 표준 라이브러리의 'Test' 컨트랙트를 사용하여 작성할 수 있습니다. Test 컨트랙트는 기본적인 로깅과 어설션(assertion)을 제공합니다. pragma solidity ^0.8.13; import "forge-std/Test.sol"; contract ContractBTest is Test..
✨ Foundry 프로젝트 관련 명령어 프로젝트 생성 forge init 이미 git 저장소가 초기화되어 있는 디렉터리 안에서 Foundry 프로젝트를 생성하는 경우, '--no-commit' 플래그를 사용하여 자동으로 커밋을 실행하지 않거나, '--no-git' 플래그를 사용하여 git 저장소를 생성하지 않을 수 있습니다. $ forge init hello_foundry 생성된 프로젝트 디렉터리 구조는 다음과 같습니다. $ cd hello_foundry $ tree . -d -L 1 . ├── lib ├── script ├── src └── test 4 directories 프로젝트 빌드 forge build $ forge build [⠢] Compiling... [⠃] Compiling 22 file..
🔨 Foundry Foundry는 스마트 컨트랙트 개발 툴체인입니다. Foundry는 컨트랙트 의존성 관리, 컴파일, 테스트 실행, 배포를 도와주며, Solidity 스크립트와 커맨드 라인을 통한 블록체인과의 상호작용을 돕습니다. 🎁 설치 1. 사전에 컴파일된 바이너리 파일 사용하기 https://github.com/foundry-rs/foundry/releases 2. Foundryup 사용하기 1) Foundryup 설치 $ curl -L https://foundry.paradigm.xyz | bash 2) Foundryup 실행 최신 바이너리 파일 설치 (forge, cast, anvil, chisel) $ foundryup .xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx...
🦅 이전글 2023.10.03 - [Solidity] - [Solidity] 재진입 공격 (Reentrancy Attack) 🚫 재진입 공격 예방 기법 1. Checks Effects Interactions 패턴 Checks Effects Interactions 패턴은 컨트랙트 내부에서 외부 주소를 호출할 때 적용할 수 있는 패턴입니다. 외부 함수를 호출하거나 이더를 다른 계정으로 보낼 때, 이를 호출하는 컨트랙트는 제어 흐름을 외부 개체에게 넘겨주게 됩니다. 이러한 이유로 재진입 공격도 가능한 것입니다. 그렇기 때문에 외부 주소를 호출하기 전에 충분한 검토가 필요합니다. 먼저 가능한 모든 조건들을 검사(checks)하고, 컨트랙트 내부에서 실행가능한 모든 것들을 적용(effects)한 뒤에 마지막으로 ..
🚨 재진입 공격 (Reentrancy Attack)이란? BadBank 컨트랙트는 10 이더를 가지고 있고 Bob은 1 이더를 가지고 있습니다. BadBank가 가진 10 이더는 다른 사용자 또는 스마트 컨트랙트가 입금해 놓은 금액입니다. BadBank는 이를 안전하게 지켜야만 하고 소유주의 인출 요청에만 응답을 해야 되겠죠. 그런데 BadBank의 withdraw 함수에는 취약점이 존재합니다. 그리고 이를 오직 Bob만 눈치를 챘습니다. Bob은 공격을 감행하기로 마음먹습니다. 공격에 앞서 withdraw 함수를 호출하기 위한 조건을 만족시키기 위해 Bob은 자신이 가진 1 이더를 BadBank에 입금합니다. 그리고 withdraw 함수를 호출합니다. BadBank가 Bob에게 1 이더를 보내는 순간,..
1. 발생한 오류 truffle migrate 명령어를 사용하여 ganache 테스트 네트워크에 스마트 컨트랙트를 배포할 때 발생 (컴파일은 정상 동작) 2. 해결 방법 검색 https://ethereum.stackexchange.com/questions/72036/migrations-hit-an-invalid-opcode-while-deploying-on-deploy-migrations-sol-with "Migrations" hit an invalid opcode while deploying on deploy Migrations.sol with Truffle An error occurs when truffle migrate try to deploy Migrations.sol contract, i don..
Most Significant Bit // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; contract MostSignificantBit { /// 이분 탐색을 사용해 x의 최상위 비트를 찾는다 function findMostSignificantBitBinarySearch(uint256 x) public pure returns(uint8 r) { if (x >= 2 ** 128) { x >>= 128; r += 128; } if (x >= 2 ** 64) { x >>= 64; r += 64; } if (x >= 2 ** 32) { x >>= 32; r += 32; } if (x >= 2 ** 16) { x >>= 16; r += 16; } if (x >..