金融供应链智能合约 -- 智能合约实例

这篇具有很好参考价值的文章主要介绍了金融供应链智能合约 -- 智能合约实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提

Ownable:监管者合约,有一个函数能转让监管者。

SupplyChainFin:供应链金融合约,银行、公司信息上链,公司和银行之间的转账。

发票:记录者交易双方和交易金额等的一种记录数据。如:我在超市买了一瓶水,超市给我开了一张发票。文章来源地址https://www.toymoban.com/news/detail-630246.html

Ownable

// SPDX-License-Identifier: MIT
pragma solidity >=0.4 <=0.9;

/*
*@title Ownable
*@dev 
*/
contract Ownable{
    
    address public owner; // 监管者

    event OwnershipTransferred( // 监管者转让结构体
        address indexed priviousOwner, // indexed表名可以被索引
        address indexed newOwner
    );

    constructor() {
        owner = msg.sender;
    }
    
    // 判断用户是否是监管者
    modifier onlyOwner(){
        require(msg.sender == owner,"You cannot owner!");
        _;
    }

    // 转让所有权,必须是原先监管者转让
    function transferOwnership(address newOwner) public   onlyOwner{
        require(newOwner != owner && newOwner != address(0),"newOwner cannot be empty and equal to the priviousOwner");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;

    }

    

}

SupplyChainFin

// SPDX-License-Identifier: MIT
pragma solidity >=0.4 <=0.9;
import "./Ownable.sol";

/**
*@title SuppluChainFin
*@dev
*/
contract SupplyChainFin is Ownable{

    // 监管者信息结构体
    struct Supervisor{
        string supervisorName; 
        address supervisorAddress;
    }

    // 公司信息结构体
    struct Company{
        string companyName;
        address companyAddress;
        uint creditAsset;
        uint[] acceptReceiptIndex;
        uint[] sendReceiptIndex;
    }
    // 银行信息结构体
    struct Bank{
        string bankName;
        address bankAddress;
        uint creditAsset;
        uint[] acceptReceiptIndex;
        uint[] sendReceiptIndex;
    }

    // 数字发票收据信息
     struct Receipt {
        address senderAddress; 
        address accepterAddress;
        uint8 receiptType; // 发票类型
        uint8 transferType; // 转账类型
        uint amount; // 交易额
    }

    // 公司的map ,用于快速搜索
    mapping(address => Company) companyMap;

    // 银行map
    mapping (address =>Bank) bankMap;

    // 发票的map
    mapping (uint => Receipt) receiptMap;

    //监管者实体
    Supervisor public supervisor;

    // 公司地址的数组
    address[] public companies;

    // 银行地址的数组
    address[] public banks;

    //数组发票索引
    uint public receiptIndex;

    constructor(string memory name){
        supervisor = Supervisor(name,msg.sender); // 初始化监管者信息
    }


    // 将公司信息添加到智能合约中
    function addCompany(
        string memory name,
        address companyAddress
    )public payable  returns(bool){
        // 初始化公司结构体
        // 添加到公司map
        // 添加到公司数组
        Company memory newCompany = Company(
            name,
            companyAddress,
            msg.value,
            new uint[](0),
            new uint[](0)
        );
        companyMap[companyAddress] = newCompany;
        companies.push(companyAddress);
        return true;
    }

    // 获取公司信息
    function getCompany(
        address companyAddress
    ) public view  returns(string memory,address,uint,uint[] memory,uint[] memory){

        // 用地址拿出公司结构体
        // 将需要的数据一起返回
        Company memory company = companyMap[companyAddress];
        return (
            company.companyName,
            company.companyAddress,
            company.creditAsset,
            company.acceptReceiptIndex,
            company.sendReceiptIndex
        );
    }

    // 添加银行信息上链
    function addBank(
        string memory bankName,
        address bankAddress
    ) public payable  returns(bool){
        Bank memory newBank;
        newBank.bankName = bankName;
        newBank.bankAddress = bankAddress;
        newBank.creditAsset = msg.value;
        bankMap[bankAddress] = newBank;
        banks.push(bankAddress);
        return true;
    }


    // 获取银行信息
    function getBank(
        address bankAddress
    ) public view  returns(string memory,address,uint,uint[] memory,uint[] memory){
        Bank memory bank = bankMap[bankAddress];
        return (
            bank.bankName,
            bank.bankAddress,
            bank.creditAsset,
            bank.acceptReceiptIndex,
            bank.sendReceiptIndex
        );
    }

    // 获取公司全部地址
    function getAllCompanyAddress() public view returns(address[] memory){
        return companies;
    }

    // 获取银行全部地址
    function getAllBankAddress() public view returns(address[] memory){
        return banks;
    }

    // 获取凭证
    function getRecipt(
        uint index
    )public view returns(address,address,uint8,uint8,uint){
        Receipt memory receipt = receiptMap[index];
        return (
            receipt.senderAddress,
            receipt.accepterAddress,
            receipt.receiptType,
            receipt.transferType,
            receipt.amount
        );
    }

    //存证交易
    // receiptType: 发票类型(存证、现金)
    //1: 交易类型为存证
    //2:交易类型为现金
    // transferType: 交易类型
    //1: 银行转账给公司
    //2: 公司与公司间转账
    //3: 公司转账给银行

    // 银行向公司交易(公司颁布凭证):
    function bankToCompanyReceipt(
        address senderAddress, // 凭证发送方
        address accepterAddress, // 凭证接受方
        uint amount, // 交易额
        uint8 receiptType // 凭证类型
    ) public returns(uint){
        // 银行转账给公司,银行是发票接受者,只有银行同意要发票,这笔交易才能执行
        require(msg.sender == accepterAddress,"The function caller must be accper");
        // 拿出银行、公司结构体
        Company memory company = companyMap[senderAddress];
        Bank memory bank = bankMap[accepterAddress];
        // 判断公司银行是否存在
        if(keccak256(bytes(bank.bankName)) == keccak256(bytes(""))){
            return 404001;
        }

        if(keccak256(bytes(company.companyName)) == keccak256(bytes(""))){
            return 404002;
        }
        
        // 判断银行资产是否小于转账额
        if(bank.creditAsset < amount){
            return 500001;
        }

        // 初始化凭证
        Receipt memory newReceipt = Receipt(
            senderAddress,
            accepterAddress,
            receiptType,
            1,
            amount
        );
        // 发票索引 + 1
        receiptIndex += 1;
        // 根据转账额,相互的 +-
        companyMap[accepterAddress].creditAsset += amount;
        bankMap[senderAddress].creditAsset -= amount;
        // 存凭证索引,这样我们拿到公司或银行信息,拿到发票索引,在拿到发票结构体
        receiptMap[receiptIndex] = newReceipt;
        companyMap[accepterAddress].sendReceiptIndex.push(receiptIndex);
        bankMap[senderAddress].acceptReceiptIndex.push(receiptIndex);
        return 200;
    }

    //公司向公司交易(接受钱的公司需要颁布凭证)

    function companyToCompanyReceipt(
        address senderAddress,
        address accepterAddress,
        uint amount,
        uint8 receiptType
    ) public  returns(uint){
        require(msg.sender == accepterAddress);

        Company memory senderCompany = companyMap[senderAddress];
        Company memory accepterCompany = companyMap[accepterAddress];

        if (keccak256(bytes(senderCompany.companyName)) == keccak256(bytes(""))) {
            return 404001;
        }

        //确认接收公司存在
        if (keccak256(bytes(accepterCompany.companyName)) == keccak256(bytes(""))) {
            return 404002;
        }

        //如果存证接收的公司资产小于存证数额,那么就不能交易发送存证
        if (accepterCompany.creditAsset < amount) {
            return 500001;
        }

        //创建存证
        Receipt memory newReceipt = Receipt(
            senderAddress,
            accepterAddress,
            receiptType,
            2,
            amount
        );
        receiptIndex += 1;
        //记录存证(存证Map,公司Map对应地址的发送和接收存证列表)
        receiptMap[receiptIndex] = newReceipt;
        companyMap[senderAddress].sendReceiptIndex.push(receiptIndex);
        companyMap[accepterAddress].acceptReceiptIndex.push(receiptIndex);

        companyMap[senderAddress].creditAsset += amount;
        companyMap[accepterAddress].creditAsset -= amount;
        return 200;

    }
    
    //公司与银行交易(银行颁布凭证)
    function companyToBankReceipt(
        address senderAddress,
        address accepterAddress,
        uint amount,
        uint8 receiptType
    ) public  returns (uint) {
     
        require(msg.sender == accepterAddress);

        Bank memory bank = bankMap[senderAddress];
        Company memory accepterCompany = companyMap[accepterAddress];

        //确认发送公司存在
        if (keccak256(bytes(bank.bankName)) == keccak256(bytes(""))) {
            return 404001;
        }

        //确认接收公司存在
        if (keccak256(bytes(accepterCompany.companyName)) == keccak256(bytes(""))) {
            return 404002;
        }   

        //如果存证接收的公司资产小于存证数额,那么就不能交易发送存证
        if (accepterCompany.creditAsset < amount) {
            return 500001;
        }

        //创建存证
        Receipt memory newReceipt = Receipt(
            senderAddress,
            accepterAddress,
            receiptType,
            3,
            amount
        );
        receiptIndex += 1;
        //记录存证(存证Map,公司Map对应地址的发送和接收存证列表)
        receiptMap[receiptIndex] = newReceipt;
        bankMap[senderAddress].sendReceiptIndex.push(receiptIndex);
        companyMap[accepterAddress].acceptReceiptIndex.push(receiptIndex);

        bankMap[senderAddress].creditAsset += amount;
        companyMap[accepterAddress].creditAsset -= amount;
        return 200;
    }







}

到了这里,关于金融供应链智能合约 -- 智能合约实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于区块链技术的供应链金融平台

    目录 一、项目背景 1 1.1 供应链+金融场景 1 1.2 功能需求分析 2 二、方案设计 2 2.1 存储设计 2 我们使用一个列表来保存所有的债权凭证 3 2.2 基本功能 3 企业注册(该方法仅限部署该合约的认证机构调用) 4 2.3 核心功能 9 2.4 前端实现 13 2.5后端实现 16 实现智能合约方法调用接口

    2023年04月10日
    浏览(30)
  • 基于Java实现的区块链供应链金融系统平台设计

    中小微企业融资难、融资贵是长久以来我国金融发展过程中需要解决的问题。世界银行、中小企业金融论坛、国际金融公司联合发布的《中小微企业融资缺口:对新兴市场微型、小型和中型企业融资不足与机遇的评估》报告中表示,中国 40%的中小微企业存在信贷困难,或是完

    2024年01月17日
    浏览(33)
  • 区块链与供应链数据分析:实现高效的供应链管理

    区块链技术的诞生与发展,为数字经济带来了深远的影响。在传统的中心化系统中,数据的传输和处理受到了中心化节点的限制,而区块链技术为数字经济带来了去中心化的特点,使得数据的处理和传输更加高效、安全和透明。在供应链管理领域,区块链技术的应用具有巨大

    2024年04月09日
    浏览(85)
  • 基于区块链技术改进供应链管理

    目录 一、简介 二、编写智能合约 三、部署智能合约 四、开发后端服务器 五、创建前端界面 六、集成物联网设备(可选) 在本文中,我们将探讨如何利用区块链技术改进供应链管理。我们将通过一个简化的示例项目,展示如何构建一个基于以太坊的供应链管理系统。我们将

    2023年04月21日
    浏览(41)
  • 区块链溯源技术:如何保护物流供应链?

    作者:禅与计算机程序设计艺术 随着数字货币、区块链技术的普及,越来越多的人认为区块链可以提供可信任的数据来源,促进各种金融服务的发展,然而实际上,区块链数据溯源技术存在一些问题,尤其是在物流领域。以下将对此进行分析。 物流信息的安全和完整性是物

    2024年02月11日
    浏览(29)
  • 供应链与区块链:差异揭秘与融合前景

    《供应链与区块链:差异揭秘与融合前景》 1. 供应链是一种由多个实体组成的网络,这些实体在生产、分销最终产品的过程中相互关联。它涵盖了从原材料采购到最终产品交付给消费者的所有活动。供应链管理的目标是通过优化信息流、物流和资金流,提高效率、降低成本。

    2024年04月13日
    浏览(28)
  • 基于区块链技术的智慧供应链创新应用

    随着区块链技术的不断成熟,智慧供应链得到了长足的发展,通过基于华为云的几个智慧供应链和物流行业的应用创新项目,诠释在实际应用场景中如何通过区块链和物流面临的调整和困难,达到优化流程、提高效率、降低成本的效果。 随着区块链技术的不断成熟,智慧供应

    2024年02月12日
    浏览(37)
  • 区块链溯源技术:实现供应链管理可视化、可追踪

    作者:禅与计算机程序设计艺术 随着信息技术的飞速发展,区块链技术逐渐成为了供应链管理领域的一匹黑马。区块链技术以其去中心化、不可篡改、可追溯、可验证等特点,给供应链管理带来了全新的解决方案。本文将介绍一种基于区块链技术的溯源技术,该技术可以实现

    2024年02月15日
    浏览(28)
  • 区块链溯源:实现更高效的供应链管理,减少信任成本

    作者:禅与计算机程序设计艺术 在当下社会,各种信息爆炸性增长带来了众多问题,例如信息不对称、信息质量低下等,这些都是由于人们对信息获取不足,缺乏知识共享导致的。 通过数字经济赋予个人的信息处理能力,越来越多的人能够从各种渠道获取到有价值的信息,

    2024年02月14日
    浏览(37)
  • 服装制作企业如何构建智能供应链体系

    “大规模定制”满足柔性化出产需要是智能制作极端显着的特征,决定用户出产什么、出产多少。 客户高度的个性化需求,产品立异周期的继续缩短,服装出产节拍不断加速。 这些是服装企业有必要迎接的课题。 因而,服装出产制作企业的高度柔性出产依据市场和顾客个性

    2023年04月08日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包