작성자: Johan
배경
TON (The Open 네트워크)는 원래 텔레그램 팀이 설계하고 개발한 탈중앙화 블록체인 플랫폼입니다.TON의 목표는 탈중앙화 애플리케이션(DApp)과 스마트 컨트랙트를 대규모로 지원하기 위한 고성능의 확장 가능한 블록체인 플랫폼을 제공하는 것입니다.
TON은 텔레그램과의 긴밀한 통합으로 일반인들도 쉽게 토큰에 접근할 수 있고, 다른 블록체인과는 매우 다른 아키텍처와 비주류인 FunC 스마트 컨트랙트 언어 사용으로 복잡하지만 사용하기 쉽다는 점에서 매우 특별합니다. 오늘은 계정, 토큰, 트랜잭션의 관점에서 TON의 특징과 사용자 자산의 보안에 대해 알아보겠습니다.
TON 특징
계정 생성
계정 생성
TON 특징
. align: left;">TON 계정 주소는 대부분의 블록체인과 다르게 생성되며, 스마트 컨트랙트 주소입니다. 먼저 개인키가 생성되고, TON은 주로 Ed25519 알고리즘을 사용하여 공개키를 생성하며, 다음과 같은 생성 과정을 거칩니다.

여기에는 두 가지 형태의 공개 키가 있는데, 하나는 개인 키에서 계산된 원래의 공개 키로 다음과 같은 형태입니다:
. E39ECDA0A7B0C60A7107EC43967829DBE8BC356A49B9DFC6186B3EAC74B5477D
다른 하나는 "미화된" 공개 키로, 공개 키가 담겨 있는 것입니다. 다른 하나는 "미화된" 공개 키로, 다음과 같이 공개 키의 일부 정보와 확인 숫자가 포함되어 있습니다: Pubjns2gp7DGCnEH7EOWeCnb6Lw1akm538YYaz6sdLVHfRB2
공개 키를 받으면 EtherChannel처럼 계정 주소를 알 수 있다고 생각하는 것은 순진한 생각일 수 있습니다. 단순히 사용자의 공개키를 가지고 있는 것만으로는 사용자의 계정 주소를 계산할 수 없습니다. 방금 사용자의 계정 주소가 스마트 콘트랙트 주소라고 말씀드렸는데, 계정도 없는데 어떻게 스마트 콘트랙트를 배포할 수 있을까요? 올바른 순서는 먼저 주소를 계산하고 소량의 초기 토큰을 받은 다음 컨트랙트를 배포하는 것입니다. 계정 주소를 계산하는 과정은 다음과 같습니다:

사용자 사용자 주소는 다음과 같은 원형을 시작으로 다양한 형태를 취합니다.
0:b4c1b2ede12aa76f4a44353944258bcc8f99e9c7c474711a152c78b43218e296
및 다음과 같은 사용자 친화적인 양식

이 주소들을 자세히 살펴보면 첫 번째와 마지막 문자만 다르고 중간에 있는 'account_id'가 동일하다는 것을 알 수 있습니다. 그러나 여전히 공개 키와 계정 주소 사이의 관계를 알 수 없으며, 실제로 사용자의 공개 키가 포함된 '초기 데이터'의 시작 부분에 사용자가 지갑 계약의 소유권을 제어할 수 있는 수수께끼가 숨겨져 있습니다. '작업체인아이디'는 이해하기 쉬우며, TON은 단순한 단일 체인이 아니라 매우 많은 수의 슬라이스로 구성되며, 각 슬라이스는 전체 네트워크의 일부이며 특정 계정 및 트랜잭션 세트를 처리합니다. 스마트 컨트랙트를 찾고 관리하기 위해서는 스마트 컨트랙트가 어느 슬라이스에 있는지 지정해야 합니다. '바운스 가능'과 '바운스 불가능'의 차이점은 무엇인가요? 이는 스마트 컨트랙트의 작동 방식 메커니즘과 관련이 있으므로 계속 진행하겠습니다.
지갑 컨트랙트
이것은 사용자로부터 메시지를 받을 때 네 가지 매개변수를 읽는 것을 볼 수 있는 사용자 지갑 컨트랙트의 소스 코드 스니펫입니다.
즉, 이 사용자의 지갑 컨트랙트는 256비트 공개 키 메시지를 포함한 몇 가지 초기 파라미터를 전달받아 배포해야 하며, 이는 동일한 컨트랙트 코드를 사용할 때 각 사용자가 별도의 컨트랙트 주소를 갖도록 보장합니다. 사용자가 시작한 모든 트랜잭션은 `in_msg`로 서명해야 하며, 이는 지갑 컨트랙트(check_signature)로 확인된 다음 컨트랙트가 체인에서 모든 작업을 호출합니다. 이를 통해 사용자의 공개 키는 실제로 수많은 지갑 주소에 대응할 수 있으며, 완전히 다른 컨트랙트 주소를 얻기 위해 다른 소스 코드나 다른 초기화 데이터로 지갑을 배포하기만 하면 된다는 것을 추론할 수 있습니다.
제톤 토큰
토큰은 자산의 온체인 표현이므로 우리가 이해해야 할 기본 요소입니다. 제톤은 TON 토큰의 표준 형태이며, 제톤은 제톤 마이너와 제톤 월렛의 두 가지 컨트랙트로 구성됩니다.

토큰이 발행되면 총 토큰 수, 관리자, 지갑 코드 및 기타 정보를 기록하도록 초기화되는 Jetton-minter 컨트랙트가 생성됩니다.
토큰이 사용자에게 분배되면 민터 컨트랙트는 사용자에 대한 지갑 컨트랙트를 배포하고 각 사용자가 별도의 컨트랙트를 배포할 때 사용자의 잔액, 소유권, 토큰 민터 컨트랙트 주소 및 사용자의 지갑 코드를 기록하여 초기화합니다. 여기서 생성된 컨트랙트는 특정 제튼 토큰을 관리하기 위한 지갑 컨트랙트이며, 소유자 주소가 사용자의 계정 지갑 주소로 기록되는 사용자의 계정 지갑 컨트랙트와 동일하지 않다는 점에 유의하시기 바랍니다.
사용자 앨리스가 사용자 밥에게 송금할 때 호출 관계는 다음과 같습니다.

앨리스는 체인 아래 앱에 서명하고 지갑 컨트랙트를 호출하여 작동 지시를 내립니다. 이 지시에 따라 앨리스는 토큰 지갑을 호출하여 돈을 이체합니다. 밥의 토큰 지갑이 토큰을 받으면 밥의 지갑 컨트랙트(즉, 밥 제튼 지갑의 소유자 주소)에 알립니다. 트랜잭션에서 남은 가스가 있는 경우 응답 주소(일반적으로 앨리스의 계정 컨트랙트)로도 반환됩니다.
이것은 Tonviewer 브라우저에서 파싱한 Jetton 토큰 전송입니다:

ERC20 전송에는 최소 1개의 컨트랙트가 필요한 반면, 젯튼 토큰 전송에는 최소 4개의 컨트랙트가 필요하며, 이는 온체인에서 동시에 전송할 수 있고 거래 효율성을 높이기 위해 고안된 것입니다.
트랜잭션
트랜잭션은 TON 계정에서 어떤 일이 발생하면 트리거되며, 가장 일반적인 것은 '메시지 수신'입니다. 가장 일반적인 이벤트는 '메시지 수신'으로, 다음과 같이 구성됩니다.

거래는 몇 가지 사항을 알고 있어야 합니다. 특징:
1. 비동기: TON 트랜잭션은 한 번의 호출로 완료되지 않으며, 여러 스마트 컨트랙트에 메시지를 통해 일련의 호출이 필요할 수 있습니다. 체인의 다양한 경로로 인해 TON은 여러 스마트 컨트랙트에 걸쳐 메시지가 전달되는 순서를 보장하지 않습니다.
2. 수수료: TON의 비동기적 특성으로 인해 예측할 수 없는 수수료 문제가 발생합니다. 따라서 트랜잭션을 시작할 때 지갑은 보통 수수료로 몇 개의 토큰을 더 보냅니다. 호출 컨트랙트에 좋은 수수료 처리 메커니즘이 있다면, 남은 수수료는 결국 사용자의 지갑으로 반환됩니다. 이것이 사용자가 지갑 토큰이 갑자기 감소했다가 몇 분 후 다시 증가하는 것을 관찰할 수 있는 이유입니다.
3. 바운싱: 바운싱은 컨트랙트의 오류 처리 메커니즘으로, 호출 컨트랙트가 존재하지 않거나 오류가 발생했을 때 트랜잭션이 바운싱 가능으로 설정되어 있으면 바운싱 메시지는 호출 컨트랙트로 되돌려 보내집니다. 예를 들어, 사용자가 송금을 시작했는데 호출 프로세스에서 오류가 발생하면 사용자의 지갑 컨트랙트가 잔액을 복구할 수 있도록 반송된 메시지가 필요합니다. 스마트 콘트랙트 간에 전송되는 거의 모든 내부 메시지는 바운스 가능, 즉 '바운스' 비트가 설정되어 있어야 합니다.
자산 보안
TON에는 보안 문제를 일으킬 수 있는 여러 기능이 있으므로 사용자는 몇 가지 일반적인 함정에 유의해야 합니다.
수수료 가로채기 공격
지갑은 거래 실행 실패를 방지하기 위해 추가 수수료를 송금해야 하는 경우가 종종 있으며, 이는 공격자가 악용할 수 있는 기회라고 위에서 언급했었습니다. TON 지갑 사용자라면 이런 상황을 겪어보신 적이 있으실 텐데요, 지갑에 항상 다양한 NFT나 토큰이 들어오는데 그냥 정크 토큰 에어드랍인 줄 알았는데 수표 거래 정보를 보니 거금을 받고 팔 수 있나? 하지만 막상 거래를 시작하면 1톤이라는 엄청난 수수료가 필요하다는 것을 알게 되고, 수수료 사기일 수 있으니 주의가 필요합니다.

공격자는 신중하게 구성된 토큰 컨트랙트를 사용하여 지갑의 예상 이체 수수료가 지갑의 예상 이체 수수료를 매우 높게 설정하고, 실제 실행에서는 수수료를 가로채고 이체 메시지를 보내지 않습니다.
최초 및 마지막 번호 피싱
최초 및 마지막 번호 피싱은 TON에만 존재하는 것이 아니라 모든 주요 공개 체인에 존재합니다. 공격자는 전체 네트워크에서 각 사용자 주소의 앞뒤 번호가 동일한 하이패션 계정을 생성하고, 사용자가 이체를 보낼 때 공격자는 하이패션 계정을 사용하여 사용자의 수집 기록에 기록을 남기기 위해 소액 이체를 보냅니다. 수신 사용자가 토큰을 다시 전송하려고 할 때, 기록에 있는 주소를 공격자의 주소로 복사하여 잘못된 주소로 전송할 수 있으므로 공격자는 사용자의 행동을 정확하게 파악할 수 있습니다.
댓글 피싱
송금 시 댓글을 추가하여 거래 정보를 기록할 수 있습니다. 이 기능은 재충전 시 사용자 아이디를 메모해야 하는 거래소에서 자주 사용되지만, 공격자가 댓글에 사기성 정보를 기재하여 사용자의 자산을 탈취하는 데 악용되는 경우가 많습니다.

사용자는 특히 다음 사항에 유의해야 합니다. 사용자가 익명 텔레그램 번호로 TG 번호를 열었지만 2단계 인증을 열지 않은 경우, 이 NFT가 트롤링되면 해커는 대상 TG 번호에 직접 로그인하여 후속 자산 도난 및 스푸핑 행위를 수행할 수 있습니다.
스마트 컨트랙트 취약점
스마트 컨트랙트 취약점은 사용자가 스마트 컨트랙트에 맡긴 자금의 피해로 이어질 수 있으므로 사용자는 프로젝트 선택 시 감사를 잘 받은 프로젝트를 선택해야 합니다. TON의 스마트 컨트랙트는 주로 펀씨 언어를 사용하여 프로그래밍되지만, 고급 언어인 택트나 기본 언어인 파이브도 사용합니다. 새로운 프로그래밍 언어는 새로운 보안 위험을 가져올 수 있으며, 특히 개발자는 안전한 프로그래밍 습관을 갖고, 모범 보안 사례를 숙지하고, 엄격한 보안 감사 전에 프로덕션 환경에 배포해야 하며, 이 글에서는 지면 관계상 계약 보안에 대해서는 다루지 않습니다. 슬로우포그 보안팀은 TON 스마트 컨트랙트 보안 감사 서비스를 출시했으며, 감사가 필요한 친구들을 환영하며 함께 논의할 수 있습니다.
가짜 충전 공격
월렛이나 거래소 사용자는 가짜 충전 공격에 주의해야 하며, 일반적으로 두 가지 유형의 가짜 충전 공격이 있습니다:
바운스 가능, TON의 전송 프로세스에서는 두 사용자의 지갑 컨트랙트 간에 호출 관계가 발생해야 하며, 수취인의 지갑 컨트랙트가 존재하지 않고 트랜잭션이 반송 가능으로 설정된 경우, 메시지는 반송되며 수수료를 공제한 후 원래 송금액이 발신자에게 반환됩니다. 자세한 내용이 궁금하신 분들은 이전에 공개한 가짜 충전 관련 글을 확인하시기 바랍니다.
요약
이 문서에서는 TON의 공개-개인키 생성, 지갑 계약, 토큰의 형태 및 거래 특성 관점에서 TON의 기본 기술 원리 몇 가지를 소개합니다. 이 글에서는 TON의 공개-개인키 생성, 지갑 컨트랙트, 토큰 형태, 트랜잭션 특성 등의 관점에서 TON의 기본 기술 원리를 소개하고, TON 사용 과정에서 발생할 수 있는 보안 문제를 살펴봄으로써 학습에 영감을 얻을 수 있기를 바라며 이 글을 작성합니다.