blockchainstellar

Blockchain: Stellar Bagaimana Meng-Issue Assets

Salah satu fitur yang sangat powerfull pada Stellar adalah kemampuannya untuk mentransaksikan macam-macam jenis asset, misalnya US dollars, Nigerian naira, bitcoins, kupon, ICO tokens atau apapun yang kita mau.

Ini bisa terjadi pada Stellar karena asset hanyalah sebuah credit dari suatu account. Ketika kita mentransaksikan US dollars pada Stellar network, kita sebenarnya tidak mentransaksikan US dollars—kita mentransaksikan US dollars yang sudah di-credit-kan pada suatu account. Umumnya, account tersebut adalah bank, tapi jika disekitar kita ada perkebunan pisang, mereka bisa mengeluarkan asset pisang yang bisa kita transaksikan dengan orang lain.

Setiap type asset (kecuali lumens) didefinisikan dengan 2 properti:

  • asset_code: identifier singkat 1–12 huruf atau angka, misalnya USD, atau EUR. Bisa berupa apapun yang kita mau misalnya AstroDollars.
  • asset_issuer: account ID yang mengeluarkan asset.

Pada Stellar SDK, assets dibentuk menggunakan Asset class:

var astroDollar = new StellarSdk.Asset(
  'AstroDollar', 'GC2BKLYOOYPDEFJKLKY6FNNRQMGFLVHJKQRGNSSRRGSMPGF32LHCQVGF');

Mengeluarkan Asset Type Baru

Untuk mengeluarkan type asset yang baru, yang mesti dilakukan adalah memilih sebuah code. Bisa berupa kombinasi sampai dengan 12 huruf atau angka, namun sebaiknya gunakan kode ISO 4217 code (misalnya USD untuk US dollars) atau ISIN untuk currencies atau securities nasional. Setelah pilih code, kita bisa mulai membayar orang dengan asset code tersebut. Kita tidak perlu mendeklarasikan apapun pada network.

Namun, orang lain tidak bisa menerima asset kita sampai mereka memilih untuk trust (percaya) kepada asset itu. Berhubung asset Stellar hanyalah credit, kita harus yakin bahwa issuer bisa mencairkan credit itu jika diperlukan nanti. Sederhananya, kita tidak mungkin percaya kepada tetangga yang mengeluarkan asset pisang jika mereka tidak punya kebon pisang.

Sebuah account boleh membuat trustline, atau deklarasi bahwa ia mempercayai asset-asset tertentu, menggunakan change trust operation. Sebuah trustline dapat juga dibatasi kepada amount tertentu. Jika tetangga yang tanam pisang tadi hanya punya beberapa pohon saja, kita tak mungkin mempercainya untuk lebih dari 200 pisang.

Setelah menentukan code asset dan seseorang sudah membuat trustline atas asset kita tadi, kita sudah bisa membuat payment operation kepada mereka menggunakan asset itu. Jika seorang yang mau dibayar tidak mempercayai asset tersebut, kita masih bisa menggunakan distributed exchange.

Contoh Soal

Kirim dan terima custom assets sangat mirip dengan mengirim dan menerima lumens. Ini contohnya:

var StellarSdk = require('stellar-sdk');
StellarSdk.Network.useTestNetwork();
var server = new StellarSdk.Server('https://horizon-testnet.stellar.org');

// Keys for accounts to issue and receive the new asset
var issuingKeys = StellarSdk.Keypair
  .fromSecret('SCZANGBA5YHTNYVVV4C3U252E2B6P6F5T3U6MM63WBSBZATAQI3EBTQ4');
var receivingKeys = StellarSdk.Keypair
  .fromSecret('SDSAVCRE5JRAI7UFAVLE5IMIZRD6N6WOJUWKY4GFN34LOBEEUS4W2T2D');

// Create an object to represent the new asset
var astroDollar = new StellarSdk.Asset('AstroDollar', issuingKeys.publicKey());

// First, the receiving account must trust the asset
server.loadAccount(receivingKeys.publicKey())
  .then(function(receiver) {
    var transaction = new StellarSdk.TransactionBuilder(receiver)
      // The `changeTrust` operation creates (or alters) a trustline
      // The `limit` parameter below is optional
      .addOperation(StellarSdk.Operation.changeTrust({
        asset: astroDollar,
        limit: '1000'
      }))
      .build();
    transaction.sign(receivingKeys);
    return server.submitTransaction(transaction);
  })

  // Second, the issuing account actually sends a payment using the asset
  .then(function() {
    return server.loadAccount(issuingKeys.publicKey())
  })
  .then(function(issuer) {
    var transaction = new StellarSdk.TransactionBuilder(issuer)
      .addOperation(StellarSdk.Operation.payment({
        destination: receivingKeys.publicKey(),
        asset: astroDollar,
        amount: '10'
      }))
      .build();
    transaction.sign(issuingKeys);
    return server.submitTransaction(transaction);
  })
  .catch(function(error) {
    console.error('Error!', error);
  });

Ganti nilai dari issuingKeys dan receivingKeys pada coding diatas dengan private key dari account pengirim dan penerima.

Discoverablity dan Meta information

Hal lain yang penting ketika mengeluarkan asset adalah memberikan infomasi yang jelas tentang apa yang diwakili oleh asset tersebut. Info ini bisa ditemukan dan ditampilkan oleh client sehingga users tau dengan jelas apa yang mereka dapat ketika memiliki asset tersebut. Untuk ini kita mesti lakukan 2 hal sederhana.

Pertama, tambahkan satu bagian pada file stellar.toml file yang berisi  meta fields yang diperlukan:

# stellar.toml example asset
[[CURRENCIES]]
code="GOAT"
issuer="GD5T6IPRNCKFOHQWT264YPKOZAWUMMZOLZBJ6BNQMUGPWGRLBK3U7ZNP"
display_decimals=2 
name="goat share"
desc="1 GOAT token entitles you to a share of revenue from Elkins Goat Farm."
conditions="There will only ever be 10,000 GOAT tokens in existence. We will distribute the revenue share annually on Jan. 15th"
image="https://pbs.twimg.com/profile_images/666921221410439168/iriHah4f.jpg"

Kedua, gunakan set options operation untuk menge-set homeDomain dari account yang mengeluarkan asset menjadi domain dimana file stellar.toml di-hosting-kan. Code berikut ini untuk menge-set home domain:

var StellarSdk = require('stellar-sdk');
StellarSdk.Network.useTestNetwork();
var server = new StellarSdk.Server('https://horizon-testnet.stellar.org');

// Keys for issuing account
var issuingKeys = StellarSdk.Keypair
  .fromSecret('SCZANGBA5YHTNYVVV4C3U252E2B6P6F5T3U6MM63WBSBZATAQI3EBTQ4');

server.loadAccount(issuingKeys.publicKey())
  .then(function(issuer) {
    var transaction = new StellarSdk.TransactionBuilder(issuer)
      .addOperation(StellarSdk.Operation.setOptions({
        homeDomain: 'yourdomain.com',
      }))
      .build();
    transaction.sign(issuingKeys);
    return server.submitTransaction(transaction);
  })
  .catch(function(error) {
    console.error('Error!', error);
  });

Best Practices

Setelah berhasil mengeluarkan asset sendiri, ada beberapa best practices yang bisa kita ikuti untuk security yang lebih baik dan pengelolaan yang lebih mudah.

Specialized Issuing Account

Pada dasarnya kita bisa mengeluarkan asset dari semua Stellar account. Namu, jika kita menjalankan bisnis atau institusi keuangan, sebaiknya buat satu account khusus untuk mengeluarkan asset. Kenapa?

  • Tracking lebih mudah: karena asset mewakili credit, ia akan hilang ketika dikirim balik kepada account yang mengeluarkannya. Untuk lebih mudah melacak dan mengontrol jumlah sirkulasi asset,  buatlah asset dari account pembuat asset dan transfer ke account operasional untuk operasi normal nantinya.Account pembuat asset boleh mengeluarkan asset ketika nilai yang diwakilinya (underlying value) seperti pisang atau uang dollar tadi benar-benar ada di tangan dan account yang terlibat pada transaksi public tidak akan pernah kuatir atas jumlah yang tersedia di luar Stellar.
  • Membuat trust menjadi sederhana: semakin besar kita menggunakan Stellar, kita akan perlu membuat banyak account untuk banyak keperluan, seperti membuat transaksi pada rate yang tinggi. Dengan membuat account pembuat asset yang resmi akan membuat orang lain lebih mudah percaya.

Otorisasi Requiring atau Revoking

Account punya beberapa flags terkait proses pengeluaran asset. Dengan mengeset flag AUTHORIZATION REVOCABLE memungkinkan kita untuk membekukan asset yang sudah dikeluarkan dalam kasus misalnya ada pencurian atau hal-hal lainnya. Ini umumnya berguna untuk asset currencies, tapi bisa juga di aplikasikan pada asset jenis lainnya juga.

Jika asset kita punya tujuan tertentu atau kita ingin mengontrol siapa saja yang boleh melakukan pembayaran dengan asset itu, gunakan flag AUTHORIZATION REQUIRED yang akan berakibat account pembuat asset akan menyetujui trustline sebelum account penerima diijinkan dibayar menggunakan asset itu.

Contoh berikut ini men-set authorization required dan revocable:

StellarSdk.Network.useTestNetwork();
var flags = StellarSdk.xdr.AccountFlags;
var transaction = new StellarSdk.TransactionBuilder(issuingAccount)
  .addOperation(StellarSdk.Operation.setOptions({
    setFlags: StellarSdk.AuthRevocableFlag | StellarSdk.AuthRequiredFlag
  }))
  .build();
transaction.sign(issuingKeys);
server.submitTransaction(transaction);

Cek Trust Sebelum Pembayaran

Karena pada setiap transaksi terdapat biaya yang kecil, kita mungkin perlu memastikan bahwa account punya trustline dan bisa menerima asset kita sebelum kita kirim payment. Jika sebuah account punya trustline, account itu akan didaftarkan pada balances setiap account (walaupun saldo nya 0).

var astroDollarCode = 'AstroDollar';
var astroDollarIssuer =
  'GC2BKLYOOYPDEFJKLKY6FNNRQMGFLVHJKQRGNSSRRGSMPGF32LHCQVGF';

var accountId = 'GA2C5RFPE6GCKMY3US5PAB6UZLKIGSPIUKSLRB6Q723BM2OARMDUYEJ5';
server.loadAccount(accountId).then(function(account) {
  var trusted = account.balances.some(function(balance) {
    return balance.asset_code === astroDollarCode &&
           balance.asset_issuer === astroDollarIssuer;
  });

  console.log(trusted ? 'Trusted :)' : 'Not trusted :(');
});

Lebih Jauh Tentang Assets

Setelah menguasai basic tentang custom assets, perlu kita cek juga technical details pada konsep asset.