Corda记录
UTXO模型
考虑的问题
- 怎么满足的用户的隐私要求
- 不同机构之间的数据怎进行联邦学习
- 监管怎么考虑:这个只是对于监管提供了部分数据的接口
- 使用Corda的优缺点:
- need-to-know
- 交易记录不公开,只需要记录自己参与的,保障隐私的同时,进一步减少需要存储的交易数量。
- 为什么银行会有你的交易记录???
- 如果没有怎么监管,或者说你监管的是什么。
- 只是监管账号的发行?
- 银行为什么给你发货币。
Corda智能合约
定义:一组数据以及一个参与方被允许对这些数据执行的操作组成。(states and contracts)
合约定义了什么可以做而不是什么不可以做。除了里面定义的不能做的事,其他都可以做。所以在设计时就需要考虑足够的参与方交易行为的约束。
节点需要对state本身进行检验,以保证交易合法
Flow
对于同一个节点的账户,要执行转账操作(MoveFungibleTokenFlow
),这个flow只能在保存该账户资产的节点上进行调用,因为这个flow没有识别身份的参数,在使用过程中会默认把执行流操作的节点作为该账户资产的拥有者,然后在本地查找需要转出的资金的账户信息,这将导致错误。
流执行是要求可以进行断点记录的,就是交易对方(counterParty)或者是公证人如果没有上线,收集签名的时候需要等待对方上线执行,主要是用在不同节点的交易记录。
交易限制
基本的匿名账户的限额问题,
限制单次转出的金额。
这个可以在合约里面进行验证,匿名账户和完成身份信息认证的账户有自己身份标识
限制转入转出次数,
银行作为托管账户,是可以知道交易双方的基本信息的,(因为需根据匿名性的需要,我们可以在每次交易时都生成一个publickey,因为账户在网络层面是不可见的,一方收到签名只会以为是对方节点Node
换了个key进行签名)
但是对于交易的金额是不能够知道的,这一部分具体实现是怎么做到的,需要考虑一下。
我可以在数据库中实时更新账户的转入转出次数,当达到限定次数之后。
解决方案:
场景1:一个人注册多个匿名账号的数据信息
银行不应该有以下数据信息:
- 不同账户数据之间的关联信息
- 交易详细的数据记录,场景中主要是交易的金额。
这里有一个问题是为什么会记录用户账户的记录,可不可以直接对整个交易内容全部进行加密进行加密。
个人如果对全部的信息进行加密,那么在进行账户交易次数的验证的时候,银行本身进行数据的查询是没有可行性的。
后面研究方向
私钥管理,托管账户的节点会保存所有账户每次申请的私钥,后面处理第三方数据
联邦学习实现不同机构间的数据进行建模,消除第三方机构。
系统监管或者说验证的时间间隔,也就是每天进行记录的检验还是其他的给定的数据验证的间隔时间。
多银行之间的数据如何进行有效的校对、验证和监管。据悉,现今意大利各地银行都在使用R3的Corda区块链用以加快对交易记录的双重检查。意大利银行协会负责人表示,银行间对账流程与数据交换基础技术都必须改变。在旧的银行系统中需要花费30至50天的对账,在Corda上一天之内就能完成。
//Buyer Query for token balance.
QueryCriteria queryCriteria = QueryUtilities.heldTokenAmountCriteria(this.getInstance(currency), senderAccount).and(QueryUtilities.sumTokenCriteria());
List<Object> sum = getServiceHub().getVaultService().queryBy(FungibleToken.class, queryCriteria).component5();
if(sum.size() == 0)
throw new FlowException(senderAccountName + " has 0 token balance. Please ask the Bank to issue some cash.");
else {
Long tokenBalance = (Long) sum.get(0);
if(tokenBalance < this.amount)
throw new FlowException("Available token balance of " + senderAccountName + " is less than the cost of the ticket. Please ask the Bank to issue some cash if you wish to buy the ticket ");
}
SignedTransaction moveTokensTx = subFlow(new MoveFungibleTokens(
Collections.singletonList(partyAndAmount),
Collections.emptyList(),
heldByMint, mint));
// Persist token-transaction.
PersistentTokenTransaction tokenTransaction =
new PersistentTokenTransaction(
new UniqueIdentifier().getId().toString(),
moveTokensTx.getId().toString(), Instant.now(),
"MOVE",
"Mint",
"HolderA",
100);
getServiceHub().withEntityManager(entityManager -> {
entityManager.persist(tokenTransaction);
return null;
});