2017-09-23 37 views
1

我有一个单个区块链上的对象会随时更新。我想跟踪这些更改。我如何描述这样的结构Vec<(u32, u32)>并在开始时对其进行初始化?现在我有:跟踪Exonum中单个对象的更改

encoding_struct! { 
    struct AC { 
     const SIZE = 16; 
     field s: Vec<u32> [00 => 08] 
     field o: Vec<u32> [08 => 16] 
    } 
} 

,然后等待一个特殊的空初始化交易

message! { 
    struct TxInitAC { 
     const TYPE = SERVICE_ID; 
     const ID = TX_INIT_AC; 
     const SIZE = 0; 
    } 
} 

execute方法

fn execute(&self, view: &mut Fork) { 
    let mut schema = CurrencySchema { view };     
    let ac = AC::new(vec![], vec![]);   
    schema.access_control().push(ac); 
} 
+0

我的理解是区块链上的物品永远不会改变;这是让他们感兴趣和有用的部分原因。除此之外,你的问题没有足够的细节让我明白你真正想问什么。你的问题需要涉及Exonum吗?你能否用简单的Rust来形容这个问题,创建一个[MCVE]? – Shepmaster

+0

项目确实改变。考虑加密货币:钱包余额不固定。重要的是平衡(交易)的变化是不变的。 W.r.t.最简单的例子:即使是Exonum文档中的最小示例也只有几页。恐怕这个问题不能在普通的Rust中改写,我希望Exonum的开发人员能够看看这个问题。他们专门在他们的网站上提供帮助(https://exonum.com/faq) –

回答

1

具有上的Gitter的开发人员的谈话后,我想出了一个解决方案。

要描述encoding_struct!中的复合对象,必须在相应的encoding_struct!中描述每个组件。在问题的情况下,这将是:

encoding_struct! { 
    struct Pair { 
     const SIZE = 8; 
     field s: u32 [00 => 04] 
     field o: u32 [04 => 08] 
    } 
} 

encoding_struct! { 
    struct AC { 
     const SIZE = 8; 
     field inner : Vec<Pair> [00 => 08] 
    } 
} 

要初始化blockchain分贝,一个必须实现initialize功能在Service性状,例如,用空载体初始化:

impl Service for MService { 
//... 
    fn initialize(&self, fork: &mut Fork) -> Value { 
     let mut schema = MatrixSchema { view: fork }; 
     let matrix = AC::new(vec![]); 
     // assume method ac() is implemented for the schema 
     schema.ac().set(ac);   
     Value::Null 
    } 
}