关于智能合约数据、操作分离
发布于 2 年前 作者 dan 1449 次浏览 来自

不知道哪位有相对成熟一点的数据操作分离的案例,想参考一下。 现在我的想法和代码如下,一个数据合约data,提供get和set方法,一个函数合约,包装和组合get,set操作。

contract data
{
	struct DataModel
	{
		bytes32 name;
		bytes32 description;
	}
	mapping(address=>DataModel) modelOf;
	function GetDataModelname(address _key) 
	returns(bytes32) 
	{ 
	 return modelOf[_key].name; 
	}
	function SetDataModelname(address _key,bytes32 _val)  
	{ 
	 modelOf[_key].name = _val; 
	}
	function GetDataModeldescription(address _key) 
	 returns(bytes32) 
	{ 
	 return modelOf[_key].description; 
	}
	function SetDataModeldescription(address _key,bytes32 _val)  
	{ 
	 modelOf[_key].description = _val; 
	}
}

contract MyMethod
{
	 function Regist(bytes32 name, bytes32 description)
	 {
	 		data.SetDataModelname(msg.sender,name);
			data.SetDataModeldescription(msg.sender,description);
	 }
}

在此,我是可以在method的合约按照业务要求做一些modifier,验证权限和规则相关的东西。但是,问题来了,data合约相当于是裸奔的,理论上,一旦合约发布,用户是可以绕过我的MyMethod合约直接访问我的data合约的,这样是极不安全的。 不知哪位大侠有这方面经验或者资料,望指点一下。

7 回复

+1 我也想听听有什么解决方案,用合约做权限管理感觉特别不安全。 我感觉只能通过密码学手段,加密存储数据,然后比较保密的变量值尽量设置成private,不知道有没有更好的做法~希望大神来回答下 @路人-戊 @tryblockchain @maiiz

首先get方法是多余的,参见此帖的第一条回复 @imtypist 权限控制的问题挺好做的,比如你的SetDataModelname 方法,你可以指定某个特定的账户才能修改数据啊,比如官方示例Ballot 里面的giveRightToVote 方法

@路人-戊 但是如果在已知创建者的address的情况下,在交易中只要指明sendTransaction({from:'创建者的address'})不就可以绕过这个权限控制了么?

@imtypist @路人-戊 其实我做这么多,主要的目的是以后合约可升级。 把数据合约的粒度降低,然后再操作合约中做组装,包装成各种业务。一旦业务变更了,那就重新做一套操作合约,数据合约不变。 所以,会遇到的问题是,如果在数据层将每个属性的读取都加权限,那么,这样势必会影响到上层业务封装。如果数据层不加权限的话,那就不安全,当用户绕过操作合约直接操作数据时,很危险。

@imtypist sendTransaction({from:'创建者的address'}) 这个发送交易的过程是需要私钥的,你保密好你的私钥就行了

其实感觉@路人-戊 在二楼已经说得很清楚了。

  • 区块链上的数据本就是开放的,如果想不开放就不应该上链。
  • 所以重要的就是对数据的操作权限控制。你自己也提到了用modifier。if(havePrivilege) _; throw; 做好数据操作控制。
  • 更进一步,你想控制谁有权限,那就写个mapping<address,privilege>来查不就可以了。

@路人-戊 @tryblockchain 嗯嗯,谢谢!我还得继续加深对以太坊的理解😁

回到顶部