Cover photo

Web3.0 / Blockchain ?

过去常听别人讲区块链,但大多是停留在炒币的层面,过年假期简单尝试了一下 DApp 开发,不禁在想,区块链究竟能给我们带来什么?应用场景是什么,以及怎么做合适,这些问题,币圈依然在探索,但我们这里先从几个简单的例子切入,从应用层去做一点大胆的尝试。

应用场景

基础场景:用户体系

众所周知,基础在每一个应用/业务系统中,我们都必须实现一套用户体系,我们需要的到底是什么?这里就不故弄玄虚了,给出我的理解:

  • identity

  • role/permission

后续的业务流程,几乎都是在此之上的拓展。

一个基础的概念是,钱包的地址是唯一的,其次,区块链钱包的所有权在哪里?——是私钥的所有者。

这对应到用户体系是不就是账号密码吗?我们建立的用户体系,如果服务器被攻击,甚至可能导致社工库攻击,导致用户其他站点的资源受损,但如果换成钱包的地址呢,私钥在用户手中,我们又能得到唯一的地址对应到用户的 identity,显而易见,我们不再需要建立一张 用户表 了!

有了用户,还需要什么?—— 角色权限表

EIP-1155: Multi Token Standard

https://eips.ethereum.org/EIPS/eip-1155

这里我们就看到 NFT 的应用场景了,这个概念对很多人还是很模糊,我们拿 ERC1155 的 NFT 标准一看,就会发现有趣的事情,可以用来做权限角色啊!

post image

我通过 ERC1155 在 BSC TEST NETWORK 部署了一份智能合约,其中设定了四种角色如下:

export const COLLECTION_ENUM = {
  PLATINUM: 0,
  GOLD: 1,
  SILVER: 2,
  COPPER: 3,
};

并且合约的构造函数中,设定好了数量(当然,数量可变)如下:

contract SPSR is
    Initializable,
    ERC1155Upgradeable
{
    function initialize() public initializer {
        __ERC1155_init('');

        _mint(msg.sender, 0, 10**2, '');
        _mint(msg.sender, 1, 10**4, '');
        _mint(msg.sender, 2, 10**6, '');
        _mint(msg.sender, 3, 10**8, '');
    }
}

怎么做?—— 拥有对应的 NFT 则表示该地址有对应的 角色/权限

基础场景:登录认证

EIP-4361: Sign-In with Ethereum.

Standardizes off-chain authentication for Ethereum accounts to establish sessions.

https://eips.ethereum.org/EIPS/eip-4361

参考该 EIP 以及对应的工具库如 SIWE 可以看到,我们能够使用钱包(off-chain)实现为 ETH 账户建立 Session,由此实现登录的能力。

post image

鉴权能力可通过后端查询(RPC调用)该账户持有的 NFT 实现。

拓展场景:多站鉴权/创作激励

基于上述两种场景,我们可以实现认证鉴权,那么又一个问题来了,拓展场景是什么呢?

举例来说,CNode.js / CNPM 都需要用户体系和角色,但是部署两份合约显然是需要消耗 GAS 的,那我们就可以使用同一份智能合约,在不同站点公用,通过后端查询对应的区块链网络,比如我定义的 SPSR ERC1155 的 NFT,在 CNode.js / CNPM 去 BSC 查询用户持有的 NFT 来判断角色,进而实现对应的业务逻辑。

再者,我们也可以发行对应的 TOKEN,基于 ERC20 合约,建立代币,激励社区,减少类似 COLORJS 的悲剧。

EIP-20: Token Standard

https://eips.ethereum.org/EIPS/eip-20

代币可用于:

  • 兑换 存储空间等

  • 兑换 T恤 等纪念品


技术方案

工具包/库

未完待续。