getting started on stellar with javascript SDK

# stellarについて調査してみた

[合同会社kumanote](https://kumano-te.com/)の田中です。
今回はstellarについて簡単に調査してみました。
あまり文献がなかったので[公式サイト](https://www.stellar.org/)をみて調査しました。

## 概要（stellarとは）

- stellarでは`lumens`というアセット（bitcoin等に対応）が管理されている
  - もともと stellarという名前だったが、団体やネットワークと区別させるために`lumens`に変更された
  - 2014年に1000億個のstellar（現lumens）と共に発足した
  - 略称はXLMである
- stellarとはネットワークを指し、アセット（通貨）そのものではない
- stellarネットワークがアセット（XLM）を必要としている理由は次の２つ
  - dos攻撃などの悪意のある攻撃をふせぐため
  - 複数の通貨ペアの取引を円滑にするため（XLMが基軸となって取引できる）
- XLMは毎年1%ずつインフレするように設計されており
- トランザクション時に支払う手数料もこのインフレプールに追加されるとのこと
- XLMは無料で配布され、現在も配布され続けている。（10年たったら、取引所で買う以外に得られる方法はなくなるんじゃないかとのこと）


### 個人的に感じた点

stellarの思想としては
現在、銀行（ATMとか）などの金融サービスを受けることができない人々が恩恵をうけれるように
小さな単位でのお金のやりとりができるネットワークを目指しているように見受けられました。

（途上国では）トランザクションの手数料が1日の給料レベルになったりする可能性もあり。
（BTCとかだとトランザクション手数料がばかにならないですよね。。。）
そんなサービスだとなりたたないので、かなり手数料を低くおさえる必要があります。

wallet（XLMが使えるシーン）を普及させることさえできれば、かなり夢がありますね！

### Horizon

HorizonっていうRESTful HTTP API serverを使ってネットワークとやりとりをするらしい
単なるcurlやSDK（Js/Java/Goが公式でサポート）を使ってやってねとのこと->Js SDKを使った送金を後述します。

### Stellar Core

networkを構成するCoreノードの部分を担っている
このCoreのインスタンスの集まりでnetworkができているとのこと

### その他

- [ダッシュボード](https://dashboard.stellar.org/)をみることができる。


## SDKを軽く触っておく

### 環境

nodeが使える状態にしておきます。

```bash
mkdir test-stellar
cd test-stellar
npm init
npm install --save stellar-sdk request
# 適宜必要なライブラリは足していく
```

### 実行

```
node
# -> then node terminal console will be opened.
```

#### create an account

apiを使ってアカウントを作成します。
testnet上のfriendbotというサービスを使うと最初からある程度のXLMを保持した状態で作成することができます。

```js
var StellarSdk = require('stellar-sdk');
var keypair = StellarSdk.Keypair.random();
keypair.secret();
'SCY7QSROTEO2FW7Q5GQBGJWGKNJA47CVV7YSS4J5K2SPC64BTPYHFOOK'
keypair.publicKey();
'GDNUPLANU2ZIZBDWSLORMNIPNSU2JEDFTXB6MYEOZQKG3OIJWX4MQ2KY'

var request = require('request');
request.get({
  url: 'https://horizon-testnet.stellar.org/friendbot',
  qs: { addr: keypair.publicKey() },
  json: true
}, function(error, response, body) {
  if (error || response.statusCode !== 200) {
    console.error('ERROR!', error || body);
  }
  else {
    console.log('SUCCESS! You have a new account :)\n', body);
  }
});
> SUCCESS! You have a new account :)
 { _links: { transaction: { href: 'https://horizon-testnet.stellar.org/transactions/b07c9200ce1714ec0cdccf6d1daa72a0485df814931a2f242479fe6b1ff308b5' } },
  hash: 'b07c9200ce1714ec0cdccf6d1daa72a0485df814931a2f242479fe6b1ff308b5',
  ledger: 3794189,
  envelope_xdr: 'AAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAAAZAAACT0AAE2+AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA20esDaayjIR2kt0WNQ9sqaSQZZ3D5mCOzBRtuQm1+MgAAAAXSHboAAAAAAAAAAAB+BaLPwAAAEC9x3UcIU4BR1qnlkTVeBaWbimFQSzOA9/x5UkAvyY/4CNk8tmjoEV4IiBE2Qu2HTS8GNMLfubSbO6Z5uGCKd8A',
  result_xdr: 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=',
  result_meta_xdr: 'AAAAAAAAAAEAAAACAAAAAAA55Q0AAAAAAAAAANtHrA2msoyEdpLdFjUPbKmkkGWdw+ZgjswUbbkJtfjIAAAAF0h26AAAOeUNAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQA55Q0AAAAAAAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAJ9KRMpWugAAAk9AABNvgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' }

var server = new StellarSdk.Server('https://horizon-testnet.stellar.org');
server.loadAccount(keypair.publicKey()).then(function(account) {
  console.log('Balances for account: ' + keypair.publicKey());
  account.balances.forEach(function(balance) {
    console.log('Type:', balance.asset_type, ', Balance:', balance.balance);
  });
});
> Balances for account: GDNUPLANU2ZIZBDWSLORMNIPNSU2JEDFTXB6MYEOZQKG3OIJWX4MQ2KY
Type: native , Balance: 10000.0000000
```

#### send and receive money

XLMの送金を試してみます。

##### make second account

送金対象のアカウントを作ります。（先ほどと同様の手順）

```js
var keypair2 = StellarSdk.Keypair.random();
request.get({
  url: 'https://horizon-testnet.stellar.org/friendbot',
  qs: { addr: keypair2.publicKey() },
  json: true
}, function(error, response, body) {
  if (error || response.statusCode !== 200) {
    console.error('ERROR!', error || body);
  }
  else {
    console.log('SUCCESS! You have a new account :)\n', body);
  }
});
> SUCCESS! You have a new account :)
 { _links: { transaction: { href: 'https://horizon-testnet.stellar.org/transactions/4ee23708461d22c01ea0143f1d040c7e2c7e37c858dddc3f68e15c228c5f30a0' } },
  hash: '4ee23708461d22c01ea0143f1d040c7e2c7e37c858dddc3f68e15c228c5f30a0',
  ledger: 3794375,
  envelope_xdr: 'AAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAAAZAAACT0AAE3AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAQ3sBk3V/LF+4I8/8+8trxakIzG7pQcg9+Mk22ebxGAsAAAAXSHboAAAAAAAAAAAB+BaLPwAAAEBgVbqz/GMweLAn65p4dArkrfOXoGaW31yZBmZj91p+Zr+6prbN+dZAu8eAHt0Ld1hh9AKLzxtc/VLA1e+JmaIJ',
  result_xdr: 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=',
  result_meta_xdr: 'AAAAAAAAAAEAAAACAAAAAAA55ccAAAAAAAAAAEN7AZN1fyxfuCPP/PvLa8WpCMxu6UHIPfjJNtnm8RgLAAAAF0h26AAAOeXHAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQA55ccAAAAAAAAAAGXNhLrhGtltTwCpmqlarh7s1DB2hIkbP//jgzn4Fos/AAJ8+oI7iiAAAAk9AABNwAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' }
server.loadAccount(keypair2.publicKey()).then(function(account) {
  console.log('Balances for account: ' + keypair2.publicKey());
  account.balances.forEach(function(balance) {
    console.log('Type:', balance.asset_type, ', Balance:', balance.balance);
  });
});
> Balances for account: GBBXWAMTOV7SYX5YEPH7Z66LNPC2SCGMN3UUDSB57DETNWPG6EMAX363
Type: native , Balance: 10000.0000000
```

##### send XLM

実際に送金してみます。

```js
StellarSdk.Network.useTestNetwork();

server.loadAccount(keypair2.publicKey()).catch(StellarSdk.NotFoundError, function (error) {
    throw new Error('The destination account does not exist!');
  }).then(function() {
    return server.loadAccount(keypair.publicKey());
  }).then(function(from) {
    var transaction = new StellarSdk.TransactionBuilder(from)
      .addOperation(StellarSdk.Operation.payment({
        destination: keypair2.publicKey(),
        asset: StellarSdk.Asset.native(),
        amount: "10"
      }))
      .addMemo(StellarSdk.Memo.text('Test Transaction'))
      .build();
    transaction.sign(keypair);
    return server.submitTransaction(transaction);
  }).then(function(result) {
    console.log('Success! Results:', result);
  }).catch(function(error) {
    console.error('Something went wrong!', error);
  });
> Success! Results: { _links: { transaction: { href: 'https://horizon-testnet.stellar.org/transactions/aa86c819d93be39c0d3b99c280c6819d5243ea46d56ea21dda40adc52087c5b1' } },
  hash: 'aa86c819d93be39c0d3b99c280c6819d5243ea46d56ea21dda40adc52087c5b1',
  ledger: 3794647,
  envelope_xdr: 'AAAAANtHrA2msoyEdpLdFjUPbKmkkGWdw+ZgjswUbbkJtfjIAAAAZAA55Q0AAAABAAAAAAAAAAEAAAAQVGVzdCBUcmFuc2FjdGlvbgAAAAEAAAAAAAAAAQAAAABDewGTdX8sX7gjz/z7y2vFqQjMbulByD34yTbZ5vEYCwAAAAAAAAAABfXhAAAAAAAAAAABCbX4yAAAAEDho3gi7JXW3xFizSwVqWHbaGAPVNQCCr1KJD1IJRasURG3+dIZ5hlK115wSup0UhZZGDubXuowiGQnVvP4QQ4A',
  result_xdr: 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=',
  result_meta_xdr: 'AAAAAAAAAAEAAAADAAAAAwA55ccAAAAAAAAAAEN7AZN1fyxfuCPP/PvLa8WpCMxu6UHIPfjJNtnm8RgLAAAAF0h26AAAOeXHAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQA55tcAAAAAAAAAAEN7AZN1fyxfuCPP/PvLa8WpCMxu6UHIPfjJNtnm8RgLAAAAF05syQAAOeXHAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQA55tcAAAAAAAAAANtHrA2msoyEdpLdFjUPbKmkkGWdw+ZgjswUbbkJtfjIAAAAF0KBBpwAOeUNAAAAAQAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' }

// let's check
server.loadAccount(keypair.publicKey()).then(function(account) {
  console.log('Balances for account: ' + keypair.publicKey());
  account.balances.forEach(function(balance) {
    console.log('Type:', balance.asset_type, ', Balance:', balance.balance);
  });
});
> Balances for account: GDNUPLANU2ZIZBDWSLORMNIPNSU2JEDFTXB6MYEOZQKG3OIJWX4MQ2KY
Type: native , Balance: 9989.9999900

server.loadAccount(keypair2.publicKey()).then(function(account) {
  console.log('Balances for account: ' + keypair2.publicKey());
  account.balances.forEach(function(balance) {
    console.log('Type:', balance.asset_type, ', Balance:', balance.balance);
  });
});
> Balances for account: GBBXWAMTOV7SYX5YEPH7Z66LNPC2SCGMN3UUDSB57DETNWPG6EMAX363
Type: native , Balance: 10010.0000000
```
**以下確認できました**

- 最初につくったアカウントのXLMが 10000.0000000 -> 9989.9999900（10と手数料0.00001が引かれています。）
- ２つめにつくったアカウントのXLMが 10000.0000000 -> 10010.0000000（10増えている）

## 最後に

（※私なりの解釈ですが）**stellarのシステム思想として**は
「決済部分だけをstellar networkに依存し、個別の処理を各サービスプロバイダーが作れるように設計されています。
そのように設計することで、金融サービスを運用することへのハードルを下げ、金融サービスのコストが下がり、いままで恩恵を受けられなかった人達までその恩恵にさずかれる」といった感じでしょうか。

サービス事業者側としては、決済されたか否かは全てstellarに丸投げして、決済されたことを確認してサービス側の処理を動かせば良い感じですね。
難度と運用コストが高い決済（トランザクション周りの）処理をstellar networkに依存し、サービス部分だけを開発すれば良いようになっており、応用することで様々なことが実現できるポテンシャルを秘めているように思います。


今回は以上になります。