1. 资金使用的理想流程

1.1 理想流程(慈善组织)

graph LR
    subgraph 理想的善款使用流程
        A[捐赠者] -- 捐款 --> B(慈善组织)
        B -- 项目申报/预算 --> C(项目评审委员会)
        C -- 审批 --> D(资金分配)
        D -- 项目执行 --> E(受助者/项目成果)
        E -- 信息反馈 --> F(信息披露)
        F -- 公众监督/审计 --> A
    end

流程说明:

  1. 捐赠者将善款捐赠给慈善组织
  2. 慈善组织进行项目申报,并提交详细的预算方案给项目评审委员会
  3. 项目评审委员会对项目进行独立、专业的审批。
  4. 审批通过后,进行资金分配
  5. 项目执行,善款用于资助受助者或实现项目成果
  6. 项目执行过程中和完成后,进行信息反馈
  7. 信息披露给公众,接受公众监督独立审计,并将结果反馈给捐赠者。

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 或多签钱包实现去中心化决策,避免权力集中。
  • 自动化执行: 智能合约自动执行资金分配,减少人为干预,提高效率。
  • 可追溯性: 每一笔资金的流向都可以追溯,便于监管和审计。
  • 降低信任成本: 无需信任中介机构,降低信任成本,提高捐赠意愿。