추가 통화 발행
외화
톤 블록체인 백서 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
이고 ConfigParam2
의 Minter를 대상으로 하며, 기존 글로벌 잔액보다 ConfigParam7
에 초과된 외화가 포함되어 있습니다.
여기서 문제는 채굴 메시지에 추가 통화만 포함되고 TON 코인은 포함되지 않는다는 것입니다. 즉, Minter가 기본 스마트 컨트랙트로 설정되어 있어도(ConfigParam31
에 표시됨), 채굴 메시지로 인해 compute_ph:(tr_phase_compute_skipped reason:cskip_no_gas)
트랜잭션이 중단될 수 있다는 뜻입니다.
높은 수준의 채굴 흐름
새로운 외화 생성 요청을 받거나 기존 토큰에 대한 추가 토큰을 발행하는 Minter 스마트 컨트랙트는 반드시 Minter여야 합니다:
- 컨피그 파라미터 6`에서 결정된 수수료가 요청 메시지에서 차감될 수 있는지 확인합니다.
- 기존 토큰의 경우: 발행 권한 확인(소유자만 새 토큰을 발행할 수 있음)
- 새 통화를 생성하는 경우: 암호화폐의 ID와 새 통화의 스토어 소유자가 점유하고 있지 않은지 확인합니다.
- 컨트랙트에 메시지를 전송합니다(이러한 메시지는
ConfigParam7
의ExtraCurrencyCollection
에 추가되어야 합니다). - 0:0000...0000`(다음 또는 다음 블록에서 반송이 보장됨)에 추가_통화 ID를 사용하여 메시지를 보냅니다.
0:0000...0000`에서 메시지 수신 시
- 반송 메시지에서 추가_통화 ID 읽기
- 마이너 잔액에 해당 ID를 가진 토큰이 있는 경우 'OK' 메시지와 함께 이 통화 소유자에게 토큰을 보냅니다.
- 그렇지 않으면 통화 소유자에게 '실패' 메시지 보내기
해결해야 할 문제
- 요청 처리 연기를 위해 '0:0000... 0000'으로 메시지를 보내는 해결 방법은 상당히 지저분합니다.
- 발행에 실패한 경우를 고려해야 합니다. 현재로서는 통화 금액이 0이거나 현재 잔액에 발행된 금액을 더한 금액이
(VarUInteger 32)
에 맞지 않는 경우만 가능한 상황인 것 같습니다. - 어떻게 굽나요? 언뜻 보기에는 방법이 없습니다.
- 발행 수수료가 엄청나게 높아야 할까요? 다시 말해, 수백만 개의 외화를 보유하는 것이 위험할까요(대규모 구성, 데이터 정렬 시 무제한의 딕셔너리 연산으로 인한 잠재적 DoS?)?