저는 최근 분산형 거래소 개발에 대한 튜토리얼을 작성했습니다. https://github.com/WTFAcademy/WTF-Dapp , Uniswap V3의 코드 구현을 참조하고 많은 지식 포인트를 배웠습니다. 저는 이전에 간단한 NFT 계약을 개발했고, 이번이 처음으로 Defi 계약을 개발하려고 했습니다. 저는 이러한 팁이 계약 개발을 배우고 싶어하는 초보자에게 매우 도움이 될 것이라고 믿습니다.
계약 개발자는 직접 이동할 수 있습니다 https://github.com/WTFAcademy/WTF-Dapp Web3에 코드를 기여하고 변화를 만들어 보세요~
다음으로, 이러한 작은 요령들을 살펴보겠습니다. 그 중 일부는 심지어 기믹 요령이라고 부를 수도 있습니다.
계약 배포의 계약 주소는 예측 가능하게 만들어질 수 있습니다.
계약을 배포할 때 일반적으로 겉보기에 무작위적인 주소를 얻습니다. nonce와 관련이 있기 때문에 계약 주소는 예측하기 어렵습니다. 그러나 Uniswap에서는 이러한 요구 사항이 있습니다. 거래 쌍과 관련 정보를 통해 계약 주소를 추론해야 합니다. 이는 거래 권한을 결정하거나 풀의 주소를 얻는 것과 같은 많은 경우에 매우 유용합니다.
Uniswap에서 계약은 pool = address(new Uniswap V3 Pool{salt: keccak 256(abi.encode(token 0, token 1, fee))}());와 같은 코드를 사용하여 생성됩니다. 다음을 사용하여 계약을 생성하기 위해 salt를 추가합니다. 2를 생성하세요 ( https://github.com/AmazingAng/WTF-Solidity/blob/main/25_Create2/readme.md ), 장점은 생성된 계약 주소가 예측 가능하다는 것입니다. 주소 생성의 논리는 새 주소 = hash(0x FF, 생성자 주소, salt, initcode)입니다.
이에 대한 자세한 내용은 WTF-DApp 코스에서 확인할 수 있습니다. https://github.com/WTFAcademy/WTF-Dapp/blob/main/P103_Factory/readme.md에서 .
콜백 함수를 잘 활용하세요
Solidity에서 계약은 서로를 호출할 수 있습니다. A가 특정 메서드에서 B를 호출하고 B가 호출된 메서드에서 A를 다시 호출하는 시나리오가 있는데, 이는 일부 시나리오에서도 매우 유용합니다.
Uniswap에서 Uniswap V3 Pool 계약의 swap 메서드를 호출하면 swapCallback이 호출되고 콜백은 계산된 값을 전달합니다. 토큰 실제로 이 거래에 필요합니다. 호출자는 스왑 메서드를 호출자가 호출할 수 있도록 두 부분으로 나누는 대신, 콜백에서 거래에 필요한 토큰을 Uniswap V3 풀로 전송해야 합니다. 이렇게 하면 스왑 메서드의 보안이 보장되고 보안을 보장하기 위해 번거로운 변수 레코드가 필요 없이 전체 로직이 완전히 실행됩니다.
코드 조각은 다음과 같습니다.
더 자세히 알아볼 수 있습니다 거래 과정의 일부 https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md에서 .
예외를 사용하여 정보를 전달하고 catch를 사용하여 거래 추정을 구현합니다.
Uniswap 코드를 참조할 때 우리는 다음 사실을 발견했습니다. https://github.com/Uniswap/v3-periphery/blob/main/contracts/lens/Quoter.sol 계약, Uniswap V3 Pool의 스왑 메서드는 try catch로 래핑되어 실행되었습니다.
왜 그럴까요? 거래에 필요한 토큰을 추정하기 위해 스왑 방법을 시뮬레이션해야 하지만 추정하는 동안 토큰 교환이 실제로 발생하지 않으므로 오류가 보고됩니다. Uniswap에서는 거래의 콜백 함수에서 특수 오류를 발생시킨 다음 오류를 캡처하고 오류 메시지에서 필요한 정보를 구문 분석합니다.
해킹처럼 보이지만 매우 실용적이기도 합니다. 이런 방식으로 추정 거래의 필요에 따라 스왑 방식을 수정할 필요가 없고 로직이 더 간단합니다. 저희 과정에서도 이 로직을 참조하여 계약을 구현합니다. https://github.com/WTFAcademy/WTF-Dapp/blob/main/demo-contract/contracts/wtfswap/SwapRouter.sol .
큰 숫자를 사용하여 정밀도 문제 해결
유니스왑 코드에는 현재 가격과 유동성에 따라 교환된 토큰을 계산하는 것과 같은 많은 계산 로직이 있습니다. 이 과정에서 우리는 나눗셈 연산 중에 정밀도를 잃지 않도록 해야 합니다. 유니스왑에서 계산 프로세스는 종종 다음을 사용합니다.
코드는 다음과 같습니다(가격과 유동성을 통해 거래에 필요한 토큰 수를 계산).
보시다시피, 우선 Uniswap의 가격은 2^96의 제곱근으로 곱해집니다(위의 코드에서 sqrtRatioAX 96과 sqrtRatioBX 96에 해당). 그런 다음 liquidity를 왼쪽으로 이동하여 분자 1을 계산합니다. 다음 계산에서는 2^96이 계산 과정에서 제거되어 최종 결과를 얻습니다.
물론, 어떤 경우든 이론상으로는 정확도가 떨어지겠지만, 이 경우에는 가장 작은 단위가 손실되는 것이며, 이는 허용할 만한 일입니다.
자세한 내용은 이 과정에서 자세히 알아볼 수 있습니다. https://github.com/WTFAcademy/WTF-Dapp/blob/main/P106_PoolSwap/readme.md에서 .
공유를 사용하여 소득 계산
유니스왑에서 우리는 LP(유동성 공급자)의 수수료 수입을 기록해야 합니다. 당연히 우리는 각 거래에서 각 LP의 수수료를 기록할 수 없으며, 이는 많은 가스를 소모할 것입니다. 그렇다면 어떻게 처리해야 할까요?
Uniswap에서는 다음과 같은 구조가 있는 것을 볼 수 있습니다. 디파이위치에 ned:
여기에는 feeGrowthInside0LastX128과 feeGrowthInside1LastX128이 포함되어 있으며, 이는 각 포지션(포지션)이 마지막으로 수수료를 인출했을 때 각 유동성이 받아야 하는 수수료를 기록합니다.
간단히 말해서, 총 수수료와 각 유동성에 할당해야 할 수수료만 기록하면 LP가 수수료를 인출할 때, 자신의 손에 있는 유동성에 따라 얼마의 수수료를 인출할 수 있는지 계산할 수 있습니다. 마치 회사 주식을 보유하고 있을 때, 주식 수입을 인출하고 싶을 때, 회사의 과거 주당 순이익과 마지막으로 인출했을 때의 수입만 알면 되는 것과 같습니다.
이전에 우리는 기사에서 stETH 수익 계산 방법을 소개했습니다. 독창적인 계약 설계, stETH가 매일 수익을 자동으로 분배하는 방식을 보세요. ETH를 스테이킹에 참여시켜 안정적인 이자를 얻으세요 , 원리는 비슷합니다.
모든 정보를 체인에서 얻을 필요는 없습니다.
온체인 스토리지는 비교적 비싸기 때문에 모든 정보를 온체인에 저장하거나 체인에서 가져올 필요가 없습니다. 예를 들어, Uniswap 프런트엔드 웹사이트에서 호출하는 인터페이스 중 다수는 기존 Web2 인터페이스입니다.
거래 풀 목록, 거래 풀에 대한 정보 등은 모두 일반 데이터베이스에 저장할 수 있습니다. 일부는 체인에서 정기적으로 동기화해야 할 수 있지만, 관련 데이터를 얻기 위해 체인이나 노드 서비스에서 제공하는 RPC 인터페이스를 실시간으로 호출할 필요는 없습니다.
물론, 많은 블록체인 PRC 공급업체가 이제 몇 가지 고급 인터페이스를 제공하므로 더 빠르고 저렴한 방식으로 일부 데이터를 얻을 수 있습니다. 이는 비슷합니다. 예를 들어, ZAN은 특정 사용자 아래의 모든 NFT를 가져오는 것과 유사한 인터페이스를 제공합니다. 이 정보는 성능과 효율성을 개선하기 위해 캐시될 수 있습니다. 방문할 수 있습니다. https://zan.top/service/advance-api 더 많은 것을 얻기 위해.
물론, 주요 거래는 체인상에서 이루어져야 합니다.
계약을 분할하고 ERC 721과 같은 기존 표준 계약을 사용하는 방법을 알아보세요.
프로젝트는 실제로 배포된 여러 개의 계약을 포함할 수 있습니다. 실제로 배포된 계약이 하나뿐이더라도, 우리 코드는 상속을 통해 유지 관리를 위해 계약을 여러 개의 계약으로 분할할 수 있습니다.
예를 들어, Uniswap에서는 https://github.com/Uniswap/v3-periphery/blob/main/contracts/NonfungiblePositionManager.sol 계약은 많은 계약을 상속받으며, 코드는 다음과 같습니다.
그리고 ERC 721 허가 계약의 구현을 살펴보면 @openzeppelin/contracts/token/ERC 721/ERC 721.sol 계약을 직접 사용한다는 것을 알 수 있습니다. 이를 통해 NFT를 통해 포지션을 관리하는 것이 편리해지고, 반면에 기존 표준 계약을 사용하여 계약 개발의 효율성을 개선할 수도 있습니다.
우리 과정에서는 다음을 배울 수 있습니다. https://github.com/WTFAcademy/WTF-Dapp/blob/main/P 108 _PositionManager /readme.md 그리고 포지션을 관리하기 위한 간단한 ERC 721 계약을 개발해 보겠습니다.
요약하다
아무리 많은 기사를 읽어도 직접 개발하는 것만큼 실용적이지 않습니다. 분산형 거래소의 간소화된 버전을 직접 구현하는 과정에서 Uniswap 코드 구현에 대한 더 깊은 이해를 얻고 실제 프로젝트에서 경험하게 될 더 많은 지식 포인트를 배울 수 있습니다.
WTF-DApp 과정은 ZAN 개발자 커뮤니티와 WTF Academy 개발자 커뮤니티가 공동으로 완료한 오픈 소스 과정입니다. Web3 및 Defi 프로젝트 개발에도 관심이 있다면 실무 과정을 참조할 수 있습니다. https://github.com/WTFAcademy/WTF-Dapp 그리고 간단한 버전의 교환을 단계별로 완료하세요. 분명 도움이 될 거라고 믿어요~
이 글은 Fisher(X 계정)가 작성했습니다. @유다오 1024 ) ZAN 팀의 (X 계정) @잔_팀 ).
이 기사는 인터넷에서 발췌한 것입니다: Web3 초보자 시리즈: Uniswap Code에서 배운 계약 개발 팁
관련: 다음 100배 보석 찾기: ChatGPT로 Pump.fun에서 돈 버는 방법
원저자: CMed 편집자 주: 펌프 시장에서는 매 순간 새로운 토큰이 출시되고 있습니다. 시장의 다른 사람들이 여전히 초과 수익을 낼 수 있는 미메코인을 찾기 위해 건초더미 속의 바늘을 찾고 있는 동안, @AlphaBatcher는 이미 Chatgpt를 사용하여 자동화된 정밀 거래를 달성했습니다. 이 방법론은 많은 자본이나 강력한 프로그래밍 기술이 필요하지 않습니다. AI를 사용하여 미메코인 투자를 강화할 수 있습니다. 다음은 원본 텍스트입니다(읽고 이해하기 쉽도록 원본 내용은 삭제하고 재구성했습니다). 저는 ChatGPT와 PumpFun을 사용하여 1분 만에 $2300을 벌었습니다. 다른 사람들이 여전히 미메코인에서 기회를 찾고 있는 동안, 저는 이미 정확한 거래를 자동화하고 있었습니다. 시작하려면 0.2 SOL만 있으면 되고, 프로그래밍 기술은 필요 없습니다...