본문 바로가기

분류 전체보기

(61)
foundry cast 4byte => 함수이름 알려줌cast 4byte 0x8770ba91=> unoswap2(uint256,uint256,uint256,uint256,uint256) cast 4byte-decode => decode 해줌cast 4byte-decode 0x83800a8e00000000000000000000000095a62521c655e7a24a3919aa1f99764c05b7ec4e000000000000000000000000000000000000000000000006490e2084a2bc8000000000000000000000000000000000000000000000000000000000000da00578288000000000000000000000f12ecab44254543c049b3b57db9f..
User-defined Value Types 1inch AggregationRouterV6.unoswap2 에서 address로 주소를 받는 것이 아니라 uint256으로 주소를 받는 것을 확인했다. 그게 왜그런가 따라가 봤더니AddressLib를 확인할 수 있었고 그 위에는 type Address is uint256이라는 게 적혀있는데 처음 보는 거여서 저게 뭐지 했는데 여기를 보면 솔리디티 0.8.19버전부터 유저가 타입을 지정할 수 있게 한 것이고, unwrap과 wrap이라는 것도 추가되었다. 그래서 Address가 address랑은 다른 타입이고 uint256의 숫자로 된 것을 넣으면 get함수를 통해서 address타입으로 된 16진수의 주소를 얻을 수 있다.
tronweb 에러 tronweb 설치하고 Error: Cannot find module '@noble/secp256k1'에러나면   npm install @noble/secp256k1@1.7.1 npm install tronweb@beta  참고 : https://github.com/tronprotocol/tronweb/issues/481
aws에서 스크립트 실행해놓기 이벤트 캐치를 계속적으로 하기 위해서 aws ec2에 스크립트를 돌려놓기로 한다.  1. ec2 인스턴스 만들기 => 나는 ubuntu로 생성, 지역은 서울.2. pem키 저장 및 퍼블릭 ip복사 3. 기존에 작성해 놓았던 js스크립트 우분투로 복사 및 env파일 가져오기 4. 필요한 라이브러리설치5. screen 설치 => sudo apt-get install screen 6. screen 새 세션 시작 => screen -S myscript7. 스크립트 실행 => node ~~ 8. screen 세션 나오기 ctrl + A, D  그러면 이제 우분투에 접속했던 터미널을 꺼도 스크립트가 작동한다. 나중에 다시 접속할때는  sreen -r mycript 하고 들어가서 종료할 거면 종료하면 된다.
[정리] solidity try/catch 개발할 때 try/catch를 쓸 일이 없었는데 다음에 개발할 때는 한번 사용해 봐야겠다.https://solidity-by-example.org/try-catch/
[정리] solidity diamond proxy pattern https://eips.ethereum.org/EIPS/eip-2535 ERC-2535: Diamonds, Multi-Facet ProxyCreate modular smart contract systems that can be extended after deployment.eips.ethereum.orgEIP-2535에서 나온 개념.  기존의 proxy방식은 delegatecall을 이용해서 다른 컨트랙트의 기능을 가져와서 사용하는 것인데 그러한 것에 문제점이 있었음 그것을 storage 충돌이 발생할 수 있다는 것인데 diamond에서는 그러한 storage충돌을 방지하기 위해서 임의의 스토리지 포인트를 지정하여 그곳에 state를 저장하는 식으로 사용함 따라서 다양한 컨트랙트들을 delegatecal..
[정리] solidity call, delegatecall call => user가 A컨트랙트를 통해서 B컨트랙트의 함수를 호출하는 경우 B컨트랙트의 msg.sender는 A컨트랙트, 그리고 B컨트랙트의 state를 변경함  delegatecall => user가 A컨트랙트를 통해서 B컨트랙트의 함수를 호출하는 경우 B컨트랙트의 msg.sender는 user, 그리고 A컨트랙트의 state를 변경, B컨트랙트의 함수만 사용.
[Ethernaut] 22. Dex 가격 조작해서 토큰 가져오는 게 목표 .! 우선 문제 컨트랙트에 Token1과 Token2가 얼마씩 있는지 살펴보자 각 100개씩 들어있다. 나에게는 얼마씩 있는지 살펴보자 각 10개씩 들어있다. 그리고 getSwapPrice()를 실행하면 token1, token2, 100을 넣고 100이 나오는데 비율이 1:1 인 것을 확인할 수 있다. getSwapPrice()는 swap()안에서 swapAmount를 구할 때 사용된다. 지금 1:1비율인 토큰의 가격을 addLiquidity()를 통해서 하나의 유동성을 많이 투입해서 가격을 변화시키고 그것을 다르게 또 스왑하고 그런 식으로 진행하면 될 듯하다. 아 addLiquidity()에 onlyOwner()가 걸려있는데 그렇다고 유동성을 추가못하는건 아니다...
[Ethernaut] 21. Shop 요청한 가격보다 낮은 가격으로 물건사기 문제를 보니까 interface이용한 컨트랙트 만들어서 이케저케하면 될듯하다. 그냥 조건만 통과하게 하니까 isSold는 true가 되었는데 price가 더 비싸게 바뀌기 때문에 통과가 안된다. 좀만 더 보면 interface를 이용하고 문제에서 한번 변수의 상태를 바꾸기 때문에 그것을 이용하면 된다. contract Attack is Buyer { Shop shop; constructor(address _target) { shop = Shop(_target); } function AttackPrice() external { shop.buy(); } function price() external view override returns (uint) { return s..
[Ethernaut] 20. Denial 이것은 시간이 지남에 따라 펀드가 떨어지는 간단한 지갑이다. 출금 파트너가 되어 천천히 자금을 출금할 수 있다. withdraw()를 호출할 때 owner가 자금을 인출하는 것을 거부할 수 있는 경우(계약에 여전히 자금이 있고 거래의 가스가 100만 개 이하인 경우) 이 레벨에서 승리하게 됩니다. 지금 컨트랙트에는 0.001ETH가 있다. setWithdrawParter(player)로 설정. withdraw()를 보면 문제 컨트랙트 잔액의 1/100을 partner로 설정되어 있는 사람에게 주고 오너에게도 1/100을 준다. 음 withdraw해서 받는 파트너를 컨트랙트로 정하고 그 컨트랙트에 이더를 받았을 때 (receive())를 이용해서 반복적인 withdraw를 실행하면 될 듯하다. + out ..