恆星幣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交易歷史
下面的程式碼將每頁僅返回一個交易。你可以使用historyPage
的next()
方法繼續提取後續的交易:
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()