본문으로 건너뛰기

추가 통화 발행

외화

톤 블록체인 백서 3.1.6](https://ton-blockchain.github.io/docs/tblkch.pdf#page=55)에 따르면, 톤 블록체인은 몇 가지 조건이 충족된다면 사용자가 톤코인 외에 임의의 암호화폐 또는 토큰을 정의할 수 있습니다. 이러한 추가 암호화폐는 32비트 currency_ids로 식별됩니다. 정의된 추가 암호화폐 목록은 마스터체인에 저장된 블록체인 구성( )의 일부입니다. 각 내부 메시지와 계정 잔액에는 '추가 통화 모음'(메시지에 첨부되거나 잔액에 유지되는 추가 통화 집합)을 위한 특수 필드가 포함되어 있습니다:

extra_currencies$_ dict:(HashmapE 32 (VarUInteger 32)) = ExtraCurrencyCollection;
currencies$_ grams:Grams other:ExtraCurrencyCollection = CurrencyCollection;

외화 구성

발행해야 하는 모든 통화의 사전, 정확히 말하면 '엑스트라통화 컬렉션'은 '컨피그파람7'에 저장됩니다:

_ to_mint:ExtraCurrencyCollection = ConfigParam 7;

'컨피그파람 6'에는 채굴과 관련된 데이터가 들어 있습니다:

_ mint_new_price:Grams mint_add_price:Grams = ConfigParam 6;

컨피그파람2`에는 Minter의 주소가 포함되어 있습니다.

낮은 수준의 채굴 흐름

각 블록에서 콜레이터는 이전 글로벌 잔액(이전 블록의 마지막에 있는 모든 통화의 글로벌 잔액)을 ConfigParam7과 비교합니다. 컨피그 파라미터 7에 있는 어떤 통화의 금액이 글로벌 잔고보다 적으면 해당 구성은 유효하지 않습니다. 컨피그 파라미터 7의 모든 통화 금액이 글로벌 잔액보다 높으면 발행 메시지가 생성됩니다.

이 발행 메시지는 소스가 -1:0000000000000000000000000000000000000000000000000000000000000000이고 ConfigParam2Minter를 대상으로 하며, 기존 글로벌 잔액보다 ConfigParam7에 초과된 외화가 포함되어 있습니다.

여기서 문제는 채굴 메시지에 추가 통화만 포함되고 TON 코인은 포함되지 않는다는 것입니다. 즉, Minter가 기본 스마트 컨트랙트로 설정되어 있어도(ConfigParam31에 표시됨), 채굴 메시지로 인해 compute_ph:(tr_phase_compute_skipped reason:cskip_no_gas) 트랜잭션이 중단될 수 있다는 뜻입니다.

높은 수준의 채굴 흐름

새로운 외화 생성 요청을 받거나 기존 토큰에 대한 추가 토큰을 발행하는 Minter 스마트 컨트랙트는 반드시 Minter여야 합니다:

  1. 컨피그 파라미터 6`에서 결정된 수수료가 요청 메시지에서 차감될 수 있는지 확인합니다.
    1. 기존 토큰의 경우: 발행 권한 확인(소유자만 새 토큰을 발행할 수 있음)
    2. 새 통화를 생성하는 경우: 암호화폐의 ID와 새 통화의 스토어 소유자가 점유하고 있지 않은지 확인합니다.
  2. 컨트랙트에 메시지를 전송합니다(이러한 메시지는 ConfigParam7ExtraCurrencyCollection에 추가되어야 합니다).
  3. 0:0000...0000`(다음 또는 다음 블록에서 반송이 보장됨)에 추가_통화 ID를 사용하여 메시지를 보냅니다.

0:0000...0000`에서 메시지 수신 시

  1. 반송 메시지에서 추가_통화 ID 읽기
  2. 마이너 잔액에 해당 ID를 가진 토큰이 있는 경우 'OK' 메시지와 함께 이 통화 소유자에게 토큰을 보냅니다.
  3. 그렇지 않으면 통화 소유자에게 '실패' 메시지 보내기

해결해야 할 문제

  1. 요청 처리 연기를 위해 '0:0000... 0000'으로 메시지를 보내는 해결 방법은 상당히 지저분합니다.
  2. 발행에 실패한 경우를 고려해야 합니다. 현재로서는 통화 금액이 0이거나 현재 잔액에 발행된 금액을 더한 금액이 (VarUInteger 32)에 맞지 않는 경우만 가능한 상황인 것 같습니다.
  3. 어떻게 굽나요? 언뜻 보기에는 방법이 없습니다.
  4. 발행 수수료가 엄청나게 높아야 할까요? 다시 말해, 수백만 개의 외화를 보유하는 것이 위험할까요(대규모 구성, 데이터 정렬 시 무제한의 딕셔너리 연산으로 인한 잠재적 DoS?)?