1. 资金使用的理想流程
1.1 理想流程(慈善组织)
graph LR
subgraph 理想的善款使用流程
A[捐赠者] -- 捐款 --> B(慈善组织)
B -- 项目申报/预算 --> C(项目评审委员会)
C -- 审批 --> D(资金分配)
D -- 项目执行 --> E(受助者/项目成果)
E -- 信息反馈 --> F(信息披露)
F -- 公众监督/审计 --> A
end
流程说明:
- 捐赠者将善款捐赠给慈善组织。
- 慈善组织进行项目申报,并提交详细的预算方案给项目评审委员会。
- 项目评审委员会对项目进行独立、专业的审批。
- 审批通过后,进行资金分配。
- 项目执行,善款用于资助受助者或实现项目成果。
- 项目执行过程中和完成后,进行信息反馈。
- 信息披露给公众,接受公众监督和独立审计,并将结果反馈给捐赠者。
1.2 问题
然而,在现实中,这个理想流程往往面临诸多问题:
- 信息不对称: 捐赠者难以了解善款的真实去向和使用效果。
- 寻租空间: 项目申报、审批、资金分配等环节可能存在寻租空间。
- 监管困难: 资金流向复杂,监管部门难以有效追踪和监管。
- 效率低下: 传统的审批和拨付流程可能冗长、低效。
- 信任缺失: 公众对慈善组织的不信任感可能导致捐赠意愿下降。
2. 基于区块链和智能合约的解决方案
为了解决上述挑战,我们可以设计一个基于区块链和智能合约的全新体系,以实现善款使用的公开、透明、可追溯、高效和可信。
2.1 系统架构
graph LR
subgraph 基于区块链的善款使用系统
A[捐赠者] -- 捐款 --> B(智能合约)
B -- 项目申报 --> C(DAO/多签钱包)
C -- 投票/审批 --> D(资金分配)
D -- 项目执行 --> E(受助者/项目成果)
E -- 信息反馈 --> F(链上数据)
F -- 公众监督/审计 --> A
end
subgraph 区块链
B
C
F
end
架构说明:
- 捐赠者: 通过智能合约直接向慈善项目捐款。
- 智能合约: 接收捐款,记录捐款信息,根据预设规则自动执行资金分配。
- DAO(去中心化自治组织)/ 多签钱包:
- DAO: 由捐赠者、项目方、专家、监管方等组成的去中心化自治组织,通过投票的方式对项目进行审批和资金分配决策。
- 多签钱包: 需要多个授权才能动用资金的钱包,可以由慈善组织、监管机构、审计机构等多方共同管理。
- 资金分配: 根据 DAO 的投票结果或多签钱包的授权,智能合约自动将资金分配给项目方。
- 项目执行: 项目方按照项目计划使用资金。
- 受助者/项目成果: 项目执行的结果。
- 链上数据: 所有捐款记录、项目信息、资金流向、审批记录等都记录在区块链上,公开透明,不可篡改。
- 公众监督/审计: 任何人都可以查看链上数据,进行监督和审计。
2.2 智能合约设计
pragma solidity ^0.8.0;
// 定义一个Token合约
interface IERC20 {
function transfer(address recipient, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract TransparentCharity {
struct Project {
string name;
string description;
uint targetAmount;
uint raisedAmount;
address payable beneficiary; // 项目受益人地址
bool approved;
bool completed;
}
mapping(uint => Project) public projects;
uint public projectCounter;
IERC20 public donationToken; // 使用ERC20 代币
event ProjectCreated(uint indexed projectId, string name);
event ProjectApproved(uint indexed projectId);
event DonationReceived(address indexed donor, uint indexed projectId, uint amount);
event FundsDisbursed(uint indexed projectId, address indexed beneficiary, uint amount);
// DAO 地址或多签钱包地址
address public daoOrMultisig;
constructor(address _donationToken, address _daoOrMultisig) {
donationToken = IERC20(_donationToken);
daoOrMultisig = _daoOrMultisig;
projectCounter = 0;
}
// 创建项目
function createProject(string memory _name, string memory _description, uint _targetAmount, address payable _beneficiary) public {
projectCounter++;
projects[projectCounter] = Project(_name, _description, _targetAmount, 0, _beneficiary, false, false);
emit ProjectCreated(projectCounter, _name);
}
// 项目审批 (由DAO或多签钱包调用)
function approveProject(uint _projectId) public {
require(msg.sender == daoOrMultisig, "Only DAO or Multisig can approve projects.");
projects[_projectId].approved = true;
emit ProjectApproved(_projectId);
}
// 捐款
function donate(uint _projectId, uint _amount) public {
require(projects[_projectId].approved, "Project is not approved.");
require(!projects[_projectId].completed, "Project is completed.");
// 从捐赠者转移代币到合约
require(donationToken.transferFrom(msg.sender, address(this), _amount), "Transfer failed.");
projects[_projectId].raisedAmount += _amount;
emit DonationReceived(msg.sender, _projectId, _amount);
// (可选) 达到目标金额后自动标记项目完成
if (projects[_projectId].raisedAmount >= projects[_projectId].targetAmount) {
projects[_projectId].completed = true;
}
}
// 资金拨付 (由DAO或多签钱包调用)
function disburseFunds(uint _projectId) public {
require(msg.sender == daoOrMultisig, "Only DAO or Multisig can disburse funds.");
require(projects[_projectId].completed, "Project is not completed.");
require(projects[_projectId].raisedAmount > 0, "No funds to disburse.");
uint amountToDisburse = projects[_projectId].raisedAmount;
projects[_projectId].raisedAmount = 0;
// 从合约转移代币到受益人
require(donationToken.transfer(projects[_projectId].beneficiary, amountToDisburse), "Transfer failed.");
emit FundsDisbursed(_projectId, projects[_projectId].beneficiary, amountToDisburse);
}
// 获取项目信息
function getProjectInfo(uint _projectId) public view returns (string memory, string memory, uint, uint, address, bool, bool) {
Project storage p = projects[_projectId];
return (p.name, p.description, p.targetAmount, p.raisedAmount, p.beneficiary, p.approved, p.completed);
}
//获取合约的token余额
function getBalance() public view returns (uint) {
return donationToken.balanceOf(address(this));
}
// ... 其他函数 ...
}
合约说明:
IERC20接口: 定义了Token的基本操作,例如转账。Project结构体: 记录项目信息,包括项目名称、描述、目标金额、已筹集金额、受益人地址、审批状态、完成状态等。projects映射: 存储所有项目信息。projectCounter: 项目计数器。donationToken: 代币合约地址.daoOrMultisig: DAO 地址或多签钱包地址。- 事件:
ProjectCreated: 项目创建时触发。ProjectApproved: 项目审批通过时触发。DonationReceived: 收到捐款时触发。FundsDisbursed: 资金拨付给受益人时触发。
- 函数:
createProject: 创建慈善项目。approveProject: 审批项目(由 DAO 或多签钱包调用)。donate: 处理用户捐款,使用transferFrom函数 从用户的钱包转移Token。disburseFunds: 将资金拨付给受益人(由 DAO 或多签钱包调用)。getProjectInfo: 获取项目信息。getBalance: 获取合约的token余额
2.3 优势
相比传统模式,这个基于区块链和智能合约的体系具有以下优势:
- 高度透明: 所有信息上链,公开透明,任何人都可以查看和验证。
- 不可篡改: 区块链数据不可篡改,有效防止腐败和暗箱操作。
- 去中心化决策: 通过 DAO 或多签钱包实现去中心化决策,避免权力集中。
- 自动化执行: 智能合约自动执行资金分配,减少人为干预,提高效率。
- 可追溯性: 每一笔资金的流向都可以追溯,便于监管和审计。
- 降低信任成本: 无需信任中介机构,降低信任成本,提高捐赠意愿。