# Web3.0 / Blockchain ？

By [Suyi](https://paragraph.com/@suyi-cn) · 2022-09-17

---

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

应用场景
----

### 基础场景：用户体系

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

*   identity
    
*   role/permission
    

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

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

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

有了用户，还需要什么？—— **角色权限表**。

> EIP-1155: Multi Token Standard
> 
> [https://eips.ethereum.org/EIPS/eip-1155](https://eips.ethereum.org/EIPS/eip-1155)

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

![](https://storage.googleapis.com/papyrus_images/55846a42c4e3154f9314e8f06a8de765904efd8a6df80539d12fd2eb8a1654f4.png)

我通过 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](https://eips.ethereum.org/EIPS/eip-4361)

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

![](https://storage.googleapis.com/papyrus_images/b62b4cd8cddb504580cbcae4e876cd5a43e73c311b5b4e667a0efcef1c2807bf.png)

鉴权能力可通过后端查询（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](https://eips.ethereum.org/EIPS/eip-20)

代币可用于：

*   兑换 存储空间等
    
*   兑换 T恤 等纪念品
    

* * *

技术方案
----

### 工具包/库

*   [https://github.com/spruceid/siwe](https://github.com/spruceid/siwe)
    

未完待续。

---

*Originally published on [Suyi](https://paragraph.com/@suyi-cn/web3-0-blockchain)*
