TON → BNB Chain 크로스체인 스왑: 어떻게 작동하는가
TON BNB 크로스체인 스왑: 원자적 HTLC 에스크로가 TONNode의 MCP 도구를 통해 TON의 가치를 BNB Chain으로 비수탁 방식으로 옮기는 방법을 정리했습니다.
"GRAM을 BNB로 바꿔서 BNB Chain에 있는 거래 상대방에게 지급하라"는 지시를 받은 에이전트는 첫 단계에서부터 벽에 부딪힙니다. 서로의 존재를 전혀 알지 못하는 두 블록체인 사이에서 가치를 안전하게 옮길 방법이 없기 때문입니다. 고전적인 경로는 중앙화된 브리지나 거래소입니다. 코인을 밀어 넣고, 믿고, 기다리고, 자금이 네트워크 사이에 묶이지 않기를 바라는 것입니다. 자율 AI 에이전트에게 이것은 받아들일 수 없는 방식입니다. 수탁자를 "믿을" 수도 없고, 남의 키를 제3자에게 넘길 권한도 없으며, 멈춰 버린 트랜잭션을 직접 수습할 손도 없기 때문입니다.
필요한 것은 TON의 가치를 BNB Chain으로 옮기되 전부 성사되거나 전부 되돌아오거나 둘 중 하나가 되도록 보장하는 방법입니다. 그것도 돈을 붙들고 있는 중개자 없이 말입니다. 원자적 HTLC 에스크로를 이용한 크로스체인 스왑이 바로 그 일을 합니다. 아래에서는 이 구조가 어떻게 작동하는지, TONNode의 MCP 도구 다섯 개로 에이전트가 어떻게 거래를 진행하는지, 그리고 그 과정에서 서버가 왜 여러분의 자금에 단 한 번도 손대지 않는지 살펴보겠습니다.
TON → BNB Chain 크로스체인 스왑이란 무엇이고, 에이전트에게 왜 필요한가
크로스체인 스왑은 두 네트워크 사이에 공통 원장이 없는 상태에서 한 네트워크의 자산을 다른 네트워크의 자산과 교환하는 것입니다. TON과 BNB Chain은 각자의 가상 머신을 가진 독립적인 두 네트워크이며, 양쪽 잔액을 한 번에 고쳐 적어 줄 공통의 "은행" 같은 것은 존재하지 않습니다. 그러므로 서로 독립적인 두 건의 이체를 떼어 낼 수 없게 묶어 주는 프로토콜이 필요합니다.
TONNode에서 크로스체인은 언제나 TON을 출발지로 삼아 목적지 EVM 네트워크로 향합니다. 우리 경우에는 BNB Chain입니다. 반대 방향도, "BNB를 출발지로" 삼는 경로도 없습니다. TON이 언제나 출발점입니다. 여러분은 TON 쪽에서 GRAM이나 제톤(jetton)을 잠그고, BNB Chain 쪽에서 자산을 받습니다.
GRAM은 2026년 6월에 이름이 바뀐 Toncoin입니다. 네트워크는 여전히 TON이라고 불리며, 바뀐 것은 코인의 이름뿐입니다.
에이전트에게 이것이 왜 필요할까요? 현실의 업무는 한 네트워크 안에서만 끝나는 경우가 드물기 때문입니다. 재무를 담당하는 에이전트는 자금을 GRAM으로 들고 있지만 공급업체에는 BNB Chain으로 지급해야 합니다. 트레이딩 봇은 TON의 DEX와 BNB의 DEX 사이에서 차익거래 기회를 봅니다. 어시스턴트는 "BSC의 거래 상대방에게 50 GRAM 상당을 보내 줘"라는 지시를 수행합니다. 어느 경우든 네트워크의 경계를 넘는 방법이 필요합니다. 결정론적이고, 수탁자 없이, 수작업 개입 없이 말입니다.
원자적 HTLC 에스크로의 작동 방식: 비밀값, 해시, 타임락
HTLC는 Hashed Timelock Contract의 약자로, 해시 잠금과 타임락이 걸린 컨트랙트를 뜻합니다. 어렵게 들리지만 비유는 단순합니다.
금고 두 개를 떠올려 보십시오. 하나는 TON에, 다른 하나는 BNB Chain에 있습니다. 두 금고는 똑같은 하나의 잠금장치로 잠기며, 이 잠금장치는 무작위 숫자인 "비밀값" S, 즉 단 하나의 비밀 키로만 열립니다. 블록체인에 올라가는 것은 비밀값 자체가 아니라 그 해시 H = hash(S), 말하자면 잠금장치의 지문입니다. 누구나 그 키가 잠금장치에 맞는지 확인할 수 있지만, 지문에서 키 자체를 복원할 수는 없습니다.
BNB Chain 쪽 금고를 채우는 것은 여러분이 아닙니다. 반대편 레그(leg)를 내놓는 쪽은 거래 상대방, 즉 리졸버(마켓 메이커)입니다. 리졸버는 나중에 같은 비밀값으로 TON 쪽에 있는 여러분의 GRAM을 가져갈 것을 기대하고 동일한 해시 H 아래에 BNB를 잠급니다. 거래가 대칭적인 이유가 바로 이것입니다. 양쪽이 하나의 잠금장치로 잠겨 있는 것입니다.
이어서 두 가지 조건이 작동합니다.
- 해시 잠금. 금고에서 자금을 가져가려면 공개된 해시와 일치하는 비밀값을 제시해야만 합니다. 한쪽에서 비밀값이 공개되는 순간 반대편에서도 그 값이 보이게 되고, 거래의 두 번째 레그가 같은 키로 집행됩니다. 자금을 가져가는 쪽은 반드시
S를 온체인에 평문으로 제시해야 합니다. - 타임락. 금고마다 타이머가 걸려 있습니다. 타임락이 만료될 때까지 거래가 완료되지 않으면 자금은 원래 소유자에게 돌아갑니다. 타임락은 비밀값을 먼저 공개하는 쪽이 반대편을 속일 수 없도록 설정되어 있습니다.
결과는 원자성입니다. 두 레그가 모두 집행되거나, 둘 다 되돌아옵니다. GRAM은 내줬는데 BNB는 오지 않은 중간 상태는 물리적으로 존재하지 않습니다. 거래를 "보증"하는 제3자 같은 것은 여기에 없습니다. 보증은 해시 함수의 수학과 컨트랙트에 담긴 타임락의 논리가 제공합니다. 아토믹 스왑과 Lightning 결제를 떠받치는 것과 동일한 메커니즘이며, TON과 EVM에 맞게 다듬은 것일 뿐입니다.
거래를 구성하는 다섯 개의 도구: 견적, 조립, 추적, 공개, 환불
TONNode에서 크로스체인 스왑의 전체 수명 주기는 MCP 도구 다섯 개가 빠짐없이 담당합니다. 에이전트는 이들을 하나의 거래를 이루는 단계처럼 순서대로 호출합니다.
get_crosschain_quote — 견적
TON → BNB Chain 거래의 견적을 반환합니다. TON 쪽에서 얼마를 내주고 BNB Chain 쪽에서 얼마를 받는지 보여 줍니다. 모든 스왑은 여기서 시작합니다. 무언가가 잠기기 전에 에이전트가 사용자에게 숫자를 먼저 보여 주는 것입니다.
build_crosschain_swap_tx — 트랜잭션 조립 + 비밀값
서명되지 않은 HTLC 에스크로 트랜잭션과 비밀값을 함께 돌려줍니다. 트랜잭션에 서명하는 것은 서버가 아니라 TonConnect를 통한 사용자 지갑입니다. 비밀값 S는 바로 이 단계에서 생성되어 사용자/에이전트에게 남습니다. 나중에 두 번째 레그를 푸는 것이 바로 이 값입니다. 서버는 트랜잭션과 해시를 만들어 냈을 뿐이고, 서명과 비밀값의 소유권은 사용자 쪽에 그대로 있습니다.
track_crosschain_swap — 단계 추적
거래의 단계를 양쪽 네트워크에서, 즉 TON과 BNB Chain 양쪽에서 보여 줍니다. TON 쪽 레그가 잠겼는지, BNB Chain에 반대편 레그가 나타났는지, 비밀값이 공개되었는지, 정산이 끝났는지를 알려 줍니다. 이것이 에이전트의 눈입니다. 추적이 없으면 에이전트는 언제 비밀값을 공개해도 안전한지, 환불을 해야 할 때가 되었는지 알 수 없습니다.
disclose_crosschain_secret — 비밀값 공개
정산을 위해 비밀값을 공개하되, 온체인 준비 상태를 확인한 뒤에만 그렇게 합니다. 이 도구는 S를 무턱대고 내주지 않습니다. 먼저 BNB Chain 쪽 반대편 레그가 실제로 제자리에 있고 조건이 충족되었는지 확인합니다. 비밀값은 이미 공개했는데 저쪽에서 받을 것이 없는 상황을 막아 주는 장치입니다.
build_crosschain_refund — 에스크로 환불
거래가 멈춰 버린 경우, 타임락이 만료된 뒤 에스크로에서 자금을 되돌려 받는 트랜잭션을 조립합니다. 이것 역시 TonConnect용 서명되지 않은 트랜잭션입니다. 일종의 안전줄이며, 글 뒷부분에서 다시 다루겠습니다.
왜 비수탁인가: 서버는 서명하지도, 키를 보관하지도 않습니다
여기가 TONNode의 가장 중요한 경계선입니다. 스왑, 크로스체인, 지갑 도구는 엄격하게 비수탁입니다. 서버는 결코 서명하지 않으며 자금과 개인키를 보관하지 않습니다. 서버가 돌려주는 것은 오직 서명되지 않은 TonConnect 메시지이고, 서명은 사용자 지갑이 합니다.
크로스체인에 한정해 구체적으로 짚어 보겠습니다.
build_crosschain_swap_tx는 서명이 없는 트랜잭션을 돌려줍니다. 서명은 사용자 지갑이 합니다. Tonkeeper, MyTonWallet 등 TonConnect 호환 지갑이면 무엇이든 됩니다. 사용자가 트랜잭션을 확인하기 전까지는 아무것도 잠기지 않습니다.- 비밀값
S는 클라이언트로 넘어갑니다. 서버는 몰래 에스크로에서 자금을 빼낼 수 없습니다. 그러려면 소유자의 서명이 필요한데, 서버에는 그것이 없기 때문입니다. - 환불조차 서명되지 않은 트랜잭션입니다. 반환을 개시하는 것은 서버가 아니라 사용자입니다.
실무적인 결론은 이렇습니다. 서버가 침해당해도 자금 도난으로 이어지지 않습니다. 빼돌릴 것 자체가 없기 때문입니다. 키도, 서명도, 에스크로에 대한 통제권도 없습니다. 최악의 경우 "망가지는" 것은 서비스 중단(에이전트가 견적을 받지 못하는 것)이지, 돈의 손실이 아닙니다.
에이전트 지갑이 operator 키를 보유하고 스스로 서명하는 수탁형 모델과 비교해 보십시오. 두 모델 모두 나름의 존재 이유가 있지만, 서로 독립적인 두 네트워크를 가로지르는 크로스체인에서는 비수탁이 특히 중요합니다. 블록체인 사이에 묶여 있는 돈을 중개자가 통제하는 상황은 누구도 원하지 않기 때문입니다. 두 접근에 대한 자세한 분석은 수탁형 MCP와 비수탁형 MCP에서 다뤘고, TON 안에서 이루어지는 일반적인 스왑에서 이것이 어떤 모습인지는 에이전트를 위한 비수탁 스왑에서 다뤘습니다.
지원되는 네트워크 (그리고 TRON이 아직 없는 이유)
TONNode의 크로스체인은 언제나 TON에서 목적지 EVM 네트워크로 향합니다. 지원되는 목적지는 다음과 같습니다.
- Ethereum
- Arbitrum
- Base
- BNB Chain (우리 경우)
- Polygon
- Avalanche
TRON은 아직 지원되지 않습니다. 이유는 기술적입니다. 원자적 HTLC 에스크로가 성립하려면 목적지 네트워크가 선택된 에스크로 프로토콜의 틀 안에서 해시 타임락 컨트랙트를 동일하게 해석해야 합니다. 위에 나열한 여섯 네트워크는 EVM 호환이며 이 모델에 그대로 들어맞습니다. TRON은 겉보기에는 비슷해 보여도 자기만의 모델로 돌아가고, 별도의 에스크로 구현을 필요로 합니다. 그것이 없는 동안에는 TRON도 목록에 없습니다. 저희는 바라는 바를 사실인 것처럼 말하지 않습니다.
가장 인기 있는 조합인 TON → Ethereum에 대해서는 별도의 글이 있습니다. TON → Ethereum 크로스체인 스왑을 보십시오. 메커니즘은 동일하고 목적지 네트워크만 바뀝니다.
MCP로 TON → BNB 스왑을 단계별로 실행하기
먼저 TONNode를 에이전트에 연결하겠습니다. 로컬 공개 설정 @tonnode/mcp는 무료이며 읽기 도구 전체 세트를 제공합니다. 다만 읽기 전용입니다. 이 패키지는 오픈소스(MIT)이고, HTTP 계층 없이 TON의 네이티브 ADNL 프로토콜로 동작합니다.
{
"mcpServers": {
"ton": {
"command": "npx",
"args": ["-y", "@tonnode/mcp"]
}
}
}
중요한 단서 하나. 다섯 개의 크로스체인 도구는 로컬 공개 npx로는 사용할 수 없습니다. 거기에는 읽기 도구만 있습니다. 크로스체인 거래는 전용 키를 가진 hosted 엔드포인트를 통해 이루어지며, 여기에는 무료 Hobby 키만으로도 충분합니다.
{
"mcpServers": {
"ton": {
"type": "http",
"url": "https://mcp.tonnode.io/mcp",
"headers": {
"Authorization": "Bearer tn_live_…"
}
}
}
}
hosted 키에서는 크로스체인 도구 다섯 개를 포함한 16개 도구 전부가 무료 Hobby부터 시작해 모든 요금제에서 사용 가능합니다. 여러분이 지불하는 것은 처리량뿐입니다(Hobby — 무료, 60 요청/분; Pro — 월 $29, 300 요청/분; Scale — 월 $199, 1200 요청/분). 크로스체인은 상위 요금제 뒤에 잠겨 있지 않습니다. 다만 로컬 npx로는 되지 않으므로 hosted 키가 필요합니다.
이제 실제 실행입니다. 에이전트에게 주는 프롬프트는 최대한 사람이 말하듯 편하게 써도 됩니다.
"내 TON 지갑에 있는 50 GRAM을 BNB Chain의
0x…주소로 스왑해 줘. 먼저 견적을 보여 주고, 그다음 트랜잭션을 조립해. 서명은 내가 직접 할게."
내부에서 벌어지는 일은 이렇습니다.
- 견적. 에이전트가
get_crosschain_quote를 호출하고(출발지 TON, 목적지 BNB Chain, 금액 50 GRAM) BNB Chain 쪽에 얼마가 도착하는지 보여 줍니다. - 조립. 여러분이 "좋다"고 하면 에이전트가
build_crosschain_swap_tx를 호출합니다. 서명되지 않은 HTLC 에스크로 트랜잭션과 비밀값S를 받습니다. 트랜잭션은 여러분이 TonConnect를 통해 자기 지갑에서 승인합니다. 자금은 해시H아래 TON 쪽 에스크로에 잠깁니다. - 추적. 에이전트가 주기적으로
track_crosschain_swap을 호출해 양쪽 네트워크의 단계를 지켜봅니다. TON 레그가 잠겼는지, BNB Chain에 반대편 레그가 올라왔는지(같은 해시H아래 리졸버가 올립니다)를 확인합니다. - 공개와 정산.
track_crosschain_swap이 준비 완료를 보여 주는 즉시 에이전트가disclose_crosschain_secret을 호출합니다. 이 도구가 온체인 준비 상태를 확인하고S를 공개하면, 비밀값이 BNB Chain에서 보이게 되고 두 레그가 모두 집행되어 BNB가 여러분의 주소로 들어옵니다. - 확인. 마지막으로
track_crosschain_swap이 양쪽 모두 정산되었음을 보여 줍니다. 거래 종료입니다.
핵심은 여러분이 언제든 두 네트워크에서 거래의 상태를 볼 수 있고, 자기가 본 것만 서명한다는 점입니다. MCP를 통해 TON 밖으로 가치를 처음 옮긴다는 것이 어떤 의미인지, 그 전반적인 철학이 궁금하다면 MCP를 통한 TON 최초의 크로스체인 가치 이전에서 다뤘습니다.
거래가 멈췄을 때: 에스크로에서 자금 돌려받기
크로스체인은 서로 독립적인 두 네트워크를 뜻하고, 때로는 반대편 레그가 올라오지 않습니다. 거래 상대방에게 문제가 생겼거나, 네트워크가 혼잡하거나, 무언가 어긋난 것입니다. 수탁형 모델이라면 여기서 고객지원과의 메일 왕복이 시작됩니다. HTLC에서는 그저 타임락을 기다리면 됩니다.
자금이 영원히 잠기는 것은 아닙니다. 타임락이 만료되었는데도 거래가 완료되지 않으면 에이전트가 build_crosschain_refund를 호출해 에스크로 환불용 서명되지 않은 트랜잭션을 받습니다. 여러분이 TonConnect를 통해 자기 지갑으로 서명하면 잠겨 있던 GRAM이 되돌아옵니다. "자금이 영영 묶였다" 같은 일은 없습니다. 이것은 서비스의 약속이 아니라 컨트랙트 자체에 내장된 보장입니다.
프롬프트는 이런 식이면 됩니다.
"BNB Chain으로 보낸 내 크로스체인 스왑이 완료되지 않았어. 상태를 확인하고, 타임락이 만료됐으면 내 자금을 돌려줘."
에이전트는 track_crosschain_swap을 호출해 정산이 이루어지지 않았고 타임락이 지났음을 확인한 다음, build_crosschain_refund로 환불을 조립해 서명할 트랜잭션을 여러분에게 넘깁니다.
보안상 핵심은 이것입니다. disclose_crosschain_secret을 통한 비밀값 공개는 온체인 준비 상태를 확인한 뒤에만 일어납니다. 비밀값은 이미 공개됐는데 받을 것이 없는 함정에 에이전트가 빠지지 않습니다. 정산이 원자적으로 이루어지거나, 타임락에 따라 환불이 작동하거나 둘 중 하나입니다. 세 번째 경우는 없습니다. "원자적"이라는 단어의 의미가 바로 그것입니다.
무료 키를 받아 크로스체인 연결하기
다섯 개의 크로스체인 도구는 기본 16개 세트에 포함되어 있으므로 따로 구매할 필요가 없습니다. 무료 Hobby 키(60 요청/분, 카드 불필요, 로그인 직후 즉시 발급)를 받아 TONNode를 여러분의 에이전트에 연결하십시오. tonnode.io/dashboard?plan=hobby
16개 도구 전체와 각 파라미터를 먼저 살펴보고 싶다면 도구 페이지를 참고하십시오. tonnode.io/mcp
TON에서 BNB Chain으로 가는 크로스체인은 더 이상 "브리지를 믿어라"는 과제가 아니라 평범한 도구 호출이 됩니다. 원자적이고, 비수탁이며, 무언가 잘못되면 환불이 보장되는 도구 호출입니다.