본문 바로가기

전체 글89

[Solidity] 지갑주소(EOA)와 컨트렉트 주소(CA) 구분하기 || Solidity 0.8 | isContract || 안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 Solidity에서 지갑 주소(EOA : Externally Owned Account)와 컨트렉트 주소(CA : Contract Address)를 구분하여 예외처리하는 방법에 대해 알아보겠습니다. ❓ What is isContract() Solidity로 구현하는 코드에서 Address type의 변수에 주소를 저장할 때, 지갑주소와 스마트컨트렉트 주소를 구분하여 예외처리가 되도록 코드를 짜야할 때가 있습니다. https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol GitHub - OpenZeppelin/open.. 2023. 1. 13.
[Solidity] 비트마스크(BitMask) 연산 || Solidity 0.8 | Operators || 안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 Solidity에서 활용할 수 있는 비트마스크(BitMask) 연산에 대해 알아보겠습니다. 비트마스크(BitMask) 란? 10진수를 2진수로 표현하여 연산을 처리하는 기법입니다. 비트는 2진수(binary digit)를 뜻하는 말로 컴퓨터에서 사용되는 데이터의 최소 단위이며, 주로 Low-level 언어에서 사용하는 연산 기법입니다. 비트연산은 동작하는 메모리의 크기를 직접 설정할 수 있기에 메모리 사용량이 적습니다. 이는 Solidity 관점에서 더 적은 가스비를 사용하여 코딩을 할 수 있다는 걸 의미합니다. 또한 비트연산은 0(1)로 동작하여 수행속도가 아주 빠르고 코드가 짧습니다. 10진수와 2진수의 관계 비트마스크란.. 2023. 1. 9.
[Ethernaut Challenge] Fallout 문제풀이 안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다. 오늘은 The Ethernaut 퀴즈 풀이 세 번째 "Fallout" 문제를 풀어보겠습니다. 🔎 이번 "Fallout"의 문제해석은 마지막 목차 (5)[문제해석]에서 다루겠습니다. (1) 베포 및 준비 먼저 페이지 하단에 [Get new instance]버튼을 눌러 해당 문제의 컨트렉트를 베포 합니다. 베포가 끝나면 F12(Chrom기준)을 눌러서 개발자모드를 실행시켜 주세요. 베포 된 컨트렉트의 주소를 확인할 수 있습니다. (1)사진처럼 Ethernaut에서 제공한 문제의 코드를 복사해서 (2)사진의 초록색 부분처럼 Remix에 붙여 넣습니다. (2)사진의 빨간색 부분처럼 환경설정(ENVIRONMENT)을 메타마스크로 바꿔줍니다. 베포 된 .. 2023. 1. 6.
[DeFi Series] Time Weighted Average Price(TWAP) 알고리즘 파헤치기 || Math | DeFi || 안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 소개해드릴 DeFi Series는 Time Weighted Average Price(TWAP) 알고리즘입니다. TWAP란 풀어서 'Time Weighted Average Price' 이며 직역하면 '시간가중평균가격'입니다. 시시각각 변하는 가격을 주기적으로 기록하여 평균을 계산하는 공식으로, 주로 디지털 거래소 또는 탈중앙화 거래소(DEX)에서 디지털 자산의 가격을 조회할 때 사용됩니다. Example 암호화폐 거래소에서 MTK코인의 가격을 1초마다 기록하고 있습니다. 위 그래프를 설명드리자면, time(0~6)일 때 MTK의 가격은 price로 기록되고 있습니다. 여기서 TWAP란 time동안의 평균 price을 말합니다. .. 2023. 1. 2.
[DeFi Series] Uniswap V3 집중화된 유동성(Concentrated Liquidity) || Math | DeFi || 안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 소개해드릴 DeFi Series는 Uniswap V3 업데이트의 핵심 집중화된 유동성(Concentrated Liquidity)입니다. 기존의 Uniswap은 두 가지 암호화폐를 거래할 수 있는 거래의 장을 형성하여 CPMM 함수로 자동으로 거래가 이뤄지는 AMM 방식의 거래 구조를 구현했습니다. 하지만 CPMM 함수는 구매자가 의도했던 가격과 실제 거래 가격 사이에 차이가 발생하며 구매자의 손해를 보는 일이 발생했습니다. 이런 현상을 슬리피지라고 하며, 슬리피지는 유동성 풀의 규모가 작은 곳에서 특히 심하게 발생했습니다. 이런 문제점을 Uniswap V2의 게으른 유동성(Lazy Liquidity)이라고 합니다. Uniswa.. 2022. 12. 30.
[Hack Series] Smart Contract Phishing Attack with tx.origin || Solidity 0.8 | tx.origin || KR Web3 Hack Series : Phishing Attack with tx.origin 안녕하세요. 스마트 컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 Web3 Hack 시리즈는 tx.origin 함수를 이용한 스마트컨트렉트 피싱 공격에 대해 다뤄보겠습니다. 🔎 실습으로 다루는 Solidity 코드는 게시글 마지막에 github 링크를 참고해주세요. Smart Contract Phishing Attack 취약점 : tx.origin msg.sender VS tx.origin 스마트컨트렉트 개발자는 흔히 msg.sender 함수를 많이 사용할 겁니다. 하지만 tx.origin은 정말 옛날 Solidity 코드가 아니면 잘 볼 수 없습니다. 아래 예시를 통해 자세하게 알아보겠습니다. ContractA.. 2022. 12. 26.
[DeFi Series] Uniswap V2 게으른 유동성(Lazy Liquidity) || Math | DeFi || 안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 소개해드릴 DeFi Series는 Uniswap V2 게으른 유동성(Lazy Liquidity)에 대해 알아보겠습니다. 게으른 유동성(Lazy Liquidity) : 스왑에 사용되지 않는 유동성 유니스왑의 V2는 AMM의 CPMM 모델을 사용하여 유동성풀에서 거래되는 두 암호화폐의 거래 비율이 측정됩니다. 정해진 비율을 유지하여 거래되는 암호화폐의 양이 정해지게 됩니다. 하지만 만약 한쪽 암호화폐의 공급량이 다른 한쪽에 비해 현저히 낮은 경우, 높은 슬리피지가 발생하며 실제 가격과 달리 굉장히 낮은 스왑양이 체결되게 됩니다. 가격은 점점 낮아지지만, AMM의 특성상 가격은 0 이 되지 않습니다. 즉 끝까지 거래되는 않는 토큰이.. 2022. 12. 24.
[DeFi Series] Constant Product Market Maker(CPMM) 알고리즘 파헤치기 || Math | DeFi || 안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다. 이번 게시글에서 소개해드릴 DeFi Series는 Constant Product Market Maker(CPMM) 알고리즘입니다. 주로 탈중앙화 거래소(DEX)에서 디지털 자산(암호화폐, 주식 등)의 가격을 형성할 때 사용하는 알고리즘 공식입니다. 암호화폐 시장의 1위 DEX인 유니스왑에서 사용하여 대중에게 알려진 공식으로, 기존의 거래소에 적용됐던 오더북 알고리즘을 벗아나 새로운 알고리즘을 통해 사용자들의 거래를 자동으로 채결하는 프로세스를 만들었습니다. 지금부터 탈중앙화 거래소에 사용되는 Constant Product Market Maker(CPMM) 공식을 수학적으로 알아보겠습니다. 기존의 거래소는 암호화폐를 사는 사람(매수자)과 파는 .. 2022. 12. 23.
[Solidity ERROR] Invalid array length, expected integer literal * 본 게시글은, 개발 과정에서 발생한 애러를 개인적으로 정리한 내용입니다. Invalid array length, expected integer literal // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; contract ReturnsArray { mapping(address => uint) public balance; function getBalanceByAddressList(address[] calldata users) public view returns(uint[] memory) { uint _length = users.length; uint[_length] memory results; // ERROR !! for(uint i = 0; i <.. 2022. 12. 17.
반응형