目录
一、项目背景 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
实现智能合约方法调用接口:使用前端传过来的方法名作为索引调用方法 17
2.6编译部署 18
三、功能测试 21
3.1 功能一 22
3.2 功能二 25
3.3 功能三 29
3.4 功能四 33
四、界面展示 37
一、项目背景
1.1 供应链+金融场景
供应链(Supply Chain)是指生产及流通过程中,涉及将产品或服务提供给最终用户活动的上游与下游企业所形成的网链结构。
金融机构对不同企业的的信用评级不同,核心企业有很大的风险承担的能力,故信用评级会高于一般企业。在供应链场景中,核心企业由于资金暂时短缺向下流普通公司签订了应收账款单据,约定某个时间后还款,这个过程可以由金融机构来作见证,从而确认这笔交易的真实性。在这段时间内,若掌握核心企业"欠条"的普通企业资金短缺需要融资,它可以凭借跟核心企业签订的应收账款单据向金融结构借款,但这样的信任关系并不会往下游传递。
这种不信任关系一直沿着下游的普通企业传播,需要金融机构不断往上验证真实性,导致这个过程增加很多经济成本。导致这个问题的根本原因是核心企业的信用无法在整个供应链中传递以及交易信息不透明化所导致的。
如果我们结合区块链技术,将供应链上的每一笔交易和应收账款单据上链,同时引入第三方可信机构来确认这些信息的交易,例如银行,物流公司等,确保交易和单据的真实性,同时支持应收账款的转让,融资,清算等,就可以让核心企业的信用可以传递到供应链的下游企业,减小中小企业的融资难度。
本项目针对这样一个应用场景,基于已有的开源区块链系统FISCO-BCOS,以联盟链为主,开发基于区块链或区块链智能合约的供应链金融平台, 实现供应链应收账款资产的溯源、流转。
1.2 功能需求分析
基本功能:
1.核心企业、普通企业、金融企业的注册。
2.通过账户查询余额、查询收款单据和欠款单据和查看历史交易记录。
核心功能:
1.实现采购商品—签发应收账款交易上链。例如车企从轮胎公司购买一批轮胎并签订应收账款单据。
2.实现应收账款的转让上链,本文转载自http://www.biyezuopin.vip/onews.asp?id=16716轮胎公司从轮毂公司购买一笔轮毂,便将于车企的应收账款单据部分转让给轮毂公司。轮毂公司可以利用这个新的单据去融资或者要求车企到期时归还钱款。
3.利用应收账款向银行融资上链,供应链上所有可以利用应收账款单据向银行申请融资。
4.应收账款支付结算上链,应收账款单据到期时核心企业向下游企业支付相应的欠款。
const Configuration = require('./nodejs-sdk/packages/api').Configuration;
const Web3jService = require('./nodejs-sdk/packages/api').Web3jService;
const createContractClass = require('./nodejs-sdk/packages/api/compile/contractClass').createContractClass;
let config = new Configuration('config.json');
let web3j = new Web3jService(config);
const fs = require('fs');
// 加载智能合约
console.log('Loading contract from compiled file ...');
let compiled = JSON.parse(fs.readFileSync('compiled/SupplyChain.json'))
let contract = createContractClass(
compiled.name, compiled.abi, compiled.bin, config.encryptType
).newInstance();
console.log('Loading deployed contract address from deployed file ...');
let contractAddr = JSON.parse(fs.readFileSync('deployed/SupplyChain.json'))['contractAddress'];
contract.$load(web3j, contractAddr);
console.log('Done.');
// 准备HTTP服务
const express = require('express');
const bodyParser = require('body-parser');
const port = 9000;
var app = express();
app.use(bodyParser.json({ limit: '10mb'}));
app.use(express.static('web', {index: '/index.html'})); // 网页根目录
function getReqData(req) {
if (req.body && Object.keys(req.body).length) {
return req.body;
}
if (req.query && Object.keys(req.query).length) {
return req.query;
}
if (req.params && Object.keys(req.params).length) {
return req.params;
}
return {};
}
// 合约方法调用接口参数如下
// account: 字符串,调用合约的账户名,必须是config.json中已有的账户
// method: 字符串,想要调用的合约方法名字
// parameters: 列表,合约方法调用参数
// 返回一个JSON对象字符串
// ok: 布尔值,调用是否成功
// msg: 字符串,如果调用成功,则设为'succeed',否则为错误信息
// data: 列表,合约方法调用的返回值
app.all('/contractMethod', async (req, res) => {
let reqData = getReqData(req);
console.log(`call 'contractMethod' from ip ${req.ip}, params: ${JSON.stringify(reqData)}`);
if (typeof(reqData.account) != 'string' || typeof(reqData.method) != 'string' ||
!Array.isArray(reqData.parameters)
) { // 检查接口参数类型
console.log('failed at parameter type checking.');
res.json({ok: false, msg: 'Bad iterface call.', data: []});
return;
}
// 进行合约方法调用
try {
contract.$by(reqData.account);
let retval = await contract[reqData.method](...reqData.parameters);
console.log(`retval: ${JSON.stringify(retval)}`);
res.json({ok: true, msg: 'succeed', data: retval});
} catch (err) { // 出错
let errString = err.toString();
console.log(errString);
res.json({ok: false, msg: errString, data: []});
}
});
var server = app.listen(port);
console.log(`server started at port ${port}.`)




























导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题: