智能合约支持C端的兼容设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxid2798226/article/details/86215296

C端支持的问题

目前市场上所谓的“区块链”项目,绝大部分情况下,最终用户对其账户并无控制权,由B端企业代管。

XX项目原先最初稿设计支持C端,但是C端有个用户习惯的问题,在手机sdk,如果要保存密钥文件,那么是否需要加密?如果要加密,那么又要用户多输入一次密码,用户体验不佳,要做额外的市场教育工作,所以被毙了。但考虑到将来的趋势,所以要在智能合约这层做个兼容性的设计。

二期项目涉及的4账户图:

在这里插入图片描述

兼容C端的解决思路:
  • 大部分用户,都是托管的,由P2P公司发起交易
  • 少部分对区块链有了解的用户,可以选择自己管理密钥文件(代价可能是多输入一次密码)
  • 底层data,多加一个字段,owner,如果是托管,填写的是p2p公司地址,如果是自己管理密钥的实验用户,填写的是自己手机端以太坊账户的地址
    • owner是只有系统管理员才能设置进去的,get是public
//UserAccount.sol
    address private _owner;
    //设置owner(可能推广到C端)
    function setOwner(address myowner) public onlySystem {
        _owner = myowner;
    }
    function getOwner() public onlyVisit {
        return _owner;
    }
  • 如果是自管账户的自行投标,proxy会取特殊的map地址,从而获得service,service中检查动作发起者是否是本人
    • map地址怎么设置,用户绑卡创建账户的时候,选择“自行管理密钥文件”,在手机端创建以太坊账户,并在注册时有系统管理员设置用户地址和service的对应关系
//SelfTBProjectService.sol
    function tbService(address userAccount, address projectAccount, uint amount) public onlyVisit {
        UserAccount uacc = UserAccount(userAccount);
        ProjectAccount pacc = ProjectAccount(projectAccount);
        // business check
        assert(uacc.getTotal() >0);
        assert(uacc.getOwner() == tx.origin); //验证交易是由用户发起的
        // business logic, could be more specific
        uacc.setAccCash(uacc.getCash() - amount);
        pacc.setAccCash(pacc.getCash() - amount);
        //emit
        emit TBProjected(uacc.getUserId(), pacc.getProjectId(), amount, now);
    }

猜你喜欢

转载自blog.csdn.net/wxid2798226/article/details/86215296
今日推荐