区块链研究实验室|如何在区块链上实现去中心化数据仓库共享-part2

  • 时间:
  • 浏览:59
  • 来源:区块链技术网

本文提供了一个在Solidity中共享去中心化数据的示例解决方案,Solidity是以太坊区块链的智能合约开发语言。

背景

上一篇文章区块链研究实验室|如何在区块链上实现去中心化数据仓库共享-part1,下面是一个使用Datona的交互式命令行界面(datona-cli)的示例解决方案。

Alice和Bob将在自己选择的数据仓库中共享他们的数据,并通过智能合约控制用户访问,所有这些都通过互联网链接在一起。

使用智能合约来控制对数据仓库的访问

这不仅是一个智能合约,它还是一个智能数据访问合约。

数据共享示例

这个例子旨在为Alice和Bob提供一个解决方案。所需的任何功能都可以编码到智能合约中。

在本例中,智能合约可以由任何用户(智能合约所有者)创建。可能是Alice或Bob,或者其他人。

在任何时候只有智能合约所有者可以在合约允许的情况下终止合约。终止的合约将向智能合约所有者释放任何剩余资金,并将删除数据仓库。

某些对象允许用户访问,但其他对象禁止用户访问

上图中两个用户Alice和Bob可以分别将数据读和写到数据保管库中自己的文件夹中。他们还可以从其他用户的文件夹中读取邮件,但不能写入该文件夹。

合约所有者(除Alice或Bob以外)无法访问任何人的数据。

我们将在终端窗口中使用datona-cli命令来:

1. 部署合约

2. 创建数据仓库

3. 并执行对象操作

也可以使用应用程序与Datona库(datona-lib)进行交互。智能合约以Solidity编写并部署在以太坊区块链上。

数据仓库服务器地址是datonavault.com。其他数据仓库也可用。

智能合约设计

我们将account1和folder1分配给Alice,将account2和folder2分配给Bob。

这是智能合约的UML逻辑状态机图:

数据共享示例智能合约的UML逻辑状态机图

本例中只有一种操作状态:数据共享,这将使实现相对容易。通常智能合约必须处理多个状态。

除了Terminate(终止)之外,显示的所有函数都由datavault用于确定对对象的允许操作。本例中没有用户函数。

终止只能由智能合约所有者使用。终止是一种逻辑状态。这与删除智能合约不同。终止后,仍然可以访问合同并确定其是否已终止。

以下是每个角色允许的操作:

ObjectRoleStatePermittedOperationscontractownerShareterminatefolder1account1Shareallfile(read,write,append)folder1account2Sharereaddirectory,filefolder2account2Shareallfile(read,write,append)folder2account1Sharereaddirectory,file

创建智能合约

这是我们将要部署到以太坊区块链的Solidity DataShareSDAC:

import"SDACinterface.sol";contractDataShareSDACisSDACinterface{addresspublicowner=msg.sender;addressaccount1;addressaccount2;boolterminated;constructor(address_account1,address_account2)public{account1=_account1;account2=_account2;}functionterminate()publicoverride{require(msg.sender==owner);terminated=true;}functionhasExpired()publicviewoverridereturns(bool){returnterminated;}functiongetPermissions(addressaccount,uintobject)publicviewoverridevirtualreturns(uint){if(!terminated){if(account==account1){if(object==1)returnDIRECTORY|ALL_PERMISSIONS;if(object==2)returnDIRECTORY|READ_PERMISSION;}if(account==account2){if(object==2)returnDIRECTORY|ALL_PERMISSIONS;if(object==1)returnDIRECTORY|READ_PERMISSION;}}returnNO_PERMISSIONS;}}

此智能合约符合datona-lib描述的智能数据访问合约接口规范,并在SDACinterface基础智能合约(也包含普通对象权限常量)中实现为虚拟函数。

虚拟函数必须由派生的智能合约定义(using override),以启用与数据保险库的交互。在编写本文时,函数是terminate、hasExpired和getPermissions,但是请注意如果你的计划与示例不同,请查阅datona-lib获取最新规范帮助。

datavault操作由getPermissions控制,getPermissions返回给定帐户和对象的适当属性(IsDirectory、Readable、Writeable、Appendable)。

部署智能合约

在Remix,Byzantium v0.6.10中编译Solidity代码。

创建一个文件DataShare.sdac,其中包含智能合约ABI,Bytecode和runtimeBytecode,格式与Datona Duration_SDAC示例的相似:

DataShare.sdac{“abi”:<CopyRemix/SOLIDITYCOMPILER/ABItextfortheDataShareSDACContracthere>,“bytecode”:<CopyRemix/SOLIDITYCOMPILER/CompilationDetails/BYTECODEfortheDataShareSDACContracthere>,“runtimeBytecode”:<CopyRemix/SOLIDITYCOMPILER/CompilationDetails/RUNTIMEBYTECODEfortheDataShareSDACContracthere>}

按照datona-cli中的示例,我们可以将合约部署到以太坊区块链。

在终端窗口中,我们将为Alice和Bob生成一些密钥,并以智能合约所有者的身份单独存在:

SmartContractOwnerTerminal$datonagenerateKeyAliceKey$Alice=`datonagetAddressAliceKey`$datonagenerateKeyBobKey$Bob=`datonagetAddressBobKey`$#providekeyfundsasdescribedinthedatona-cliexample$contractCode=DataShare.sdac$datonadeployContract$contractCode$Alice$Bob--keyowner0x3E68B5B74073993f7220cfB851B9B0d3af8444d8$contract=0x3E68B5B74073993f7220cfB851B9B0d3af8444d8

创建数据仓库

让我们配置数据仓库的访问,然后我们将能够如datona-cli中所述创建数据仓库:

SmartContractOwnerTerminal$vaultUrl=file://77.68.75.133:8127$vaultSrvId=0x288b32F2653C1d72043d240A7F938a114Ab69584$datonacreateVault$contract$vaultUrl$vaultSrvId--keyowner...responseType:'success'...$exportA=folder1$exportB=folder2

有关实际的文件夹名称格式,请参见Daytona自述文件。

使用数据共享

我们可以以Alice身份打开终端窗口,然后将数据写入数据仓库:

AliceTerminal$exportDATONA_KEY=AliceKey$datonawriteVault$contract$vaultUrl$vaultSrvId--file$A/msg01“HiBob,fromAlice"

这将写入文件夹名称“ $ A”,文件名“ msg01”,内容“ Hi Bob,from Alice”。

我们不必费心在下面的终端输出中显示responseType:“success”消息。

让我们为Bob打开一个终端窗口,并列出文件名和文件数据,然后响应:

BobTerminal$exportDATONA_KEY=BobKey$datonareadVault$contract$vaultUrl$vaultSrvId--file$Amsg01$datonareadVault$contract$vaultUrl$vaultSrvId--file$A/msg01HiBob,fromAlice$datonawriteVault$contract$vaultUrl$vaultSrvId--file$B/info“HiAlice,fromBob”$datonawriteVault$contract$vaultUrl$vaultSrvId—file$B/invite“Coffee?”

Alice可以列出文件名,然后列出文件数据:

AliceTerminal$datonareadVault$contract$vaultUrl$vaultSrvId--file$Binfoinvite$datonareadVault$contract$vaultUrl$vaultSrvId--file$B/infoHiAlice,fromBob$datonareadVault$contract$vaultUrl$vaultSrvId--file$B/inviteCoffee?

对话可以继续,并且可以发送和接收数据文件。

本节说明了由智能合约控制的Alice和Bob在数据仓库上的交互操作。

数据仓库通过智能合约检查用户请求是否被允许

在某个阶段,智能合约所有者可以终止合约,并且数据保管库将被自动删除。

SmartContractOwnerTerminal$datonaterminateContract$contractCode$contract--keyowner

另一个示例解决方案

我们将在共享去中心化数据时使用datona-cli为这个问题提供另一个扩展的工作解决方案。

结论

Alice和Bob以及其他许多人都希望能够以分散的方式共享数据。这可能会使数据更安全、更私密、更可控。

我们已经展示了一个实用的解决方案,它使用智能合约和数据仓库的组合来实现这一点,这些都符合datona-lib中描述的接口规范。

--------------------------------------------

原文作者:Julian Goddard

译者:链三丰

译文出处:http://bitoken.world

---------------------------------------------

相关文章阅读:

区块链研究实验室|如何在区块链上实现去中心化数据仓库共享-part1

猜你喜欢

在公共测试网上部署智能合约

欢迎阅读又一篇关于以太坊编程基础的文章。在之前的文章中,我们已经知道了开发去中心化应用程序的流程和基本工具,在这篇文章中,我们将讨论怎样在公共测试网上部署 dapp,我也会为大家介绍一些有帮助的以太坊开发者资源。

2022-01-20

从零开发区块链应用(一)-golang配置文件管理工具viper

理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response

2022-01-20

从零开发区块链应用(二)--mysql安装及数据库表的安装创建

varchar 类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取 0~~65525 之间的任意值。指定了 varchar 类型的最大值以后,其长度可以在 o 到最大长度之间。

2022-01-20

从零开发区块链应用(三)--mysql初始化及gorm框架使用

Gorm 是 golang 的一个 orm 框架,它提供了对数据库操作的封装,使用起来相当便利。所以如果对 mysql 使用操作不熟悉,建议也可以使用 gorm 框架操作 mysql 数据库。

2022-01-20

从零开发区块链应用(四)--自定义业务错误信息

在实际业务开发中,一个条错误信息需要包含两部分内容:直接展示给用户的 message 和用于开发人员 debug 的 error 。message 可能会直接展示给用户,error 是用于 debug 的错误信息,可能包含敏感/内部信息,不宜对外展示

2022-01-20