基板存储中私有变量的可能性
Possibility of private variables in substrate storage
是否可以将私有变量存储在substrate storage中,具体如下形式,并在私有函数中访问?
#[derive(Encode, Decode, Default, Clone, PartialEq, Debug)]
pub struct MyStruct {
id: Hash, // the `id` is public
// 1. Can this be a private variable not returned by API / to client?
private_var: u64,
}
decl_storage! {
trait Store for Module<T: Trait> as MyModule {
// 2. Can this be private storage used only within module function implementation, but cannot be called by API/client?
PrivateStorage: u64 = 0;
PublicStruct: MyStruct;
}
}
decl_module! { }
impl<T: Trait> Module<T> {
fn _private_function() -> Result {
//can access both private variable/storage
let var1 = <PrivateStorage<T>>::get();
let var2 = <MyStruct<T>>::get();
if var2.private_var == 0 {
// some more code
}
Ok(())
}
}
由于区块链系统的分布式特性,所有存储本质上都是 public 给世界的。由于任何人都可以同步区块链,他们最终将能够生成当前的区块链状态,包括存储中的任何变量。为了就这些存储项目的状态达成共识,它们必须是可见的并且为所有各方所知。
为了将 "secret data" 保留在 public 区块链上,您可以使用的一种解决方案是在数据上链之前对其进行加密,并将加密密钥保存在链外。
如果你以后想让其他用户知道秘密数据,用户可以"reveal"加密密钥,暴露最初加密的数据。
这个commit/reveal模式被用在一些简单的区块链游戏中,比如剪刀石头布。
是否可以将私有变量存储在substrate storage中,具体如下形式,并在私有函数中访问?
#[derive(Encode, Decode, Default, Clone, PartialEq, Debug)]
pub struct MyStruct {
id: Hash, // the `id` is public
// 1. Can this be a private variable not returned by API / to client?
private_var: u64,
}
decl_storage! {
trait Store for Module<T: Trait> as MyModule {
// 2. Can this be private storage used only within module function implementation, but cannot be called by API/client?
PrivateStorage: u64 = 0;
PublicStruct: MyStruct;
}
}
decl_module! { }
impl<T: Trait> Module<T> {
fn _private_function() -> Result {
//can access both private variable/storage
let var1 = <PrivateStorage<T>>::get();
let var2 = <MyStruct<T>>::get();
if var2.private_var == 0 {
// some more code
}
Ok(())
}
}
由于区块链系统的分布式特性,所有存储本质上都是 public 给世界的。由于任何人都可以同步区块链,他们最终将能够生成当前的区块链状态,包括存储中的任何变量。为了就这些存储项目的状态达成共识,它们必须是可见的并且为所有各方所知。
为了将 "secret data" 保留在 public 区块链上,您可以使用的一种解决方案是在数据上链之前对其进行加密,并将加密密钥保存在链外。
如果你以后想让其他用户知道秘密数据,用户可以"reveal"加密密钥,暴露最初加密的数据。
这个commit/reveal模式被用在一些简单的区块链游戏中,比如剪刀石头布。