作为一个想入门web3的前端来说,你一定很熟悉web2。也一定很好奇web3有什么特别呢?
作为一个想入门web3 的前端来说,你一定很熟悉web2。也一定很好奇web3 有什么特别呢?
web3 服务多数不存在一个中心化服务器,他们依托于一个P即使有也是为了索引和辅助中心化节点网络存在的。整个链上的数据都可以通过 公链定义的 RPC 接口 获取。web3 用这种方式解决了数据读取的问题。
如上所述,数据读取是公开的。那么写入是怎么控制的呢?
web3 的数据变更任务都被分在了一个叫做交易的基本单位当中。当需要变更的数据的升级后, 发起者需要构建一个交易单位,其中包含了怎么变更数据。这种变更可能是调用系统原生功能转移操作原生基础数据,也可能是调用智能合约变更智能合约相关的数据。构建交易,完成交易签名发送给节点,节点将交易执行,并将数据变更同步到其他的节点。
web3 中的账户存在匿名性,即无法通过一个账户确定一个人,只可以确定相关的数字资产。这也是web3 会被用在勒索病毒中交易的一种重大原因,无法完成溯源。
web3 中的账户称为地址,和一对非对称加密的的秘钥相关,一般由秘钥对的公钥按照一定的算法(或者直接使用公钥)作为账户地址。链上相关的资产全部和这个地址强相关。
按照以上的说法,数据全局可读,依赖交易变更数据。验证交易的正确性中包含了账户对应私钥的签名。即 账户对应的私钥控制了账户在公钥上对应的数字资产。 所以,在web3 的世界里存在一种说法。
私钥即为正义
OK. 聊了这么多,接下来,我们来借助一下 SUI 公链 来实践熟悉这些个相关概念。
web3中访问数据的一个基础设施叫做 浏览器,有别于我们常用的网页浏览器。通过他可以获取到链上所有的账户信息、交易信息、等等。
SUI 的浏览器目前比较好的有两个:
节点背后一般对应了 RPC 服务,通过 普通的 http 请求就可以获取相应的链上信息,也可以程序化完成。
sui 官方提供了三组网络对应的 RPC 网关 。
同时提供了 RPC 文档 https://docs.sui.io/sui-api-ref ,也就是普通的文档请求。你完全可以用自己熟悉的http 请求方式获取信息。 或者使用,官方提供的sdk。
SUI 中交易的基本单位也是交易,区别于其他公链的一个特点是 SUI 的交易具有可编程的特性。 交易的可编程性可以通过 前端代码来完成,即前段代码完成了交易的组合特性。
SUI 的账户支持 三种格式的秘钥: ed25519, secp256k1, secp256r1。同时,由于结合zk 的概念,创建了zk 的账户,可以借助于web2.0 中的登录信息,构建一个账户,这部分账户的签名由zk 来保证,而不是依赖于 普通公钥的非对称加密。
按照以上秘钥对部分的说法,可以使用SUI 的sdk 初始化三种类型的账户:
import { Ed25519Keypair } from "@mysten/sui.js/keypairs/ed25519";
import { Secp256k1Keypair } from "@mysten/sui.js/keypairs/secp256k1";
import { Secp256r1Keypair } from "@mysten/sui.js/keypairs/secp256r1";
const ed25519 = new Ed25519Keypair();
console.log(ed25519.toSuiAddress());
const secp256k1 = new Secp256k1Keypair();
console.log(secp256k1.toSuiAddress());
const pair = new Secp256r1Keypair();
console.log(pair.toSuiAddress());
有了账户,就可以使用私钥进行签名,公钥进行验签,可以完成可信任的P2P验证规则。 所以签名保证了交易的安全性,所以,这篇文章以一个账户签名的实例来入门web3吧。
import { Ed25519Keypair } from "@mysten/sui.js/keypairs/ed25519";
import { Secp256k1Keypair } from "@mysten/sui.js/keypairs/secp256k1";
import { Secp256r1Keypair } from "@mysten/sui.js/keypairs/secp256r1";
describe("Basic account test", async () => {
it("should return true", async () => {
const ed25519 = new Ed25519Keypair();
console.log(ed25519.toSuiAddress());
const secp256k1 = new Secp256k1Keypair();
console.log(secp256k1.toSuiAddress());
const pair = new Secp256r1Keypair();
console.log(pair.toSuiAddress());
const messsage = "hello world";
const signature = await pair.signPersonalMessage(Buffer.from(messsage));
console.log(signature);
const result = await pair
.getPublicKey()
.verifyPersonalMessage(Buffer.from(messsage), signature.signature);
console.log(result);
});
});
欢迎加入 Let's Move 社区:
telegram: <https://t.me/move_cn>\ QQ群: 79489587
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!