當(dāng) Sealos 遇上區(qū)塊鏈

當(dāng) Sealos 遇上區(qū)塊鏈

拿著區(qū)塊鏈技術(shù)不一定是去發(fā)幣,很多業(yè)務(wù)系統(tǒng)也適合用這些技術(shù),比如做個(gè)統(tǒng)一支付系統(tǒng),積分系統(tǒng)等,可以做為一家公司的金融基礎(chǔ)設(shè)施,或支付中臺(tái)。拿鏈的技術(shù)去做有很多好處:

  • 高可用,自帶多區(qū)域高一致性的能力,自帶高可用能力和校驗(yàn)?zāi)芰Α?/li>
  • 安全,很大程度防范黑客或者用戶篡改資金賬戶的可能性,非對(duì)稱加密能力完備。
  • 有成熟的支付和轉(zhuǎn)賬等能力,只需要調(diào)用幾個(gè)簡單接口就可以完成金額轉(zhuǎn)化。
  • 高魯棒性,每個(gè)新 region 都可以在本地跑一個(gè)礦工節(jié)點(diǎn),本地節(jié)點(diǎn)負(fù)責(zé)與其他節(jié)點(diǎn)建立 p2p 通信。
  • 多數(shù)據(jù)中心數(shù)據(jù)強(qiáng)一致性,不會(huì)出現(xiàn)因?yàn)榫W(wǎng)絡(luò)問題導(dǎo)致數(shù)據(jù)腦裂。
  • 智能合約可以探索更多業(yè)務(wù)可能性,可擴(kuò)展性好。

比如這就是基于區(qū)塊鏈技術(shù)實(shí)現(xiàn)的一套統(tǒng)一支付系統(tǒng)的架構(gòu)圖,主要是利用區(qū)塊鏈打造一個(gè)數(shù)據(jù)基礎(chǔ)設(shè)施。

本文主要講如何構(gòu)建這樣一套方案的實(shí)現(xiàn)細(xì)節(jié),主要核心用的技術(shù)有:

  • substrate 框架,現(xiàn)在合并到了 polkadot-sdk 中了,區(qū)塊鏈底層。
  • sealos 用來容器化方式啟動(dòng)區(qū)塊鏈。
  • laf 用來寫代碼實(shí)現(xiàn)用戶賬戶創(chuàng)建,轉(zhuǎn)賬等操作的例子。

啟動(dòng)區(qū)塊鏈

打開 https://cloud.sealos.io 應(yīng)用管理

image
image

命令行參數(shù)詳情:

["--name","sealchain","--chain","/etc/customSpec.json","--rpc-external","--rpc-cors","all"]

這里的配置文件略惡心,開始測試時(shí)可以先不加,去掉 --chain /etc/customSpec.json 參數(shù)就行。

這個(gè)配置是通過命令生成的:

$ substrate build-spec > myCustomSpec.json

這個(gè)配置里面有一個(gè) system code 非常惡心非常長,它是編譯成 wasm 的代碼,不能刪,所以這個(gè)配置只能先生成了再修改配置文件,substrate 的這個(gè)做法我實(shí)在不太能茍同,導(dǎo)致編輯配置文件的成本非常高。

測試聯(lián)通性

進(jìn) https://laf.dev/ 起一個(gè)應(yīng)用,寫一個(gè)函數(shù),這個(gè)不用教,以你的智商和 laf 的易用性你肯定會(huì),當(dāng)然如果你的時(shí)間不值錢你也可以自己構(gòu)建個(gè) node.js 環(huán)境,我可以確保自己構(gòu)建環(huán)境可以惡心死你。

image

當(dāng)日志正常輸出時(shí),表示鏈已經(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) {
  // 生成一個(gè)新的 12 個(gè)單詞的助記詞
  const mnemonic: string = mnemonicGenerate(12);
  console.log(`Mnemonic: ${mnemonic}`);

  // 創(chuàng)建一個(gè)新的 keyring
  const keyring = new Keyring({ type: 'sr25519' });

  // 從助記詞創(chuàng)建一個(gè)新的賬戶
  const pair = keyring.addFromMnemonic(mnemonic);
  console.log(`Address: ${pair.address}`);
}

這里不需要連接鏈上,本質(zhì)上用戶的賬戶是公鑰,而公私鑰通常比較難記,而且大小寫什么的還容易看錯(cuò),比如 0 和 o,1 和 l, 所以人們很聰明的弄出了助記詞,根據(jù) 12個(gè)常用單詞來生成密鑰對(duì),這下就好記了,所以你的助記詞是你的一切,千萬別讓別人知道了,類似這個(gè)樣子:

unhappy enforce oil ridge zebra pupil razor worth polar inform enter bomb

地址長這個(gè)樣子:

5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv

下面我們就可以從超級(jí)賬戶里面轉(zhuǎn)賬到這個(gè)賬戶里了,再去查詢這個(gè)賬戶的資金。

轉(zhuǎn)賬

為了方便,稍微封裝一下 API

import { ApiPromise, WsProvider, Keyring } from '@polkadot/api'
// 連接到你的Polkadot節(jié)點(diǎn)
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
}

從超級(jí)賬戶轉(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)建一個(gè)新的Keyring實(shí)例,并添加Alice賬戶
  const keyring = new Keyring({ type: 'sr25519' });
  // 超級(jí)賬戶的私鑰
  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)學(xué)會(huì)了在 sealos 上啟動(dòng)一個(gè)區(qū)塊鏈,并借助 laf 進(jìn)行一些基礎(chǔ)開發(fā)與鏈交互,祝大家未來踩縫紉機(jī)愉快。 下面來點(diǎn)高級(jí)的。

鏈超級(jí)管理員配置

超級(jí)管理員的錢是從 substrate 的 genesis 也就是創(chuàng)始?jí)K的配置文件中得來的:

{
  "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"
      }
    }
  }
}

這個(gè)文件大家務(wù)必不要復(fù)制粘貼,因?yàn)槔锩娴?runtime.system.code 字段是編譯后的 wasm,所以一定要用命令生成這個(gè)文件,在這個(gè)文件基礎(chǔ)上去修改才行,我被這個(gè)問題坑死。

然后 balances 字段就可以配置初始地址里面的資金,這個(gè)地址用上面的代碼生成就行,私鑰你自己保存好,不用觸網(wǎng)。 配置起來很簡單,祝大家財(cái)務(wù)自由。

image

然后在 sealos 里面新增配置,在命令行指定配置文件即可。

自行構(gòu)建鏈的容器鏡像

有個(gè)編譯 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

【友情提醒:搬磚有風(fēng)險(xiǎn),跑鏈需謹(jǐn)慎,若踩縫紉機(jī),親人兩行淚】
sealos 以kubernetes為內(nèi)核的云操作系統(tǒng)發(fā)行版,讓云原生簡單普及

laf 寫代碼像寫博客一樣簡單,什么docker kubernetes統(tǒng)統(tǒng)不關(guān)心,我只關(guān)心寫業(yè)務(wù)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容