基于Java实现的区块链供应链金融系统平台设计

这篇具有很好参考价值的文章主要介绍了基于Java实现的区块链供应链金融系统平台设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 项目背景

中小微企业融资难、融资贵是长久以来我国金融发展过程中需要解决的问题。世界银行、中小企业金融论坛、国际金融公司联合发布的《中小微企业融资缺口:对新兴市场微型、小型和中型企业融资不足与机遇的评估》报告中表示,中国 40%的中小微企业存在信贷困难,或是完全无法从正规金融体系获得外部融资,或是从正规金融体系获得的外部融资不能完全满足融资需求,有 1.9 万亿美元的融资缺口,接近 12 万亿元人民币。

比如以下场景。某知名车企(宝马)消费口碑好,金融机构对其信用评级很高,认为其有很大的风险承担能力。某次交易中,该车企从轮胎公司购买了一批轮胎,但由于资金暂时短缺向轮胎公司签订了1000 万的应收账款单据,承诺一年后归还。由于轮胎公司有宝马的账款单据,金融机构认为其有额能力还款,于是愿意借款给轮胎公司,然而,这种信任关系并不会向下游传递。比如,轮胎公司因资金短缺,向轮毂公司签订了 500 万的应收账款单据,但是当轮毂公司需要贷款时,金融机构因不认可轮胎公司的还款能力,需要对轮胎公司进行详细的信用分析,而这会增加很多的经济成本。很多时候,就是这个原因导致了小微企业的融资失败。

但是,区块链金融可以有效地解决上述问题。将供应链上的每一笔交易和应收账款单据上链,同时引入第三方可信机构来确认这些信息的交易,例如银行,物流公司等,确保交易和单据的真实性。同 时,支持应收账款的转让,融资,清算等,让核心企业的信用可以传递到供应链的下游企业,减小中小企业的融资难度。

二、 方案设计

将供应链上的每一笔交易和应收账款单据上链,同时引入第三方可信机构来确认这些信息的交易, 例如银行,物流公司等,确保交易和单据的真实性。同时,支持应收账款的转让,融资,清算等,让核心企业的信用可以传递到供应链的下游企业,减小中小企业的融资难度。

【存储设计】

将企业的收款单据存储在通过 FISCO BCOS 部署的四节点联盟链上。由于我们要解决的问题是供应链上下游的信息不对等而导致的融资难问题,我们只关注企业间的欠款信息,而忽略企业的余额,这也是本项目的设计思路。

当两个企业签订了应收账款单据,将它们的公司信息、应收数目上链,在必要时,企业间的应收账款可以转移到第三方,比如上例轮毂公司可以拿到宝马的 500 万欠款证明。

【核心功能介绍】

本项目主要实现以下四个功能:

功能一:实现采购商品—签发应收账款交易上链。例如车企从轮胎公司购买一批轮胎并签订应收账款单据。

功能二:实现应收账款的转让上链,轮胎公司从轮毂公司购买一笔轮毂,便将于车企的应收账款单据部分转让给轮毂公司。轮毂公司可以利用这个新的单据去融资或者要求车企到期时归还钱款。

功能三:利用应收账款向银行融资上链,供应链上所有可以利用应收账款单据向银行申请融资。

功能四:应收账款支付结算上链,应收账款单据到期时核心企业向下游企业支付相应的欠款。

核心功能主要体现在部署在区块链上的智能合约。智能合约代码如下:

package org.fisco.bcos.asset.client;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.List;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.fisco.bcos.asset.contract.Asset;
import org.fisco.bcos.asset.contract.Asset.RegisterEventEventResponse;
import org.fisco.bcos.asset.contract.Asset.TransferEventEventResponse;
import org.fisco.bcos.channel.client.Service;
import org.fisco.bcos.web3j.crypto.Credentials;
import org.fisco.bcos.web3j.crypto.Keys;
import org.fisco.bcos.web3j.protocol.Web3j;
import org.fisco.bcos.web3j.protocol.channel.ChannelEthereumService;
import org.fisco.bcos.web3j.protocol.core.methods.response.TransactionReceipt;
import org.fisco.bcos.web3j.tuples.generated.Tuple2;
import org.fisco.bcos.web3j.tx.gas.StaticGasProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class AssetClient {

	static Logger logger = LoggerFactory.getLogger(AssetClient.class);

	private Web3j web3j;

	private Credentials credentials;

	public Web3j getWeb3j() {
		return web3j;
	}

	public void setWeb3j(Web3j web3j) {
		this.web3j = web3j;
	}

	public Credentials getCredentials() {
		return credentials;
	}

	public void setCredentials(Credentials credentials) {
		this.credentials = credentials;
	}

	public void recordAssetAddr(String address) throws FileNotFoundException, IOException {
		Properties prop = new Properties();
		prop.setProperty("address", address);
		final Resource contractResource = new ClassPathResource("contract.properties");
		FileOutputStream fileOutputStream = new FileOutputStream(contractResource.getFile());
		prop.store(fileOutputStream, "contract address");
	}

	public String loadAssetAddr() throws Exception {
		// load Asset contact address from contract.properties
		Properties prop = new Properties();
		final Resource contractResource = new ClassPathResource("contract.properties");
		prop.load(contractResource.getInputStream());

		String contractAddress = prop.getProperty("address");
		if (contractAddress == null || contractAddress.trim().equals("")) {
			throw new Exception(" load Asset contract address failed, please deploy it first. ");
		}
		logger.info(" load Asset address from contract.properties, address is {}", contractAddress);
		return contractAddress;
	}

	public void initialize() throws Exception {

		// init the Service
		@SuppressWarnings("resource")
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		Service service = context.getBean(Service.class);
		service.run();

		ChannelEthereumService channelEthereumService = new ChannelEthereumService();
		channelEthereumService.setChannelService(service);
		Web3j web3j = Web3j.build(channelEthereumService, 1);

		// init Credentials
		Credentials credentials = Credentials.create(Keys.createEcKeyPair());

		setCredentials(credentials);
		setWeb3j(web3j);

		logger.debug(" web3j is " + web3j + " ,credentials is " + credentials);
	}

	private static BigInteger gasPrice = new BigInteger("30000000");
	private static BigInteger gasLimit = new BigInteger("30000000");

	public void deployAssetAndRecordAddr() {

		try {
			Asset asset = Asset.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send();
			System.out.println(" deploy Asset success, contract address is " + asset.getContractAddress());

			recordAssetAddr(asset.getContractAddress());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			System.out.println(" deploy Asset contract failed, error message is  " + e.getMessage());
		}
	}

	public void queryAssetAmount(String assetAccount) {
		try {
			String contractAddress = loadAssetAddr();

			Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
			Tuple2<BigInteger, BigInteger> result = asset.select(assetAccount).send();
			if (result.getValue1().compareTo(new BigInteger("0")) == 0) {
				System.out.printf(" asset account %s, value %s \n", assetAccount, result.getValue2());
			} else {
				System.out.printf(" %s asset account is not exist \n", assetAccount);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			logger.error(" queryAssetAmount exception, error message is {}", e.getMessage());

			System.out.printf(" query asset account failed, error message is %s\n", e.getMessage());
		}
	}

	public void registerAssetAccount(String assetAccount, BigInteger amount) {
		try {
			String contractAddress = loadAssetAddr();

			Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
			TransactionReceipt receipt = asset.register(assetAccount, amount).send();
			List<RegisterEventEventResponse> response = asset.getRegisterEventEvents(receipt);
			if (!response.isEmpty()) {
				if (response.get(0).ret.compareTo(new BigInteger("0")) == 0) {
					System.out.printf(" register asset account success => asset: %s, value: %s \n", assetAccount,
							amount);
				} else {
					System.out.printf(" register asset account failed, ret code is %s \n",
							response.get(0).ret.toString());
				}
			} else {
				System.out.println(" event log not found, maybe transaction not exec. ");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();

			logger.error(" registerAssetAccount exception, error message is {}", e.getMessage());
			System.out.printf(" register asset account failed, error message is %s\n", e.getMessage());
		}
	}

	public void transferAsset(String fromAssetAccount, String toAssetAccount, BigInteger amount) {
		try {
			String contractAddress = loadAssetAddr();
			Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
			TransactionReceipt receipt = asset.transfer(fromAssetAccount, toAssetAccount, amount).send();
			List<TransferEventEventResponse> response = asset.getTransferEventEvents(receipt);
			if (!response.isEmpty()) {
				if (response.get(0).ret.compareTo(new BigInteger("0")) == 0) {
					System.out.printf(" transfer success => from_asset: %s, to_asset: %s, amount: %s \n",
							fromAssetAccount, toAssetAccount, amount);
				} else {
					System.out.printf(" transfer asset account failed, ret code is %s \n",
							response.get(0).ret.toString());
				}
			} else {
				System.out.println(" event log not found, maybe transaction not exec. ");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();

			logger.error(" registerAssetAccount exception, error message is {}", e.getMessage());
			System.out.printf(" register asset account failed, error message is %s\n", e.getMessage());
		}
	}

	public static void Usage() {
		System.out.println(" Usage:");
		System.out.println("\t java -cp conf/:lib/*:apps/* org.fisco.bcos.asset.client.AssetClient deploy");
		System.out.println("\t java -cp conf/:lib/*:apps/* org.fisco.bcos.asset.client.AssetClient query account");
		System.out.println(
				"\t java -cp conf/:lib/*:apps/* org.fisco.bcos.asset.client.AssetClient register account value");
		System.out.println(
				"\t java -cp conf/:lib/*:apps/* org.fisco.bcos.asset.client.AssetClient transfer from_account to_account amount");
		System.exit(0);
	}

	public static void main(String[] args) throws Exception {

		if (args.length < 1) {
			Usage();
		}

		AssetClient client = new AssetClient();
		client.initialize();

		switch (args[0]) {
		case "deploy":
			client.deployAssetAndRecordAddr();
			break;
		case "query":
			if (args.length < 2) {
				Usage();
			}
			client.queryAssetAmount(args[1]);
			break;
		case "register":
			if (args.length < 3) {
				Usage();
			}
			client.registerAssetAccount(args[1], new BigInteger(args[2]));
			break;
		case "transfer":
			if (args.length < 4) {
				Usage();
			}
			client.transferAsset(args[1], args[2], new BigInteger(args[3]));
			break;
		default: {
			Usage();
		}
		}

		System.exit(0);
	}
}

三、 功能测试

首先在WeBase 平台上测试智能合约。

首先,根据不同公司创建用户,一共有:银行(Bank)、汽车厂(CarCompany)、轮胎厂

(TyreCompany)、轮毂厂(HubCompany):

设计区块链系统,java,区块链,金融,金融供应链,源码

对编写好的合约进行编译、部署:

设计区块链系统,java,区块链,金融,金融供应链,源码

功能一:实现采购商品—签发应收账款交易上链。

设计区块链系统,java,区块链,金融,金融供应链,源码

(说明:车企欠轮胎厂 1000 万元) 部署成功会显示相关信息。

设计区块链系统,java,区块链,金融,金融供应链,源码

(说明:轮胎厂欠轮毂厂 500 万元) 查看链上的交易信息:

设计区块链系统,java,区块链,金融,金融供应链,源码

设计区块链系统,java,区块链,金融,金融供应链,源码

说明交易信息成功上链。功能一完成。

功能二:实现应收账款的转让上链。

设计区块链系统,java,区块链,金融,金融供应链,源码

(说明:车企欠轮胎厂的部分金额,转嫁到轮毂厂)

再次查看链上的交易信息:

设计区块链系统,java,区块链,金融,金融供应链,源码

现在车企欠轮胎厂和轮毂厂各 500 万元,说明功能二实现。

功能三:利用应收账款向银行融资上链。

设计区块链系统,java,区块链,金融,金融供应链,源码

(获取轮毂厂的总债务)

设计区块链系统,java,区块链,金融,金融供应链,源码

轮毂厂向银行借贷:

设计区块链系统,java,区块链,金融,金融供应链,源码

说明功能三实现。

功能四:应收账款支付结算上链。

设计区块链系统,java,区块链,金融,金融供应链,源码

(车企还轮胎厂 200 万元)

设计区块链系统,java,区块链,金融,金融供应链,源码

(车企还欠轮胎厂 300 万元)

车企再还 300 万元给轮胎厂,则抹去链上该条交易信息。以上是智能合约的测试结果。文章来源地址https://www.toymoban.com/news/detail-799277.html

到了这里,关于基于Java实现的区块链供应链金融系统平台设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 区块链与供应链数据分析:实现高效的供应链管理

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

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

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

    2024年02月12日
    浏览(45)
  • java毕业设计基于微信小程序的供应链管理系统

    本系统 (程序+源码) 带文档lw万字以上    文末可领取本课题的JAVA源码参考 选题背景: 随着移动互联网技术的飞速发展,微信小程序以其便捷性和高效性迅速占领了市场,成为了人们日常生活和工作中不可或缺的一部分。小程序的出现极大地丰富了移动互联网的应用场景

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

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

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

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

    2024年02月14日
    浏览(51)
  • 金融供应链智能合约 -- 智能合约实例

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

    2024年02月14日
    浏览(38)
  • 【Solidity】智能合约案例——②供应链金融合约

    目录 一、合约源码分析: 二、合约整体流程:         1.部署合约:         2.添加实体         3.发送交易存证            ①.银行向公司交易(公司向银行提供交易存证)            ②.公司向银行交易(银行向公司提供交易存证)            ③.公司向公司交易

    2024年02月06日
    浏览(39)
  • 基于“互联网+ 服务供应链”的汽车道路救援系统对策分析

    1。 建立“互联网+服务供应链”背景下汽车道路救援系统 基于互联网的汽车道路救援,两级服务供应链结构是由服务提供商、服务 集成商和客户组成。“互联网+服务供应链”背景下汽车道路救援系统组成, 它是一种 B2B2C 的形式,与前述传统汽车道路救援 B2B2C 模式有所不同

    2024年02月10日
    浏览(42)
  • 区块链溯源技术:如何保护物流供应链?

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

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

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

    2024年04月13日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包