신규 토큰을 발행하기 위해서는 두 개의 계정이 필요합니다. 토큰을 발행하는데 사용하는 계정과 토큰을 배포하는데 사용되는 계정입니다.
발행계정(issuing account): 토큰 발행 및 파기에만 사용.
배포계정(base account): 다른 계정과 거래하는 데 사용되는 기본 계정. 발행계정에서 발행한 토큰을 소유합니다.
두 개의 계정이 필요한 이유는, 만약 발행계정에서 토큰을 무한으로 발행한다면 토큰의 가치가 점점 떨어지게 됩니다. 그것을 방지하기 위해 발행계정을 중단할 수 있는 방법이 없습니다. 따라서 발행계정은 토큰을 생성하고 배포계정에게 발행합니다. 그런 다음 발행계정은 더 이상 토큰을 발행 할 수 없도록 영구적으로 잠궈버립니다. 이것으로 토큰이 더 이상 발행되지 않을 것임을 모두에게 보장합니다.
이더리움과 다르게 스텔라는 완벽한 스마트 컨트랙트를 제공하지는 않습니다. 이더리움 방식의 스마트 컨트랙트는 최대한의 유연성을 제공하지만 DAO와 같은 주요 해킹 사건과 비교적 최근 패리티(parity) 지갑 오류로 입증되는 것처럼 위험도가 높고 오류가 발생하기 쉽습니다.
스텔라에서의 스마트 컨트랙트라고 하면 일종의 트랜잭션으로 다양한 유형이 있습니다. 이러한 트랜잭션 유형 중에 하나는 "Change Trust"입니다.
토큰을 발행하기 위해서는 배포계정과 발행계정 간에 Change Trust 트랜잭션이 선행되어야 합니다. 배포계정이 배포하는 토큰이 발행계정에서 발행한 신뢰할 수 있는 토큰이라고 선언하는 과정입니다.
// 배포계정(base account) var keyPair = StellarSdk.Keypair.fromSecret(secret);
server .loadAccount(keyPair.publicKey()) // 1. 배포계정의 Account 정보 로드 .then(function (account) { // 2. 트랜잭션 빌드 var transaction = new StellarSdk.TransactionBuilder(account) .addOperation(StellarSdk.Operation.changeTrust({ asset: new StellarSdk.Asset('ANPIGON', 'GCCJZXGB5QRWNVUV2IYCEIFPLU2GB2FF7U4Y25MCCWYSVQYYE4O3ZIJT') })) .build(); // 3. 트랜잭션 서명 transaction.sign(keyPair); // 4. 트랜잭션 전송 return server.submitTransaction(transaction); }) .then(function (transactionResult) { console.log(transactionResult); }) .catch(function(err) { console.log(err); });
changeTrust 오퍼레이션의 asset에는 new Asset('<asset code>', '<issuer>')와 같이 자산코드asset code와 발행자Issuer가 포함됩니다. 자산코드는 관례에 따라 ISO 4217 code로 표현합니다. 또는 자신만의 자산코드를 만들 수도 있습니다. 이 글에서는 자산코드에 "ANPIGON"을 입력하였습니다.