底物存储中私人变量的可能性

时间:2019-07-03 09:42:14

标签: substrate

是否可以将私有变量存储在基板存储器中,特别是以下形式并通过私有函数访问它们?

#[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(())
  }
}

1 个答案:

答案 0 :(得分:2)

由于区块链系统的分布式性质,所有存储本质上是对世界公开的。由于任何人都可以同步区块链,他们最终将能够生成当前的区块链状态,包括存储中的任何变量。为了就这些存储项目的状态达成共识,它们必须对各方可见并已知。

为了将“秘密数据”保留在公共区块链上,您可能可以使用的一种解决方案是在数据进入链上之前对其进行加密,并保持加密密钥不在链上。

如果以后您希望其他用户知道机密数据,则该用户可以“公开”加密密钥,以暴露最初加密的数据。

这种提交/显示模式用于一些简单的区块链游戏,例如石头,纸张,剪刀。