CAST SEND

김현학·2024년 7월 29일
0

Web3 튜토리얼

목록 보기
2/3

Forge는 작성한 스마트 컨트랙트를 빌드하고, 테스트하고, 배포하는 기능을 가지고 있습니다. 또한 Forge는 git의 submodules 기능을 바탕으로 종속성을 관리하는 기능을 제공하고 있어, git 서버 위에 올라가 있는 스마트 컨트랙트들을 쉽게 추가하고 관리하는 것이 가능합니다.

Cast는 이더리움 RPC (Remote procedure call) 요청을 직접 보낼 수 있는 툴입니다. 자신이 배포한 스마트 컨트랙트를 호출해보거나, 트랜잭션을 보내는 등의 동작을 수행할 수 있습니다.

Anvil은 로컬 환경에서 테스트넷을 실행할 수 있는 툴입니다. 실제 네트워크에 배포하기 이전에 자신의 환경에서 직접 테스트해보는 것을 가능하게 해줍니다.

Chisel은 Solidity REPL (Read-eval-print loop) 툴로, Python의 인터랙티브 모드와 같은 기능을 제공합니다. 빠르게 실행해보고 싶은 Solidity 코드가 있을 때 사용해볼 수 있고, 디버깅 관련 기능도 제공하고 있어 코드를 쉽게 검토해볼 수 있습니다.

cast send --rpc-url https://upside:center39383817284134737847833@rpc.exploit101.com/ --private-key pk --value 1000
000000000000 0x36c4b0eB987f26c7A73540C6082b8bF8A3fA57f3

를 통해 0.001ETH를 전송할 수 있었다.


처음에 대상 주소가 이상해서 뻘짓하고
이후 바뀐거 적용해서 결과 제대로 얻고
0x84574C760786266A454DD9823EC2DA2f9eeEB8ac

topic1만 설정하면 되는데
memory를 읽어야 하는 줄 알고
offset이랑 size로 뻘짓했고

처음에 CALLER 활용했는데, 내부적으로는 다시 한 번 call을 진행하는 방식이라 뻘짓하고

그래서 내 주소 직접 넣어줬는데 zero-padding 안 되어서 뻘짓하고
그래서 일부러 PUSH32했는데 bytecode랑 mnemonic 전환할 때 제대로 안 바뀌어서 뻘짓하고 그 다음 해결함

PUSH32 0x4262aa56b97f776c075883b6077719ca3b997023000000000000000000000000
PUSH0
PUSH0
LOG1

forge init
[optional] 만약 기본 git branch 이름을 main으로 변경하고 싶다면 git branch -m old_branch_name main

forge init practice_debug
cd practice_debug
forge build

이후 특정한 address의 contract를 대상으로 테스트를 진행하고 싶다면
contract 내부적으로 target.call{value: 31337}(hex"abc")의 형식으로
forge test --help

  1. setUp() 함수:
    이 함수는 각 테스트 케이스가 실행되기 전에 호출됩니다. 테스트 환경을 초기화하는 데 사용됩니다.
    Counter 계약의 새 인스턴스를 생성하고, counter 변수에 할당합니다.
    counter의 setNumber 함수를 호출하여 내부 숫자를 0으로 초기화합니다.
    test_Increment() 함수:

  2. Counter 계약의 increment 함수를 테스트합니다.
    counter.increment()를 호출하여 내부 숫자를 증가시킨 후, assertEq를 사용하여 counter.number()의 결과가 1인지 확인합니다. 이는 increment 함수가 내부 숫자를 정확히 1만큼 증가시키는지 검증합니다.
    testFuzz_SetNumber(uint256 x) 함수:

  3. Counter 계약의 setNumber 함수에 대한 퍼즈 테스트입니다. 퍼즈 테스트는 임의의 입력으로 함수를 실행하여 예상치 못한 버그를 찾는 데 사용됩니다.
    이 함수는 uint256 타입의 임의의 값을 입력으로 받습니다.
    counter.setNumber(x)를 호출하여 내부 숫자를 x로 설정한 후, assertEq를 사용하여 counter.number()의 결과가 x와 동일한지 확인합니다. 이는 setNumber 함수가 다양한 입력에 대해 정확하게 동작하는지 검증합니다.

    gas: amount of gas to send to the sub context to execute. The gas that is not used by the sub context is returned to this one.
    address: the account which code to execute.
    argsOffset: byte offset in the memory in bytes, the calldata of the sub context.
    argsSize: byte size to copy (size of the calldata).
    retOffset: byte offset in the memory in bytes, where to store the return data of the sub context.
    retSize: byte size to copy (size of the return data).

function callThis(string calldata message) external payable {
require(msg.value == 31337, "no 31337 wei");
require(keccak256(abi.encodePacked(message)) == keccak256("hi setuid0"));
checker2[msg.sender] = true;
}

forge debug src/Contract.sol --sig "callThis(string calldata)" "hello" 100

  • cast send

  • --rpc-url https://upside:center39383817284134737847833@rpc.exploit101.com - --private-key

  • require(msg.value == 31337, "no 31337 wei");

    • --value 31337
  • 대상 컨트랙트 주소

    • 0x84574C760786266A454DD9823EC2DA2f9eeEB8ac
  • opcode

    • 5f5f5f5f7384574c760786266a454dd9823ec2da2f9eeeb8ac61c350f4
  • require(keccak256(abi.encodePacked(message)) == keccak256("hi setuid0"));

    • `cast keccak "hi setuid0"
    • `0x471d7d230925515275cf33891a21f4a703030be3ae2f4107369fa29ffc496878``

cast send --rpc-url https://upside:center39383817284134737847833@rpc.exploit101.com --private-key bf3ad567e85f139991244dd0ef1d64a3c2f7a3138d5f4a1b0624d15e5c5ec7bf --value 31337

aa

0개의 댓글

관련 채용 정보