当 Sealos 遇上区块链

当 Sealos 遇上区块链

拿着区块链技术不一定是去发币,很多业务系统也适合用这些技术,比如做个统一支付系统,积分系统等,可以做为一家公司的金融基础设施,或支付中台。拿链的技术去做有很多好处:

  • 高可用,自带多区域高一致性的能力,自带高可用能力和校验能力。
  • 安全,很大程度防范黑客或者用户篡改资金账户的可能性,非对称加密能力完备。
  • 有成熟的支付和转账等能力,只需要调用几个简单接口就可以完成金额转化。
  • 高鲁棒性,每个新 region 都可以在本地跑一个矿工节点,本地节点负责与其他节点建立 p2p 通信。
  • 多数据中心数据强一致性,不会出现因为网络问题导致数据脑裂。
  • 智能合约可以探索更多业务可能性,可扩展性好。

比如这就是基于区块链技术实现的一套统一支付系统的架构图,主要是利用区块链打造一个数据基础设施。

本文主要讲如何构建这样一套方案的实现细节,主要核心用的技术有:

  • substrate 框架,现在合并到了 polkadot-sdk 中了,区块链底层。
  • sealos 用来容器化方式启动区块链。
  • laf 用来写代码实现用户账户创建,转账等操作的例子。

启动区块链

打开 https://cloud.sealos.io 应用管理

image

image

命令行参数详情:

["--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 环境,我可以确保自己构建环境可以恶心死你。

image

当日志正常输出时,表示链已经正常工作了。

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}`);// 创建一个新的 keyringconst 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 字段就可以配置初始地址里面的资金,这个地址用上面的代码生成就行,私钥你自己保存好,不用触网。 配置起来很简单,祝大家财务自由。

image

然后在 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.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

【友情提醒:搬砖有风险,跑链需谨慎,若踩缝纫机,亲人两行泪】 sealos 以kubernetes为内核的云操作系统发行版,让云原生简单普及

laf 写代码像写博客一样简单,什么docker kubernetes统统不关心,我只关心写业务!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网,则连通 n 个城市只需要 n - 1 条线路。这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信…

机器学习之无监督学习

聚类:发掘纵向结构的某种模式信息,某些x属于相同的分布或者类别 特征学习:发掘横向结构的某种模式信息,每一行都可以看成是一种属性或特征 密度估计:发掘底层数据分布,x都是从某个未知分布p(x)采出来的&a…

(四)STM32 操作 GPIO 点亮 LED灯 / GPIO工作模式

目录 1. STM32 工程模板中的工程目录介绍 2. GPIO 简介 3. GPIO 框图剖析 1)保护二极管及上、下拉电阻 2) P-MOS 管和 N-MOS 管 3)输出数据寄存器 3.1)ODR 端口输出数据寄存器 3.2)BSRR 端口位设置/清除寄存器 4&a…

【Java代码审计】目录穿越篇

【Java代码审计】目录穿越篇 1.Java中的目录穿越2.目录穿越漏洞审计3.Java中目录穿越漏洞修复 1.Java中的目录穿越 目录穿越漏洞产生的本质是路径可控,一旦涉及文件的读取问题便会涉及java.io.File类,因此在审计这类漏洞时可以优先查找java.io.File引用…

最强Pose模型RTMO开源 | 基于YOLO架构再设计,9MB+9ms性能完爆YOLO-Pose

实时多人在图像中的姿态估计面临着在速度和精度之间实现平衡的重大挑战。尽管两阶段的上下文方法在图像中人数增加时会减慢速度,但现有的单阶段方法往往无法同时实现高精度和实时性能。 本文介绍了RTMO,这是一个单阶段姿态估计框架,通过在YOL…

超文本传送协议HTTP

目录 HTTP简介: URL的格式: HTTP协议的特点: HTTP/1.0协议: HTTP/1.1协议: HTTP/2: HTTP代理服务器: HTTP的报文结构: 请求报文的特点: 响应报文的特点: Cook…

小 cookie,大作用:探索网站中的隐私追踪器(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/services/itcBulletin 路由发送特殊构造的数据包,利用报错注入获取数据库…

springboot——定时任务、异步任务

springboot——定时任务、异步任务 一、定时任务1、创建一个定时任务、时间配置文件2、springboot主程序开启定时任务 EnableScheduling3、使用 Scheduled 注解 二、定时任务、异步执行。1、springboot主程序开启异步任务 EnableAsync2、方法上增加 Async 注解,标识…

【JAVA日志框架】JUL,JDK原生日志框架详解。

前言 Java日志体系混乱?Java日志框架系列,清晰简洁整理好整个Java的日志框架体系。第一篇,JDK原生日志框架——JUL。 目录 1.概述 2.日志级别 3.配置 4.继承关系 1.概述 日志框架的核心问题: 日志是用来记录应用的一些运行…

nodejs+vue+微信小程序+python+PHP校园二手交易系统的设计与实现-计算机毕业设计推荐

(2)管理员 进行维护,以及平台的后台管理工作都依靠管理员,其可以对信息进行管理。需具备功能有;首页、个人中心、学生管理、物品分类管理、物品信息管理、心愿贴、系统管理、订单管理等功能。系统分成管理员控制模块和学生模块。 本系统有良好…

maven+spock

pom配置 话说JunitMockito的组合用起来是真难用&#xff0c;还是Spock的简单&#xff0c;尤其是参数化的测试。junit的Parameter是鸡肋&#xff0c;杂恶心&#xff1b;Theories用来也不爽。 <?xml version"1.0" encoding"UTF-8"?><project xm…

Spring容器中scope为prototype类型Bean的回收机制

文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时&#xff0c;遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…

Flask学习三:模型操作

ORM flask 通过Model操作数据库&#xff0c;不管你的数据库是MySQL还是Sqlite&#xff0c;flask自动帮你生成相应数据库类型的sql语句&#xff0c;所以不需要关注sql语句和类型&#xff0c;对数据的操作flask帮我们自动完成&#xff0c;只需要会写Model就可以了 flask使用对象关…

第十五章总结

一.输入/输出流 1.输入流 InputStrema类是字节输入流的抽象类&#xff0c;它是所有字节输入流的父类。 该类中所有方法遇到错误都会引发IOException异常。 read()方法&#xff1a;从输入流中读取数据的下一个字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的…

【模块化】 js 模块化(CommonJS, AMD, UMD, CMD, ES6)

目录 js 的演变模块化1. CommonJS 规范commonJs伪代码⭐CommonJS优缺点 2. AMD 规范⭐AMD 优缺点 3. UMD 规范⭐UMD AMD CommonJS 4. CMD 规范⭐CMD 优缺点 5. ES6 模块化符号绑定⭐ESM 优缺点 AMD 和 CMD 的区别ES6 模块与 CommonJS 模块的差异参考 将介绍几种 js 模块化的规…

新能源汽车的“一池春水”,或许不再由价格战掀起波澜?

2005年12月15日&#xff0c;丰田普锐斯混合动力车进入中国&#xff0c;拉开了国内新能源汽车发展的序幕。18年后的今天&#xff0c;国产及进口的新能源汽车已经渗透我国超三分之一的乘用车市场&#xff0c;与油车二分天下的愿景渐趋实现。 今年11月&#xff0c;随着购车需求进…

轻量封装WebGPU渲染系统示例<50>- Json数据描述材质等场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene2.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: json场景数据: {"renderer": {"mtplE…

105基于matlab的阶次分析算法

基于matlab的阶次分析算法&#xff0c;用于变转速机械故障特征提取&#xff0c;可运行&#xff0c;包含寻找脉冲时刻&#xff0c;等角度时刻。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 105阶次分析变转速信号处理 (xiaohongshu.com)

云原生之深入解析亿级流量架构之服务限流思路与方法

一、限流思路 ① 熔断 系统在设计之初就把熔断措施考虑进去&#xff0c;当系统出现问题时&#xff0c;如果短时间内无法修复&#xff0c;系统要自动做出判断&#xff0c;开启熔断开关&#xff0c;拒绝流量访问&#xff0c;避免大流量对后端的过载请求。系统也应该能够动态监测…