拿着区块链技术不一定是去发币,很多业务系统也适合用这些技术,比如做个统一支付系统,积分系统等,可以做为一家公司的金融基础设施,或支付中台。拿链的技术去做有很多好处:
高可用,自带多区域高一致性的能力,自带高可用能力和校验能力。
安全,很大程度防范黑客或者用户篡改资金账户的可能性,非对称加密能力完备。
有成熟的支付和转账等能力,只需要调用几个简单接口就可以完成金额转化。
高鲁棒性,每个新 region 都可以在本地跑一个矿工节点,本地节点负责与其他节点建立 p2p 通信。
多数据中心数据强一致性,不会出现因为网络问题导致数据脑裂。
智能合约可以探索更多业务可能性,可扩展性好。
比如这就是基于区块链技术实现的一套统一支付系统的架构图,主要是利用区块链打造一个数据基础设施。
本文主要讲如何构建这样一套方案的实现细节,主要核心用的技术有:
substrate 框架,现在合并到了 polkadot-sdk 中了,区块链底层。
Sealos 用来容器化方式启动区块链。
Laf 用来写代码实现用户账户创建,转账等操作的例子。
启动区块链
首先在 Sealos 桌面环境(https://cloud.sealos.io)中打开【应用管理】:
命令行参数详情:
["--name","sealchain","--chain","/etc/customSpec.json","--rpc-external","--rpc-cors","all"]
这里的配置文件略恶心,开始测试时可以先不加,去掉 --chain /etc/customSpec.json 参数就行。
这个配置是通过命令生成的:
$ substrate build-spec > myCustomSpec.json
这个配置里面有一个 system code 非常恶心非常长,它是编译成 wasm 的代码,不能删,所以这个配置只能先生成了再修改配置文件,substrate 的这个做法我实在不太能苟同,导致编辑配置文件的成本非常高。
测试联通性
进 https://laf.dev/ 起一个应用,写一个函数,这个不用教,以你的智商和 laf 的易用性你肯定会,当然如果你的时间不值钱你也可以自己构建个 node.js 环境,我可以确保自己构建环境可以恶心死你。
当日志正常输出时,表示链已经正常工作了。
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}`);}
创建账户 (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}`); // 创建一个新的 keyring const keyring = new Keyring({ type: 'sr25519' }); // 从助记词创建一个新的账户 const pair = keyring.addFromMnemonic(mnemonic); console.log(`Address: ${pair.address}`);}
这里不需要连接链上,本质上用户的账户是公钥,而公私钥通常比较难记,而且大小写什么的还容易看错,比如 0 和 o,1 和 l,所以人们很聪明的弄出了助记词,根据 12 个常用单词来生成密钥对,这下就好记了,所以你的助记词是你的一切,千万别让别人知道了,类似这个样子:
unhappy enforce oil ridge zebra pupil razor worth polar inform enter bomb
地址长这个样子:
5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv
下面我们就可以从超级账户里面转账到这个账户里了,再去查询这个账户的资金。
转账
为了方便,稍微封装一下 API:
import { ApiPromise, WsProvider, Keyring } from '@polkadot/api'// 连接到你的Polkadot节点const provider = new WsProvider('wss://mlnqtutcpqcy.cloud.sealos.io');let api = nullexport async function getAPI() { if(!api) { api = await ApiPromise.create({ provider }); } return api}
从超级账户转帐:
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() // 创建一个新的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的助记词 // 你的接收者地址和转账金额 const recipientAddress = '5HjoX44CVrqTpVLqYtiF2cFSmDwtbNUfrbKcEbKDyLnP8NCv'; // 替换为你的接收者地址 const amount = 1024000000000; // 替换为你要转账的金额 // 查询Alice账户的余额 const { data: balance } = await api.query.system.account(alicePair.address); console.log(`Alice's balance is ${balance.free}`); // 创建并发送转账交易 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}`);}
至此,你已经学会了在 sealos 上启动一个区块链,并借助 laf 进行一些基础开发与链交互,祝大家未来踩缝纫机愉快。下面来点高级的。
链超级管理员配置
超级管理员的钱是从 substrate 的 genesis 也就是创始块的配置文件中得来的:
{ "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 字段就可以配置初始地址里面的资金,这个地址用上面的代码生成就行,私钥你自己保存好,不用触网。配置起来很简单,祝大家财务自由。
然后在 Sealos 里面新增配置,在命令行指定配置文件即可。
自行构建链的容器镜像
有个编译 rust 的环境,参考这篇文档: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.10RUN 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
【友情提醒:搬砖有风险,跑链需谨慎】
加入 Sealos 开源社区
体验像个人电脑一样简单的云操作系统
🏠官网链接
https://sealos.run
🐙GitHub 地址
https://github.com/labring/sealos
📑访问 Sealos 文档
https://sealos.run/docs/Intro
🏘️逛逛论坛
https://forum.laf.run/
往期推荐
没错,数据库确实应该放入 K8s 里!
2023-12-06
稳啦,终于可以通过外网访问 Sealos 中的数据库了!
2023-12-05
为什么说 Sealos 把 K8s 多租户做到了极致
2023-11-29
关于 Sealos
Sealos 是一款以 Kubernetes 为内核的云操作系统发行版。它以云原生的方式,抛弃了传统的云计算架构,转向以 Kubernetes 为云内核的新架构,使企业能够像使用个人电脑一样简单地使用云。
关注 Sealos 公众号与我们一同成长👇👇👇