售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
本文提供了另一个在Solidity中共享分布式数据的示例解决方案,这是区块链以太网智能契约的开发语言。
背景
爱丽丝和鲍勃在他们选择的数据仓库中共享数据,智能访问控制用户访问,用户访问通过互联网连接在一起。
爱丽丝和鲍勃也想下棋。
他们都有自己的棋盘和棋子,他们只需要在数据仓库中保存一个移动记录。我们也可以在状态机中对代码进行编码,用户可以直接调用智能契约来影响它。
象棋数据共享示例
这个例子的目的是为爱丽丝和鲍勃提供解决方案。任何需要的功能都可以编码到智能合同中。
在本例中,智能合同可以由任何用户(智能合同所有者)创建。可能是爱丽丝、鲍勃或其他人。
在任何情况下,如果合同允许,只有聪明的合同所有者可以终止合同。终止的合同将向智能合同所有者释放任何剩余资金,并删除数据仓库。
一些对象允许用户访问,而另一些对象禁止用户访问
在上图中,两个用户爱丽丝和鲍勃可以读写数据到他们自己在数据库中的文件夹。他们也可以从其他用户的文件夹中读取消息,但不能向他们写入。
如果你不是合同所有者(如果你不是爱丽丝或鲍勃),你不能访问任何人的数据。
用户还可以将包含棋子移动的新文件附加到共享文件夹中-上图中的3。
设计
我们将帐户1和文件夹1分配给爱丽丝,帐户2和文件夹2分配给鲍勃。
我们在文件夹3中记录棋类移动文件。每个用户可以依次添加一个新文件。
这是智能契约的UML逻辑状态机图:
象棋数据共享实例智能契约的UML逻辑状态机图
这里我们有三个并发状态机:合同所有者可以随时终止智能合同;数据可以像[如何在块链中实现分散数据仓库共享-第2部分](http://bitoken.world/WP-admin/post.php?邮报=2134行动=编辑'如何在区块链实现分散数据仓库共享-第2部分')。用户轮流将象棋移动文件附加到文件夹3(Await1和Await2机器状态)。
数据仓库使用图表的数据共享部分中显示的函数来确定对象上允许的操作。
图中等待部分显示的完成功能是一个用户功能。根据机器状态,只有在轮到指定用户时才能成功使用。在Await1状态下,只能调用account1(Alice)来完成。在Await2状态下,只能调用account2(鲍勃)来完成。
以下是每个角色允许的其他操作:
对象角色状态允许的操作
合同帐户1 Await1完成-转到Await2
合同帐户2 Await1完成-移至Await1
文件夹3帐户1 Await1读取,追加新文件
文件夹3帐户2 Await2读取,追加新文件
创建智能合同
这是我们将部署到区块链以太网博物馆的切思达斯达智能合同:
导入“DataSharesDac . sol”;
合同ChessDataShareSDAC是DataShareSDAC {
bool turn2
构造函数(address _account1,address _account2)公共
DataShareSDAC(_account1,_account2) { }
函数getPermissions(地址帐户,uint对象)
公共视图覆盖虚拟返回(uint) {
如果(!终止){
if (object==3) {
如果(帐户==(turn2?帐户2 :帐户1)) {
返回DIRECTORY | APPEND _ PERMISSION
}其他{
返回目录| READ _ PERMISSION
{}
{}
{}
返回DataShareSDAC.getPermissions(帐户,对象);
{}
函数done() public {
需要(msg.sender==(turn2?account 2 : account 1);
turn 2=msg . sender==account 1;
{}
{}
这个智能契约包含一个函数getPermissions,它覆盖基类中同名的函数。调用此函数,您可以选择是否调用基类函数。它这样做,而不是确定齐欣步骤文件夹(对象3)的访问权限。
任何用户(实际上,任何以太网用户)都可以调用done函数。但是,它确保了只有用户才能改变机器状态,并通过要求(msg)来阻止任何其他用户。发送方==转向)。该函数使turn2变量指示轮到另一个用户。
部署智能合同
参见[如何在区块链实现分散的数据仓库共享-第2部分](http://bitoken.world/WP-admin/post.php?Post=2134action=edit '如何在区块链实现分散式数据仓库共享-第2部分' .
更新数据仓库
我们无法更改哪个智能合同附加到数据仓库。这是一个深思熟虑的设计决定。我们认为用户不太可能愿意改变控制他们数据的合同。
但是您可以编写一个更复杂的智能合同,它可以更新如下:
但是目前,我们必须创建一个引用新智能合同的新数据仓库。
创建数据仓库
请参考前一篇文章的创建部分,所以我们不会在这里重复操作。
我们可能需要将现有文件从以前的数据仓库复制到这个新的数据仓库,然后终止以前的智能合同。
无论如何,我们需要为共享文件夹添加一个新的环境变量。
智能合同所有者终端
$导出C=文件夹13
使用象棋数据共享
智能合同是为爱丽丝设置的,首先执行。在指定她的动作之后,爱丽丝必须直接与智能契约通信,以通知她她已经完成了她的动作并转换了机器状态(使用UML和智能契约中的操作):
爱丽丝终端
$ datona writeVault $ contract $文化$vaultSrvId -文件$A/msg10
“你准备好比赛了吗?“我先走”
$ datona Writevault $ contract $ vaultual $ vaultSrvId-文件$C/move01
“e4”
$ datona transact合同$ contractCode $合同已完成
这些移动将被写入文件夹3中的文件。我们为下面的文件名提供了序列号,但它将由DApp在完整的解决方案中管理。
鲍勃码头
$ datona Writevault $ contract $ vaultual $ vaultSrvId-文件$C/move02
“e5”
$ datona transact合同$ contractCode $合同已完成
$ datona writeVault $ contract $文化$vaultSrvId -文件$B/msg21
“你去吧”
爱丽丝或她的DApp可以监控下一个移动文件的存在:
爱丽丝终端
$ datona readVault $ contract $文化$vaultSrvId -文件$C/move02
存储库错误-文件不存在
$ datona readVault $ contract $文化$vaultSrvId -文件$C/move02
e5
$ datona Writevault $ contract $ vaultual $ vaultSrvId-文件$C/move03
“Nf3”
$ datona transact合同$ contractCode $合同已完成
游戏可能会以同样的方式继续。
我们上一篇文章中的共享分散数据解决方案中的示例描述了数据仓库中用户之间的交互,该数据仓库由智能契约控制。
这个例子还演示了用户和智能合同之间的直接交互。
用户和数据存储库都可以使用智能合同功能
结论
爱丽丝、鲍勃和许多其他人希望以分散的方式共享数据。这可能会使数据更安全、更私密、更可控。
我们已经演示了一个实用的解决方案,它使用智能契约和数据仓库的组合来实现这一点,所有这些都符合datona-lib中描述的接口规范。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!