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;
});