在 Sealos 中使用区块链技术实现统一支付系统
拿著區(qū)塊鏈技術(shù)不一定是去發(fā)幣,很多業(yè)務系統(tǒng)也適合用這些技術(shù),比如做個統(tǒng)一支付系統(tǒng),積分系統(tǒng)等,可以做為一家公司的金融基礎設施,或支付中臺。拿鏈的技術(shù)去做有很多好處:
- 高可用,自帶多區(qū)域高一致性的能力,自帶高可用能力和校驗能力。
- 安全,很大程度防范黑客或者用戶篡改資金賬戶的可能性,非對稱加密能力完備。
- 有成熟的支付和轉(zhuǎn)賬等能力,只需要調(diào)用幾個簡單接口就可以完成金額轉(zhuǎn)化。
- 高魯棒性,每個新 region 都可以在本地跑一個礦工節(jié)點,本地節(jié)點負責與其他節(jié)點建立 p2p 通信。
- 多數(shù)據(jù)中心數(shù)據(jù)強一致性,不會出現(xiàn)因為網(wǎng)絡問題導致數(shù)據(jù)腦裂。
- 智能合約可以探索更多業(yè)務可能性,可擴展性好。
比如這就是基于區(qū)塊鏈技術(shù)實現(xiàn)的一套統(tǒng)一支付系統(tǒng)的架構(gòu)圖,主要是利用區(qū)塊鏈打造一個數(shù)據(jù)基礎設施。
本文主要講如何構(gòu)建這樣一套方案的實現(xiàn)細節(jié),主要核心用的技術(shù)有:
- substrate 框架,現(xiàn)在合并到了 polkadot-sdk 中了,區(qū)塊鏈底層。
- Sealos 用來容器化方式啟動區(qū)塊鏈。
- Laf 用來寫代碼實現(xiàn)用戶賬戶創(chuàng)建,轉(zhuǎn)賬等操作的例子。
啟動區(qū)塊鏈
首先在 Sealos 桌面環(huán)境中打開【應用管理】:
命令行參數(shù)詳情:
["--name","sealchain","--chain","/etc/customSpec.json","--rpc-external","--rpc-cors","all"]
這里的配置文件略惡心,開始測試時可以先不加,去掉 --chain /etc/customSpec.json 參數(shù)就行。
這個配置是通過命令生成的:
$ substrate build-spec > myCustomSpec.json
這個配置里面有一個 system code 非常惡心非常長,它是編譯成 wasm 的代碼,不能刪,所以這個配置只能先生成了再修改配置文件,substrate 的這個做法我實在不太能茍同,導致編輯配置文件的成本非常高。
測試聯(lián)通性
進 https://laf.dev/ 起一個應用,寫一個函數(shù),這個不用教,以你的智商和 Laf 的易用性你肯定會,當然如果你的時間不值錢你也可以自己構(gòu)建個 node.js 環(huán)境,我可以確保自己構(gòu)建環(huán)境可以惡心死你。
當日志正常輸出時,表示鏈已經(jīng)正常工作了。
import cloud from '@lafjs/cloud'
const { ApiPromise, WsProvider } = require('@polkadot/api');
export default async function (ctx: FunctionContext) {
const provider = new WsProvider('wss://mlnqtutcpqcy.cloud.sealos.io');
const api = await ApiPromise.create({ provider });
const chain = await api.rpc.system.chain();
const lastHeader = await api.rpc.chain.getHeader();
console.log(`Connected to chain ${chain} and block number ${lastHeader.number}`);
}
創(chuàng)建賬戶 (Keyring)
import cloud from '@lafjs/cloud'
import { Keyring } from '@polkadot/keyring';
import { mnemonicGenerate } from '@polkadot/util-crypto';
export default async function (ctx: FunctionContext) {
// 生成一個新的 12 個單詞的助記詞
const mnemonic: string = mnemonicGenerate(12);
console.log(`Mnemonic: ${mnemonic}`);
// 創(chuàng)建一個新的 keyring
const keyring = new Keyring({ type: 'sr25519' });
// 從助記詞創(chuàng)建一個新的賬戶
const pair = keyring.addFromMnemonic(mnemonic);
console.log(`Address: ${pair.address}`);
}
這里不需要連接鏈上,本質(zhì)上用戶的賬戶是公鑰,而公私鑰通常比較難記,而且大小寫什么的還容易看錯,比如 0 和 o,1 和 l,所以人們很聰明的弄出了助記詞,根據(jù) 12 個常用單詞來生成密鑰對,這下就好記了,所以你的助記詞是你的一切,千萬別讓別人知道了,類似這個樣子:
unhappy enforce oil ridge zebra pupil razor worth polar inform enter bomb
地址長這個樣子:
5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv
下面我們就可以從超級賬戶里面轉(zhuǎn)賬到這個賬戶里了,再去查詢這個賬戶的資金。
轉(zhuǎn)賬
為了方便,稍微封裝一下 API:
import { ApiPromise, WsProvider, Keyring } from '@polkadot/api'
// 連接到你的Polkadot節(jié)點
const provider = new WsProvider('wss://mlnqtutcpqcy.cloud.sealos.io');
let api = null
export async function getAPI() {
if(!api) {
api = await ApiPromise.create({ provider });
}
return api
}
從超級賬戶轉(zhuǎn)帳:
import cloud from '@lafjs/cloud'
import { ApiPromise, Keyring } from '@polkadot/api'
import { getAPI } from '@/api'
export default async function (ctx: FunctionContext) {
const api = await getAPI()
// 創(chuàng)建一個新的Keyring實例,并添加Alice賬戶
const keyring = new Keyring({ type: 'sr25519' });
// 超級賬戶的私鑰
const alicePair = keyring.addFromUri('slender alter hybrid catalog feature video pumpkin random sniff advice spoil apple'); // Alice的助記詞
// 你的接收者地址和轉(zhuǎn)賬金額
const recipientAddress = '5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv'; // 替換為你的接收者地址
const amount = 1024000000000; // 替換為你要轉(zhuǎn)賬的金額
// 查詢Alice賬戶的余額
const { data: balance } = await api.query.system.account(alicePair.address);
console.log(`Alice's balance is ${balance.free}`);
// 創(chuàng)建并發(fā)送轉(zhuǎn)賬交易
const transfer = api.tx.balances.transferAllowDeath(recipientAddress, amount);
const hash = await transfer.signAndSend(alicePair, { nonce: 6});
console.log(`Transfer sent with hash ${hash.toHex()}`);
}
再去查詢一下賬戶有沒有收到錢:
import cloud from '@lafjs/cloud'
import { ApiPromise, Keyring } from '@polkadot/api'
import { getAPI } from '@/api'
export default async function (ctx: FunctionContext) {
const api = await getAPI()
// 查詢Alice賬戶的余額
const { data: balance } = await api.query.system.account('5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv');
console.log(`Alice's balance is ${balance.free}`);
}
至此,你已經(jīng)學會了在 sealos 上啟動一個區(qū)塊鏈,并借助 laf 進行一些基礎開發(fā)與鏈交互,祝大家未來踩縫紉機愉快。下面來點高級的。
鏈超級管理員配置
超級管理員的錢是從 substrate 的 genesis 也就是創(chuàng)始塊的配置文件中得來的:
{
"name": "Sealchain",
"id": "sealos_net",
"chainType": "Live",
"bootNodes": [
],
"telemetryEndpoints": null,
"protocolId": null,
"properties": null,
"codeSubstitutes": {},
"genesis": {
"runtime": {
"system": {
"code": 275debf565db8f5318502....980e6412a472c0af5e652d25fa9838a78d0a8449688794d7749638feb6b93e0191ac90b07516"
},
"aura": {
"authorities": [
"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY",
"5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"
]
},
"grandpa": {
"authorities": [
[
"5FA9nQDVg267DEd8m1ZypXLBnvN7SFxYwV7ndqSYGiN9TTpu",
1
],
[
"5GoNkf6WdbxCFnPdAnYYQyCjAKPJgLNxXwPjwTh6DGg6gN3E",
1
]
]
},
"balances": {
"balances": [
[
"5Gh3LUk21PtfZMTnQRZDqGDVwD2mozQdwHyKRj6PW6n9r65C",
1152921504606846976
],
[
"5CRmqmsiNFExV6VbdmPJViVxrWmkaXXvBrSX8oqBT8R9vmWk",
1152921504606846976
]
]
},
"transactionPayment": {
"multiplier": "1000000000000000000"
},
"sudo": {
"key": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY"
}
}
}
}
這個文件大家務必不要復制粘貼,因為里面的 runtime.system.code 字段是編譯后的 wasm,所以一定要用命令生成這個文件,在這個文件基礎上去修改才行,我被這個問題坑死。
然后 balances 字段就可以配置初始地址里面的資金,這個地址用上面的代碼生成就行,私鑰你自己保存好,不用觸網(wǎng)。配置起來很簡單,祝大家財務*。
然后在 Sealos 里面新增配置,在命令行指定配置文件即可。
自行構(gòu)建鏈的容器鏡像
有個編譯 Rust 的環(huán)境,參考這篇文檔:https://docs.substrate.io/tutorials/build-a-blockchain/build-local-blockchain/
$ git clone https://github.com/substrate-developer-hub/substrate-node-template
$ cargo build --release
FROM ubuntu:23.10
RUN apt update && apt install --assume-yes git clang curl libssl-dev protobuf-compiler && rm -rf /var/lib/apt/lists/*
COPY ./target/release/node-template .
CMD ./node-template --dev
【友情提醒:搬磚有風險,跑鏈需謹慎】
總結(jié)
以上是生活随笔為你收集整理的在 Sealos 中使用区块链技术实现统一支付系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023年的PHP项目部署笔记。什么?还
- 下一篇: C++ Qt开发:SpinBox数值微调