版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}