当前位置: 首页 > news >正文

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

前提

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

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

发票:记录者交易双方和交易金额等的一种记录数据。如:我在超市买了一瓶水,超市给我开了一张发票。

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;// 银行mapmapping (address =>Bank) bankMap;// 发票的mapmapping (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);// 发票索引 + 1receiptIndex += 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;}}

相关文章:

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

前提 Ownable:监管者合约,有一个函数能转让监管者。 SupplyChainFin:供应链金融合约,银行、公司信息上链&#xff0c;公司和银行之间的转账。 发票&#xff1a;记录者交易双方和交易金额等的一种记录数据。如:我在超市买了一瓶水,超市给我开了一张发票。 Ownable // SPDX-…...

论文《Contrastive Meta Learning with Behavior Multiplicity for Recommendation》阅读

论文《Contrastive Meta Learning with Behavior Multiplicity for Recommendation》阅读 论文概况论文主要贡献Background & Motivation方法论单行为图神经网络&#xff08;Behavior-aware GNN&#xff09;多行为对比学习元对比编码模型训练 实验部分论文总结 论文概况 今…...

K8S 部署 RocketMQ

文章目录 添加模板部署本地访问 集群使用 kubesphere 作为工具 添加模板 添加 helm 模板 helm repo add rocketmq-repo https://helm-charts.itboon.top/rocketmq helm repo update rocketmq-repo编写 value.yaml 文件 配置主从节点的个数&#xff0c;例子为单节点 broker:…...

[Docker]入门之docker-compose

一&#xff0c;Docker-compose简介 1&#xff0c;Docker-compose简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c…...

SAP ABAP中使用函数ALSM_EXCEL_TO_INTERNAL_TABLE读取EXCEL中不同的SHEET数据

SAP提供了标准的读取EXCEL的函数&#xff08;ALSM_EXCEL_TO_INTERNAL_TABLE&#xff09;&#xff0c;但是此标准函数无法满足对同一EXCEL 进行不同SHEET的数据读取&#xff0c;一下方法就是教你如何通过修改程序来实现ALSM_EXCEL_TO_INTERNAL_TABLE读取多个SHEET&#xff1b; …...

Rust 编程小技巧摘选(6)

目录 Rust 编程小技巧(6) 1. 打印字符串 2. 重复打印字串 3. 自定义函数 4. 遍历动态数组 5. 遍历二维数组 6. 同时遍历索引和值 7. 迭代器方法的区别 8. for_each() 用法 9. 分离奇数和偶数 10. 判断素数&#xff08;质数&#xff09; Rust 编程小技巧(6) 1. 打印…...

如何保证Redis缓存和数据库的一致性问题

熟练掌握Redis缓存技术&#xff1f; 那么请问Redis缓存中有几种读写策略&#xff0c;又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 Cache Aside Pattern Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式&#xff0c;比较适合读请求比…...

【数据分析入门】人工智能、数据分析和深度学习是什么关系?如何快速入门 Python Pandas?

目录 一、前言二、数据分析和深度学习的区别三、人工智能四、深度学习五、Pandas六、Pandas数据结构6.1 Series - 序列6.2 DataFrame - 数据框 七、输入、输出7.1 读取/写入CSV7.2 读取/写入Excel7.3 读取和写入 SQL 查询及数据库表 八、调用帮助九、选择(这里可以参考上一篇文…...

JavaScript 里三个点 ... 的用法

// table表头数据let tableHeadData deepClone(data);let tableCacheData [];//表格缓存对比if (!parent && isCacheHeadData) {// 缓存数据keylet tableCacheKey ${window.location.pathname}-${$self.attr(id)}if (localStorage.getItem(tableCacheKey)) {//根据缓…...

Linux修改系统语言

sudo dpkg-reconfigure locales 按pagedown键&#xff0c;移动红色光标到 zh_CN.UTF-8 UTF-8&#xff0c;空格标记*号&#xff08;没标记下一页没有这一项&#xff09;&#xff0c;回车。 下一页选择 zh_CN.UTF-8。 如果找不到 dpkg-reconfigure whereis dpkg-reconfigure …...

Spring注解开发

目录 1、简介 2、原始注解 2.1、注解种类 2.2、组件扫描 2.3、具体使用 2.3.1、xml配置 2.3.2、注解配置 3、⭐新注解 3.1、新注解种类 3.2、实践 3.3、运行结果 3.4、警告信息 1、简介 Spring框架提供了许多注解&#xff0c;用于在Java类中进行配置和标记&#xf…...

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换

文章目录 1. Opencv2. Matplotlib3. PIL4. 三者的区别和相互转换5. Torchvision 中的相关转换库5.1 ToPILImage([mode])5.2 ToTensor5.3 PILToTensor 1. Opencv opencv的基本图像类型可以和numpy数组相互转化&#xff0c;因此可以直接调用torch.from_numpy(img) 将图像转换成t…...

html+Vue+封装axios实现发送请求

在html中使用Vue和Axios时&#xff0c;可以在HTML中引入Vue库和Axios库&#xff0c;然后使用Vue的语法和指令来创建Vue组件和模板。在Vue组件中&#xff0c;你可以使用Axios发送HTTP请求来获取数据&#xff0c;并将数据绑定到Vue模板中进行展示。 <template><div>&…...

GoogLeNet卷积神经网络输出数据形参分析-笔记

GoogLeNet卷积神经网络输出数据形参分析-笔记 分析结果为&#xff1a; 输入数据形状:[10, 3, 224, 224] 最后输出结果&#xff1a;linear_0 [10, 1] [1024, 1] [1] 子空间执行逻辑 def forward_old(self, x):# 支路1只包含一个1x1卷积p1 F.relu(self.p1_1(x))# 支路2包含 1…...

【docker】dockerfile发布springboot项目

目录 一、实现步骤二、示例 一、实现步骤 1.定义父镜像&#xff1a;FROM java:8 2.定义作者信息&#xff1a;MAINTAINER&#xff1a;learn_docker<https://www.docker.com> 3.将jar包添加到容器&#xff1a;ADD jar包名称.jar app.jar 4.定义容器启动执行命令&#xff1a…...

利用docker run -v 命令实现使用宿主机中没有的命令

利用docker run -v 命令实现使用宿主机中没有的命令 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 docker run -it --name java -v /www/temp/java…...

【小沐学NLP】在线AI绘画网站(百度:文心一格)

文章目录 1、简介2、文心一格2.1 功能简介2.2 操作步骤2.3 使用费用2.4 若干示例2.4.1 女孩2.4.2 昙花2.4.3 山水画2.4.4 夜晚2.4.5 古诗2.4.6 二次元2.4.7 帅哥 结语 1、简介 当下&#xff0c;越来越多AI领域前沿技术争相落地&#xff0c;逐步释放出极大的产业价值&#xff0…...

react经验5:访问子组件内容

应用场景 父级需要调用子组件的某函数 实现步骤 案例&#xff1a;创建自定义按钮 button.tsx import { Ref, forwardRef, useImperativeHandle,ReactNode} from "react" declare type ButtonProps {/**按钮文字 */children?: ReactNode,onClick?: () > voi…...

【LeetCode】647. 回文子串

题目链接 文章目录 1. 思路讲解1.1 方法选择1.2 dp表的创建1.3 状态转移方程1.4 填表顺序 2. 代码实现 1. 思路讲解 1.1 方法选择 这道题我们采用动态规划的解法&#xff0c;倒不是动态规划的解法对于这道题有多好&#xff0c;它并不是最优解。但是&#xff0c;这道题的动态…...

Open3D(C++) 角度制与弧度制的相互转换

目录 一、弧度转角度1、计算公式2、主要函数3、示例代码4、结果展示二、角度转弧度1、计算公式2、主要函数3、示例代码4、结果展示三、归一化到(-PI,PI)1、主要函数<...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...