恆星幣Stellar對接教程

  • 2019 年 10 月 30 日
  • 筆記

Stellar區塊鏈是一個廣泛使用的區塊鏈網路。在這個教程中,我們將學習使用JavaScript程式碼創建Stellar賬戶、進行Stellar賬戶充值、並向Stellar區塊鏈提交賬戶間的轉賬交易。

1、Stellar概述

要快速掌握區塊鏈和數字貨幣應用開發,推薦匯智網的區塊鏈開發系列在線教程。 內容涵蓋比特幣、以太坊、EOS、超級賬本、Tendermint等多種主流區塊鏈 平台, 同時支援Java、C#、Python、PHP、JavaScript、Dart等多種開發 語言。

Horizon:應用程式通過Horizon開發介面與Stellar網路交互。Horizon是一個RESTful HTTP API伺服器,利用Horizon API開發者可以提交交易,檢查賬戶餘額並訂閱事件。你可以在web瀏覽器中使用Horizon API,或者使用cURL命令行訪問Horizon API,不過最簡單的方法就是使用官方提供的Stellar SDK,目前官方已經支援JavaScript、Java和Go,同時社區也開發了Python、C#和Ruby的SDK。

Stellar Core:是Stellar網路的主幹,每個Horizon伺服器都需要連接到Stellar Core。Stellar Core負責驗證交易並達成共識。所有個體運行的Stellar Core形成了去中心化的Stellar網路,網路上的每個交易都需要支付一小筆費用:100 stroop(0.00001 XLM),交易手續費的目的是阻止網路上的垃圾資訊。

Stellar共識協議 – SCP:SCP在安全和活性之間選擇了安全 – 當出現分區事件或有行為異常的節點時,SCP會停止網路的運行,直到可以達成網路的共識。關於SCP的詳細資訊請參考Stellar白皮書

使用Docker運行Stellar Core:只要運行一個Stellar Core實例,就可以加入Stellar網路。我們可以使用Stellar/quickstart這個docker鏡像來快速創建一個Stellar Core實例。

測試鏈 對於開發者而言,幸運的是Stellar也提供了一個測試鏈供開發使用。你可以在這裡查看其詳細資訊。

2、Stellar開發概述

在繼續學習之前,希望你對JavaScript、Express和Async/Await有初步的了解。

我們將在測試鏈上創建兩個賬戶,然後充值這兩個賬戶,並在這兩個賬戶之間進行一些隨意地轉賬。最後,我們希望使用交易瀏覽器提取交易資訊。總之,本教程的目的是讓你快速了解Stellar區塊鏈開發的基礎知識。

你可以在這裡找到本教程的完整程式碼。在本教程的結尾部分也有完整的程式碼。

3、創建Stellar賬戶

Stellar JavaScript SDK在所有官方SDK中是最穩定的一個。我們可以使用如下命令安裝JS SDK:

npm i -S stellar-sdk

使用下面的JS程式碼來初始化一個連接測試鏈的Server實例:

const server = new Stellar.Server('https://horizon-testnet.stellar.org')  Stellar.Network.useTestNetwork()

現在我們可以創建兩個隨機賬戶了。Stellar SDK提供了一個函數用於在不提供密碼學種子的情況下創建隨機密鑰對:

let pairA = Stellar.Keypair.random()  let pairB = Stellar.Keypair.random()

得到的Keypair對象提供了兩個方法分別用於獲取密鑰對的公鑰和密文種子:

  • publicKey():獲取公鑰
  • secret():獲取密文種子

接下來我們定義初始化賬戶的路由。在下面的函數中,我們將向Stellar測試鏈上的friendbot發送請求以充值之前創建的密鑰對賬戶。friendbot會自動給我們的賬戶分別充值10.000個Lumen。下面的程式碼使用request-promise包來發送請求給Horizon測試鏈API,這個包可以很好地配合async/await。我們在 查詢字元串中傳入要充值的公鑰地址。

await rp.get({    uri: 'https://horizon-testnet.stellar.org/friendbot',    qs: { addr: pairA.publicKey() },    json: true  })

賬戶現在已經創建好了,但是我們在應用中還沒有賬戶對象。使用如下的程式碼獲取:

accountB = await server.loadAccount(pairB.publicKey())

現在可以檢查我們的賬戶中是不是已經有了一些Stellar幣了:

accountA.balances.forEach((balance) => {    console.log('Type:', balance.asset_type, ', Balance:', balance.balance)  })

上面的程式碼略加修改就可以獲取賬戶B的餘額,你可以試一下!

4、Stellar轉賬交易

一個交易(transaction)可以包含多個操作(operation)。出於簡化考慮,我們將只使用轉賬操作。在下面的示例中將pairB的公鑰作為轉賬目標地址,轉賬數量為30.000000001。Stellar SDK要求mount參數應當聲明7位小數:

const transaction = new Stellar.TransactionBuilder(accountA)    .addOperation(Stellar.Operation.payment({      destination: pairB.publicKey(),      asset: Stellar.Asset.native(),      amount: '30.0000001'    }))    .build()

酷!交易現在就等著發送賬戶進行簽名了,我們可以使用transaction.sign(pairA)來進行這一步。好了,簽完名就可以發送給Horizon了:

const transactionResult = await server.submitTransaction(transaction)

5、提取Stellar交易歷史

下面的程式碼將每頁僅返回一個交易。你可以使用historyPagenext()方法繼續提取後續的交易:

let historyPage = await server.transactions()    .forAccount(accountA.accountId())    .call()

我們要列印XDR編碼的交易中的操作詳情。首先需要解碼為base64并迭代所有操作來顯示發送的金額:

let txDetails = Stellar.xdr.TransactionEnvelope    .fromXDR(historyPage.records[1].envelope_xdr, 'base64')    txDetails._attributes.tx._attributes.operations    .map(operation => console.log(      `Transferred amount:      ${operation._attributes.body._value._attributes.amount.low} XLM`    ))

最後,讓我們獲取下一個historyPage

historyPage = await historyPage.next()

6、Stellar補充技能

  • 你可以瀏覽Stellar網路中的交易,查看這個示例
  • 交易的元數據保存為XDR格式,你可以在這裡進行反序列化
  • 你可以查看指定公鑰的所有交易,這是一個示例
原文鏈接:Stellar區塊鏈開發入門教程