前言本文是《告别中心化身份!SSI自主主权身份,重掌数字身份话语权》的续篇,将深入探讨社交与身份新玩法的核心板块——社区所有权。延续"理论+代码"的风格,完整呈现从概念到部署的全流程落地指南。一、从"读-写"到"读-写-拥有":社区所有权的范式跃迁社区所有权是Web3区别于Web2的核心
本文是《告别中心化身份!SSI 自主主权身份,重掌数字身份话语权》的续篇,将深入探讨社交与身份新玩法的核心板块——社区所有权。延续"理论+代码"的风格,完整呈现从概念到部署的全流程落地指南。
一、从"读-写"到"读-写-拥有":社区所有权的范式跃迁
社区所有权是Web3区别于Web2的核心特质。它通过技术手段打破平台垄断,将数据所有权、收益分配权、治理决策权归还给社区参与者,实现互联网从"读-写"到"读-写-拥有"的范式跃迁。
1.1 价值分配:协议层收入分成打破垄断
Web2平台的核心痛点在于对创作者价值的单方面攫取——平台抽成往往高达30%-50%,创作者缺乏议价权。Web3通过协议层收入分成(Protocol-level Revenue Sharing) 重构这一关系:
社区自治的核心在于"提案-讨论-投票-执行"的完整闭环。以社区金库(Treasury)管理为例:
将社交内容(帖子、评论、作品)铸造为NFT,实现:
以下是一个完整的社区所有权社交合约实现,涵盖内容NFT化、收益自动分配、治理准入三大核心机制。
| 模块 | 功能 | 技术实现 |
|---|---|---|
| 内容层 | 帖子NFT化 | ERC721标准,URI指向去中心化存储 |
| 经济层 | 打赏分成 | 95%归作者,5%归社区金库 |
| 治理层 | 发布准入 | 需持有100枚治理代币 |
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title CommunityOwnedSocial
* @dev 社区所有权模式:内容所有权归作者,收益由作者与社区金库共享。
*/
contract CommunityOwnedSocial is ERC721, Ownable {
IERC20 public governanceToken;
uint256 private _nextTokenId;
// 社区金库比例 (5%)
uint256 public constant TREASURY_FEE_BPS = 500;
uint256 public constant CONTENT_THRESHOLD = 100 * 10**18; // 需持 100 Token 才能发帖
struct Post {
address author;
string contentUri;
uint256 totalTips;
}
mapping(uint256 => Post) public posts;
error InsufficientGovernanceToken();
error TransferFailed();
constructor(address _token) ERC721("CommunityPost", "POST") Ownable(msg.sender) {
governanceToken = IERC20(_token);
}
/**
* @dev 发布内容:只有社区成员(持币者)可以发布
*/
function publishPost(string memory _uri) external {
if (governanceToken.balanceOf(msg.sender) < CONTENT_THRESHOLD) {
revert InsufficientGovernanceToken();
}
uint256 tokenId = _nextTokenId++;
_safeMint(msg.sender, tokenId);
posts[tokenId] = Post(msg.sender, _uri, 0);
}
/**
* @dev 打赏内容:收益实时分配给作者和金库
*/
function tipPost(uint256 _tokenId) external payable {
_requireOwned(_tokenId);
Post storage post = posts[_tokenId];
uint256 treasuryShare = (msg.value * TREASURY_FEE_BPS) / 10000;
uint256 authorShare = msg.value - treasuryShare;
post.totalTips += msg.value;
// 分发给作者
(bool s1, ) = payable(post.author).call{value: authorShare}("");
// 分发给金库 (此处简单演示为发送给 Owner,实际应发给 DAO 财库)
(bool s2, ) = payable(owner()).call{value: treasuryShare}("");
if (!s1 || !s2) revert TransferFailed();
}
function getPost(uint256 _tokenId) external view returns (Post memory) {
return posts[_tokenId];
}
}
社区所有权模式社交合约测试:
| 测试维度 | 覆盖场景 | 验证目标 |
|---|---|---|
| 准入控制 | 持币用户发帖、无币用户被拒 | 治理机制有效性 |
| 收益分配 | 单次打赏、多次打赏累计 | 分账逻辑准确性 |
| 边界条件 | 零金额、无效tokenId | 合约鲁棒性 |
import assert from "node:assert/strict";
import { describe, it, beforeEach } from "node:test";
import { network } from "hardhat";
import { parseEther } from 'viem';
describe("社区所有权模式社交合约测试", function () {
let socialContract:any, tokenContract:any;
let publicClient:any, testClient:any;
let owner, member:any, stranger:any;
beforeEach(async function () {
const { viem: v } = await (network as any).connect();
publicClient = await v.getPublicClient();
testClient = await v.getTestClient();
[owner, member, stranger] = await v.getWalletClients();
// 1. 部署一个简单的 ERC20 作为治理代币 (模拟)
tokenContract = await v.deployContract("contracts/DAO.sol:MyToken", []); // 复用之前的 Token
// 2. 部署社交合约
socialContract = await v.deployContract("CommunityOwnedSocial", [tokenContract.address]);
// 3. 给 member 转账达到门槛 (100 Token)
await tokenContract.write.transfer([member.account.address, parseEther("200")]);
});
it("只有持有治理代币的成员才能发布内容", async function () {
// 成员发布
await socialContract.write.publishPost(["https://zygomorphic-magenta-bobolink.myfilebase.com/ipfs/QmbTDyUhx4gew9Z6W2YLVampcYqTWpdKsiTKVfiwr16esa"], { account: member.account });
const balance = await socialContract.read.balanceOf([member.account.address]);
assert.equal(balance, 1n, "成员应成功发布并获得内容 NFT");
// 陌生人(无币)发布应失败
await assert.rejects(
socialContract.write.publishPost(["https://zygomorphic-magenta-bobolink.myfilebase.com/ipfs/QmTL5CJsEUGGPxBi3VNYnFebGScrs8ANa5aeK98QGb5Prn"], { account: stranger.account }),
/InsufficientGovernanceToken/,
"无币用户不应允许发布"
);
});
it("内容打赏应正确分配给作者和社区金库", async function () {
await socialContract.write.publishPost(["https://zygomorphic-magenta-bobolink.myfilebase.com/ipfs/QmcN49MKt4MbSXSGckAcpvFqtea43uuPD2tvmuER1mG67s"], { account: member.account });
const tipAmount = parseEther("1");
const authorInitialBalance = await publicClient.getBalance({ address: member.account.address });
// 陌生人打赏 1 ETH
await socialContract.write.tipPost([0n], {
account: stranger.account,
value: tipAmount
});
const post = await socialContract.read.getPost([0n]);
assert.equal(post.totalTips, tipAmount, "打赏总额记录应更新");
const authorFinalBalance = await publicClient.getBalance({ address: member.account.address });
// 作者应收到约 0.95 ETH (扣除 Gas 后应明显增加)
assert.ok(authorFinalBalance > authorInitialBalance, "作者应收到打赏分成");
});
});
// scripts/deploy.js
import { network, artifacts } from "hardhat";
async function main() {
// 连接网络
const { viem } = await network.connect({ network: network.name });//指定网络进行链接
// 获取客户端
const [deployer] = await viem.getWalletClients();
const publicClient = await viem.getPublicClient();
const deployerAddress = deployer.account.address;
console.log("部署者的地址:", deployerAddress);
// 加载合约
const TokenArtifact = await artifacts.readArtifact("contracts/DAO.sol:MyToken");
const CommunityOwnedSocialArtifact = await artifacts.readArtifact("CommunityOwnedSocial");
const TokenHash = await deployer.deployContract({
abi: TokenArtifact.abi,//获取abi
bytecode: TokenArtifact.bytecode,//硬编码
args: [],
});
const TokenReceipt = await publicClient.waitForTransactionReceipt({ hash: TokenHash });
console.log("Token合约地址:", TokenReceipt.contractAddress);
// 部署
const CommunityOwnedSocialHash = await deployer.deployContract({
abi: CommunityOwnedSocialArtifact.abi,//获取abi
bytecode: CommunityOwnedSocialArtifact.bytecode,//硬编码
args: [TokenReceipt.contractAddress],
});
const CommunityOwnedSocialReceipt = await publicClient.waitForTransactionReceipt({ hash: CommunityOwnedSocialHash });
console.log("CommunityOwnedSocial合约地址:", CommunityOwnedSocialReceipt.contractAddress);
}
main().catch(console.error);
社区所有权通过协议层收益绑定、去中心化治理、NFT资产确权三大支柱,重构了Web2时代的平台-用户关系:
| 维度 | Web2模式 | Web3社区所有权 |
|---|---|---|
| 价值分配 | 平台抽成30-50%,规则不透明 | 智能合约自动分账,实时到账 |
| 治理决策 | 公司管理层独裁 | 代币持有者提案投票 |
| 数据资产 | 平台托管,无法迁移 | NFT确权,跨平台流通 |
这套模式不仅是一种技术实现,更是互联网组织形态的范式革命——从"平台垄断"走向"共建共享",让每一位贡献者真正成为社区的主人。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!