본문 바로가기

전체 글95

Nonce Nonce는 블록체인 기술에서 사용되는 중요한 개념 중 하나로, 특히 작업 증명(Proof of Work, PoW) 합의 알고리즘에서 핵심적인 역할을 한다. Nonce는 "Number Only Used Once"의 약어로, 한 번만 사용되는 숫자를 의미한다. 이 숫자는 블록의 유효성을 검증하는 데 사용되며, 블록체인 네트워크의 보안과 무결성을 유지하는 데 중요한 역할을 한다. Nonce의 역할과 작동 방식 블록체인에서 블록을 생성하기 위해, 블록 생성자(채굴자)는 특정 조건을 만족하는 Nonce 값을 찾아야 한다. 이 조건은 보통 블록의 해시값이 특정 난이도 목표보다 낮아야 한다는 것을 의미한다. 난이도 목표는 네트워크의 계산 난이도(bits)에 의해 결정된다. 채굴자는 블록 헤더 정보(프로토콜 버전, .. 2024. 2. 21.
이더리움 Nonce 검증 이더리움에서의 Nonce 검증 과정은 트랜잭션의 순서와 무결성을 보장하기 위해 중요하다. 이더리움의 각 계정은 자신만의 Nonce 값을 가지고 있으며, 이 값은 해당 계정에서 발생한 트랜잭션의 수를 나타낸다. 계정의 Nonce는 계정이 생성될 때 0으로 시작하며, 계정에서 새로운 트랜잭션이 실행될 때마다 1씩 증가한다. 이더리움에서 Nonce 검증 과정 1. 트랜잭션 제출: 사용자가 트랜잭션을 생성하고 네트워크에 제출한다. 이 트랜잭션에는 발신자의 계정 주소, 수신자의 계정 주소, 전송할 이더(ETH)의 양, 트랜잭션 수수료(가스), 그리고 발신자의 현재 Nonce 값이 포함된다. 2. Nonce 확인: 네트워크의 노드(특히, 트랜잭션을 처리하는 채굴자 또는 검증자)는 트랜잭션의 유효성을 검증하기 위해 .. 2024. 2. 21.
머클트리 비트코인에서의 머클트리와 이더리움에서의 머클트리의 구조는 다소 차이가 있다. 우선 머클 트리(Merkle Tree)는 블록체인 기술에서 데이터의 무결성을 검증하는 데 사용되는 데이터 구조이다. 이 구조는 특히 거래 데이터의 무결성을 효율적으로 검증하기 위해 설계되었다. 여기서 "무결성"이란 데이터가 변경되지 않았음을 의미한다. 비트코인 머클트리 머클 트리의 기본 원리 머클 트리는 기본적으로 이진 트리 구조를 가지며, 각 노드는 자식 노드의 해시값을 합친 후, 그 결과를 다시 해시한 값으로 구성된다. 이 과정은 트리의 최상단에 도달할 때까지 반복되며, 최상단에 위치한 노드를 "머클 루트"라고 한다. 거래 해시와 머클 트리 1. 거래 해시화: 블록 내의 각 거래는 해시 함수를 통해 고유한 해시값으로 변환된다.. 2024. 2. 21.
암호학 공개키 이더리움 공개키는 타원곡선에 있는 점으로 타원 곡선 방정식을 만족하는 x와 y좌표의 집합을 의미한다. 더 간단히 이더리움 공개키는 함께 결합된 2개의 숫자. 이 숫자는 개인키로 부터 단 한방향으로만 계산 가능하다. 즉 개인키가 있는 경우 공개키를 계산하기는 쉽지만 공개키에서 개인키를 계산할수는 없다. K = k *G k는 개인키, G는 생성자 점(상수), K = 공개키 단방향 수학 함수이기 때문에 K를 G로 나누어 개인키 k를 계산할수없다. 이더리움은 secp256k1이라는 정확한 타원 곡선을 이용한다. 공개키 생성 무작위로 생성한 숫자 k 형태의 개인키로 시작하여 생성자 점 G라고 하는 곡선의 미리 결정된 점에 개인키를 곱하여 곡선상 다른점, 즉 대응하는 K 공개키를 생성한다 생성자 점 G는 s.. 2024. 2. 19.
빡세디 빡센 인생 블록체인 업계에서 꽤 인지도 있고 큰 기업에 입사를 한지 4개월이 지났다. 업계동료들이 가기전에 조금 우려한 부분이 있었지만 중요한 프로젝트들을 쳐내며 꽤 만족도 있게 다니고 있었다. 첫 급여가 지연되기 전까지... 첫 급여 지연, 4개월차 중 3개월 급여 지연 중... 회사가 안좋은 이슈가 터져 자금 흐름이 좋지 않아 모든 직원 급여가 지연이 됐다. 그래도 동료들도 좋고 일도 재밌어서 버티고 있었지만 좋은 동료들이 하나 둘 떠나가고 2월에 나머지 직원 거의 모두가 퇴사의사를 표했다. 메인넷 프로젝트는 상태가 괜찮아질때까지 팬딩 상태로 남긴다고 한다. 다 떠나가는 마당에 혼자 할게 없다ㅠ 퇴사 결정. 향후 방향 설계 1. eip4337 등 기술적 분석 2. 다시 도메인 지식 회고 및 공부 3. 디파이 분.. 2024. 2. 17.
delegatecall : immutable, constant 예제 이뮤터블, 콘스탄트 들이 어떻게 작동하는지 딜리게이트콜을 아래 테스트를 사용해 알아보자. DelegateCalled.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract DelegateCalled { uint256 public constant CONSTANTVALUES = 400; uint256 public publicValue1 = 600; uint256 public immutable immutableValue = 200; uint256 public publicValue2 = 800; constructor() { } function getValues() external view returns (uint256, uint256, uint.. 2024. 2. 3.
Foundry 학습하기 장점 자바 기반 개발환경 대비 실행속도가 빠르다. 솔리디티만으로 테스트 코드를 작성 가능하다 유용한 테스팅 라이브러리 및 내장도구가 존재한다 하드햇과 호환이 가능하다 단점 러닝커브 업그레이더블 플러그인 하드햇을 구성하여 업그레이드 배포만 하드햇 사용으로 우회 가능 설치 1. curl -L https://foundry.paradigm.xyz | bash 2. foundryup 프로젝트 생성 $ forge init yourProjectName . ├── foundry.toml ├── lib │ └── forge-std │ ├── foundry.toml │ ├── lib │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── package.json │ ├── README.md │ ├─.. 2024. 1. 25.
upgradeable contract 하드햇, 오픈제플린 라이브러리 분석 2 이어서 분석해보자 return async function upgradeProxy(proxy, ImplFactory, opts: UpgradeProxyOptions = {}) { disableDefender(hre, defenderModule, opts, upgradeProxy.name); const proxyAddress = await getContractAddress(proxy); const { impl: nextImpl } = await deployProxyImpl(hre, ImplFactory, opts, proxyAddress); // upgrade kind is inferred above const upgradeTo = await getUpgrader(proxyAddress, opts, getS.. 2024. 1. 21.
openzzeplin 5V => upgrade contract 분석하기 오랜만에 블로그다. 이직을 해서 정신없이 프로젝트를 쳐내다가 정리를 해가며 해야할거 같아서 오랜만에 글을 써내려가겠다. 현재 내가 분석중인것은 업그레이더블 컨트랙트이다. 함수호출로 업그레이드 하는 방법을 분석중인데 그전에 하드햇에서 지원하는 라이브러리가 있어 그것을 파해쳐보겠다. 우선 transparent 패턴을 분석중이라 그것 부터 정리를 한다. 분석해보니 하드햇에서 지원하는 방법은 크게 두가지가 있는것 같다. 1. 프록시 컨트랙트 없이 라이브러리로 업그레이드 진행. 2. 내가 원하는 특정 프록시 컨트랙트 패턴을 이용한 업그레이드 진행. 2번 부터 정리한다. 필요 컨트렉트 1. v1 logic contract 2. v2 logic contract 끝! 배포 및 업그레이드 방법 전체적인 로직은 제일 마지.. 2024. 1. 20.
pool을 통한 swap 실행 이전에 pool, pool factroy, swap contract 를 분리 시켰다. 그리고 유동성 제공 이후 스왑 함수를 테스트 하였다. swap factory contract 중 function createPool( address _tokenA, address _tokenB, address feedAddressA, address feedAddressB, address swapAddress ) external onlyRole(CREATEPOOL_ROLE) returns (address pool) { require(pools[_tokenA][_tokenB] == address(0), "Pool already exists"); require( feedAddressA != address(0) && feedA.. 2023. 10. 19.