SafeBridge 문제는 L1 → L2 브리지 문제이다. 사용자는 L1(레이어 1) 브릿지에 ERC20 토큰을 입금하고 해당 L2(레이어 2) 브릿지와 동기화할 수 있다. 계약은 CrossDomainEnabled 라이브러리를 사용하여 L1과 L2 간의 통신을 활성화하고, SafeERC20 라이브러리는 안전한 토큰 전송을 위해 사용된다. 계약은 예금 매핑을 사용하여 예치된 토큰을 추적한다.
contract Challenge {
address public immutable BRIDGE;
address public immutable MESSENGER;
address public immutable WETH;
constructor(address bridge, address messenger, address weth) {
BRIDGE = bridge;
MESSENGER = messenger;
WETH = weth;
}
function isSolved() external view returns (bool) {
return IERC20(WETH).balanceOf(BRIDGE) == 0;
}
}
문제 풀이의 조건은 L1 브릿의 WETH ERC 20을 모두 빼오면 된다.
ENTRYPOINT [ "python3", "-u", "challenge/relayer.py" ]
그리고 문제에는 relayer.py 라는 코드가 실행 중이다.
Thread(
target=self._relayer_worker, args=(l1, l1_messenger, l2_messenger)
).start()
Thread(
target=self._relayer_worker, args=(l2, l2_messenger, l1_messenger)
).start()
relayer.py의 run()
함수에서는 _relayer_worker()
함수를 쓰레드로 위와 같이 실행 시키고 있다.