Standard Bridge는 bridge 회계 오류를 일으킬 수 있으므로 전송 수수료 토큰(fee on transfer tokens)이나 리베이싱 토큰(rebasing tokens)을 지원하지 않습니다.
설계
Standard Bridge를 사용하면 한 체인(예: Ethereum)에 고유한 토큰을 다른 체인(예: OP Mainnet)에서의 해당 토큰 표현으로 변환할 수 있습니다. 사용자는 이후 언제든지 이러한 브리지 표현을 원래의 네이티브 토큰으로 다시 변환할 수 있습니다. 이 브리징 메커니즘은 양방향으로 동일하게 작동합니다. Ethereum 고유 토큰을 OP Mainnet으로 브리지할 수 있는 것처럼, OP Mainnet 고유 토큰도 Ethereum으로 브리지할 수 있습니다. 여기서는 Ethereum에서 OP Mainnet으로 토큰을 이동할 때 Standard Bridge가 어떻게 작동하는지 살펴봅니다. 브리징 메커니즘은 양쪽에서 대칭적으로 동작하므로, 이 설명은 반대 방향에서 브리지가 작동하는 방식도 설명합니다.아키텍처
Standard Bridge는 두 개의 컨트랙트, 즉L1StandardBridge(Ethereum에 위치)와 L2StandardBridge(OP Mainnet에 위치)로 구성됩니다.
이 두 컨트랙트는 Ethereum과 OP Mainnet 간에 메시지를 전송하는 CrossDomainMessenger 시스템을 통해 서로 상호작용합니다.
CrossDomainMessenger에 대한 자세한 내용은 L1과 L2 간 데이터 전송 가이드를 참고하십시오.
브리지 토큰
Standard Bridge는 다른 블록체인에 고유한 토큰의 브리지 표현을 활용합니다. 한 체인의 고유 토큰을 다른 체인으로 브리지하려면, 먼저 수신 측에 해당 토큰의 브리지 표현이 생성되어 있어야 합니다. 토큰의 브리지 표현은IOptimismMintableERC20 인터페이스를 구현하는 ERC-20 토큰입니다.
이 인터페이스에는 StandardBridge 컨트랙트가 브리징 과정을 관리하는 데 사용하는 몇 가지 함수가 포함되어 있습니다.
StandardBridge와 함께 사용하려면 모든 브리지 버전의 토큰이 반드시 이 인터페이스를 구현해야 합니다.
네이티브 토큰은 이 인터페이스를 구현할 필요가 없습니다.
하나의 네이티브 토큰은 동시에 둘 이상의 브리지 표현을 가질 수 있습니다.
사용자는 브리지를 사용할 때 항상 사용하려는 브리지 토큰을 지정해야 합니다.
같은 네이티브 토큰의 서로 다른 브리지 표현은 완전히 독립적인 토큰으로 간주됩니다.
네이티브 토큰 브리징
Standard Bridge는 “lock-and-mint” 메커니즘을 사용하여 네이티브 토큰을 브리지 표현으로 변환합니다. 즉, 한쪽에서 네이티브 토큰이 Standard Bridge에 잠기고(lock), 그 후 다른 쪽에서 브리지 토큰이 발행(mint)됩니다. 네이티브 토큰을 브리지하는 과정은 몇 단계로 이루어집니다.1
사용자가 Standard Bridge에 allowance 부여
Standard Bridge는 사용자로부터 토큰을 가져와 브리지 컨트랙트에 잠글 수 있어야 합니다.
이를 위해 사용자는 먼저 브리지 표현으로 변환하려는 토큰 수량만큼 전송할 수 있도록 브리지에 allowance를 부여해야 합니다.
2
사용자가 브리징 함수 호출
충분한 allowance를 부여한 후, 사용자는 네이티브 토큰이 존재하는 체인의
StandardBridge 컨트랙트(예: 토큰이 Ethereum 고유 토큰인 경우 L1StandardBridge 컨트랙트)에서 bridgeERC20To 함수를 호출합니다.사용자는 이 함수 호출에 다음 매개변수를 제공해야 합니다.address _localToken: 송신 측 네이티브 토큰의 주소입니다.address _remoteToken: 수신 측 브리지 표현의 주소입니다.address _to: 토큰을 받을 수신자의 주소로, 일반적으로 송신자의 주소입니다.uint256 _amount: 전송할 토큰 수량입니다.uint32 _minGasLimit: 수신 측에서 전송을 완료하는 데 사용할 gas입니다.bytes calldata _extraData: 선택적인 식별용 추가 데이터입니다.
사용자는
address _to 매개변수를 지정할 필요가 없도록 bridgeERC20To 대신 bridgeERC20 함수를 호출할 수도 있습니다.
이 경우 address _to 매개변수가 자동으로 msg.sender로 설정됩니다.일부 스마트 컨트랙트 지갑은 모든 블록체인에서 같은 주소로 배포될 수 없으므로, bridgeERC20 함수는 스마트 컨트랙트 지갑 사용자에게 잠재적으로 위험할 수 있습니다.
사용자가 실수로 토큰에 대한 접근 권한을 잃는 일을 방지하기 위해, bridgeERC20 함수는 스마트 컨트랙트에서 호출되면 항상 revert됩니다.
따라서 스마트 컨트랙트 지갑 사용자와 기타 스마트 컨트랙트는 대신 bridgeERC20To 함수를 사용해야 합니다.3
Standard Bridge가 전송된 토큰을 잠금
사용자가 네이티브 토큰을 전송하면서
bridgeERC20To 함수를 호출하면, Standard Bridge는 사용자 주소에서 _localToken 토큰을 _amount만큼 가져와 브리지 컨트랙트 내부에 잠급니다.
잠긴 모든 토큰의 기록은 주어진 _localToken과 _remoteToken 쌍에 대해 입금된 토큰의 총수량을 추적하는 deposits mapping에 저장됩니다.하나의 네이티브 토큰은 둘 이상의 브리지 표현을 가질 수 있으므로, deposits는 각 _localToken/_remoteToken 쌍의 입금 풀을 독립적으로 추적해야 합니다.예를 들어, 두 사용자가 같은 네이티브 토큰인 Token A를 각각 100개씩 입금하되, 서로 다른 두 브리지 토큰인 Token B와 Token C를 받고자 한다고 가정해 보겠습니다.
이제 Standard Bridge에는 총 200개의 Token A 잔액이 있지만, mapping에는 Token A/Token B 풀과 Token A/Token C 풀이 각각 100개만 가진 것으로 표시됩니다.4
Standard Bridge가 발행 메시지 전송
네이티브 토큰을 잠근 후, 송신 측의 Standard Bridge 컨트랙트는
CrossDomainMessenger 시스템을 통해 수신 측의 Standard Bridge 컨트랙트로 크로스체인 메시지를 보냅니다.
이 메시지는 사용자가 지정한 매개변수에 따라 토큰을 **발행(mint)**하도록 수신 측에 지시합니다.
구체적으로, 이 메시지는 상대편 Standard Bridge 컨트랙트의 finalizeBridgeERC20 함수에 대한 인코딩된 호출입니다.
이 시점에서 송신 측의 실행이 종료됩니다.5
발행 메시지 실행
발행 메시지가 전송되면 수신 측으로 릴레이되어야 합니다.
Ethereum에서 OP Mainnet으로 보낼 때는 메시지 릴레이가 자동으로 이루어지지만, OP Mainnet에서 Ethereum으로 보낼 때는 사용자의 추가 트랜잭션이 필요합니다.
메시지 릴레이 과정에 대한 자세한 내용은 L1과 L2 간 데이터 전송 가이드를 참고하십시오.메시지가 릴레이되면 수신 측 Standard Bridge 컨트랙트에서
finalizeBridgeERC20 함수가 호출됩니다.
이 함수는 완료까지 실행하기 위해 사용자가 정의한 _minGasLimit gas를 받습니다.6
발행 메시지 인증
실행 시
finalizeBridgeERC20은 들어오는 요청에 대해 다음 사항을 검증합니다.7
브리지 토큰 발행
발행 메시지가 완전히 검증되면,
finalizeBridgeERC20은 다른 블록체인에 원래 입금된 토큰 수량만큼 수신자에게 토큰을 발행합니다.
이것이 제대로 작동하려면 네이티브 토큰의 브리지 표현이 Standard Bridge가 임의로 토큰을 발행할 수 있도록 하는 mint 함수를 올바르게 구현해야 합니다.
이 함수는 IOptimismMintableERC20 인터페이스의 일부입니다.이로써 네이티브 토큰을 브리지하는 과정이 완료됩니다.
이 과정은 Ethereum에서 OP Mainnet 방향과 OP Mainnet에서 Ethereum 방향 모두 동일합니다.비네이티브 토큰 브리징
Standard Bridge는 “burn-and-unlock” 메커니즘을 사용하여 토큰의 브리지 표현을 다시 네이티브 토큰으로 변환합니다. 즉, 한쪽의 Standard Bridge에서 브리지 토큰이 소각(burn)되고, 그 후 다른 쪽에서 네이티브 토큰의 잠금이 해제(unlock)됩니다. 비네이티브 토큰, 즉 토큰의 브리지 표현을 브리지하는 과정은 몇 단계로 이루어집니다.1
사용자가 브리징 함수 호출
네이티브 토큰을 브리지할 때와 달리, Standard Bridge는 이미 이러한 토큰을
burn할 수 있는 권한을 가지고 있으므로 사용자는 브리지 토큰 전송을 위해 승인(approval)을 제공할 필요가 없습니다.
이 경우 사용자는 브리지 토큰이 존재하는 체인의 StandardBridge 컨트랙트(예: 토큰이 OP Mainnet으로 브리지된 경우 L2StandardBridge 컨트랙트)에서 bridgeERC20To 함수를 호출합니다.사용자는 이 함수 호출에 다음 매개변수를 제공해야 합니다.address _localToken: 송신 측 브리지 토큰의 주소입니다.address _remoteToken: 수신 측 네이티브 토큰의 주소입니다.address _to: 토큰을 받을 수신자의 주소로, 일반적으로 송신자의 주소입니다.uint256 _amount: 전송할 토큰 수량입니다.uint32 _minGasLimit: 수신 측에서 전송을 완료하는 데 사용할 gas입니다.bytes calldata _extraData: 선택적인 식별용 추가 데이터입니다.
2
Standard Bridge가 전송된 토큰을 소각
사용자가 브리지 토큰을 전송하면서
bridgeERC20To 함수를 호출하면, Standard Bridge는 송신자 주소에서 해당하는 _amount만큼의 토큰을 소각합니다.3
Standard Bridge가 잠금 해제 메시지 전송
브리지 토큰을 소각한 후, 송신 측의 Standard Bridge 컨트랙트는
CrossDomainMessenger 시스템을 통해 수신 측의 Standard Bridge 컨트랙트로 크로스체인 메시지를 보냅니다.
이 메시지는 사용자가 지정한 매개변수에 따라 토큰의 **잠금을 해제(unlock)**하도록 수신 측에 지시합니다.
구체적으로, 이 메시지는 상대편 Standard Bridge 컨트랙트의 finalizeBridgeERC20 함수에 대한 인코딩된 호출입니다.
이 시점에서 송신 측의 실행이 종료됩니다.4
잠금 해제 메시지 실행
잠금 해제 메시지가 전송되면 수신 측으로 릴레이되어야 합니다.
Ethereum에서 OP Mainnet으로 보낼 때는 메시지 릴레이가 자동으로 이루어지지만, OP Mainnet에서 Ethereum으로 보낼 때는 사용자의 추가 트랜잭션이 필요합니다.
메시지 릴레이 과정에 대한 자세한 내용은 L1과 L2 간 데이터 전송 가이드를 참고하십시오.메시지가 릴레이되면 수신 측 Standard Bridge 컨트랙트에서
finalizeBridgeERC20 함수가 호출됩니다.
이 함수는 완료까지 실행하기 위해 사용자가 정의한 _minGasLimit gas를 받습니다.5
잠금 해제 메시지 인증
실행 시
finalizeBridgeERC20은 들어오는 요청에 대해 다음 사항을 검증합니다.6
네이티브 토큰 잠금 해제
잠금 해제 메시지가 완전히 검증되면,
finalizeBridgeERC20은 다른 블록체인에서 원래 소각된 토큰 수량만큼 토큰의 잠금을 해제하고 수신자에게 전송합니다.이로써 네이티브 토큰을 브리지하는 과정이 완료됩니다.
이 과정은 Ethereum에서 OP Mainnet 방향과 OP Mainnet에서 Ethereum 방향 모두 동일합니다.ETH 브리징
Standard Bridge 컨트랙트는 Ethereum에서 OP Mainnet으로, 또는 그 반대로 ETH를 브리지하는 데에도 사용할 수 있습니다. ETH 브리징 과정은 일반적으로 ERC-20 브리징 과정보다 덜 복잡합니다. 사용자는 어느 블록체인에서든bridgeETH 또는 bridgeETHTo 함수를 호출하면서 ETH를 보내기만 하면 됩니다.