Skip to content

Commit f99592b

Browse files
Merge branch 'master' into publish-10-1
2 parents d45bc0b + cd8ca72 commit f99592b

File tree

8 files changed

+91
-6
lines changed

8 files changed

+91
-6
lines changed

contracts/feature-tests/basic-features/mandos/block_info.scen.json

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
"blockTimestamp": "506",
2323
"blockNonce": "521",
2424
"blockRound": "532",
25-
"blockEpoch": "544"
25+
"blockEpoch": "544",
26+
"blockRandomSeed": "u64:0|u64:0|u64:0|u64:0|u64:0|u64:0"
2627
},
2728
"currentBlockInfo": {
2829
"blockTimestamp": "511",
2930
"blockNonce": "522",
3031
"blockRound": "533",
31-
"blockEpoch": "544"
32+
"blockEpoch": "544",
33+
"blockRandomSeed": "u64:42|u64:12345|u64:64|u64:7"
3234
}
3335
},
3436
{
@@ -111,6 +113,26 @@
111113
"refund": "*"
112114
}
113115
},
116+
{
117+
"step": "scCall",
118+
"txId": "get_prev_block_random_seed",
119+
"tx": {
120+
"from": "address:an_account",
121+
"to": "address:features_contract",
122+
"value": "0",
123+
"function": "get_prev_block_random_seed",
124+
"arguments": [],
125+
"gasLimit": "0x100000",
126+
"gasPrice": "0"
127+
},
128+
"expect": {
129+
"out": [ "u64:0|u64:0|u64:0|u64:0|u64:0|u64:0" ],
130+
"status": "",
131+
"logs": [],
132+
"gas": "*",
133+
"refund": "*"
134+
}
135+
},
114136

115137
{
116138
"step": "scCall",
@@ -191,6 +213,27 @@
191213
"gas": "*",
192214
"refund": "*"
193215
}
216+
},
217+
{
218+
"step": "scCall",
219+
"txId": "get_block_random_seed",
220+
"comment": "0-padding added in out-value",
221+
"tx": {
222+
"from": "address:an_account",
223+
"to": "address:features_contract",
224+
"value": "0",
225+
"function": "get_block_random_seed",
226+
"arguments": [],
227+
"gasLimit": "0x100000",
228+
"gasPrice": "0"
229+
},
230+
"expect": {
231+
"out": [ "u64:0|u64:0|u64:42|u64:12345|u64:64|u64:7" ],
232+
"status": "",
233+
"logs": [],
234+
"gas": "*",
235+
"refund": "*"
236+
}
194237
}
195238
]
196239
}

contracts/feature-tests/basic-features/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,11 @@ pub trait BasicFeatures {
463463
self.get_block_epoch()
464464
}
465465

466+
#[view(get_block_random_seed)]
467+
fn get_block_random_seed_view(&self) -> Box<[u8;48]> {
468+
self.get_block_random_seed()
469+
}
470+
466471
#[view(get_prev_block_timestamp)]
467472
fn get_prev_block_timestamp_view(&self) -> u64 {
468473
self.get_prev_block_timestamp()
@@ -483,6 +488,11 @@ pub trait BasicFeatures {
483488
self.get_prev_block_epoch()
484489
}
485490

491+
#[view(get_prev_block_random_seed)]
492+
fn get_prev_block_random_seed_view(&self) -> Box<[u8;48]> {
493+
self.get_prev_block_random_seed()
494+
}
495+
486496
// EVENTS
487497

488498
#[event("0x0123456789abcdef0123456789abcdef0123456789abcdef000000000000000a")]

elrond-wasm-debug/src/blockchain_mock.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub struct BlockInfo {
8383
pub block_nonce: u64,
8484
pub block_round: u64,
8585
pub block_epoch: u64,
86+
pub block_random_seed: Box<[u8;48]>,
8687
}
8788

8889
impl BlockInfo {
@@ -92,6 +93,7 @@ impl BlockInfo {
9293
block_nonce: 0,
9394
block_round: 0,
9495
block_epoch: 0,
96+
block_random_seed: Box::from([0u8;48]),
9597
}
9698
}
9799
}

elrond-wasm-debug/src/execute_mandos.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ fn parse_execute_mandos_steps(
7777
if let Some(u64_value) = &block_info_obj.block_round {
7878
state.previous_block_info.block_round = u64_value.value;
7979
}
80+
if let Some(bytes_value) = &block_info_obj.block_random_seed {
81+
const SEED_LEN: usize = 48;
82+
let val = &bytes_value.value;
83+
84+
assert!(val.len() <= SEED_LEN, "block random seed input value too long!");
85+
86+
let mut seed = [0u8; SEED_LEN];
87+
&seed[SEED_LEN - val.len()..].copy_from_slice(val.as_slice());
88+
state.previous_block_info.block_random_seed = Box::from(seed);
89+
}
8090
}
8191
if let Some(block_info_obj) = &**current_block_info {
8292
if let Some(u64_value) = &block_info_obj.block_timestamp {
@@ -91,6 +101,16 @@ fn parse_execute_mandos_steps(
91101
if let Some(u64_value) = &block_info_obj.block_round {
92102
state.current_block_info.block_round = u64_value.value;
93103
}
104+
if let Some(bytes_value) = &block_info_obj.block_random_seed {
105+
const SEED_LEN: usize = 48;
106+
let val = &bytes_value.value;
107+
108+
assert!(val.len() <= SEED_LEN, "block random seed input value too long!");
109+
110+
let mut seed = [0u8; SEED_LEN];
111+
&seed[SEED_LEN - val.len()..].copy_from_slice(val.as_slice());
112+
state.current_block_info.block_random_seed = Box::from(seed);
113+
}
94114
}
95115
},
96116
Step::ScCall {

elrond-wasm-debug/src/ext_mock.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ impl elrond_wasm::ContractHookApi<RustBigInt, RustBigUint> for TxContext {
402402
}
403403

404404
fn get_block_random_seed(&self) -> Box<[u8; 48]> {
405-
Box::new([0u8; 48])
405+
self.blockchain_info_box.current_block_info.block_random_seed.clone()
406406
}
407407

408408
fn get_prev_block_timestamp(&self) -> u64 {
@@ -422,7 +422,7 @@ impl elrond_wasm::ContractHookApi<RustBigInt, RustBigUint> for TxContext {
422422
}
423423

424424
fn get_prev_block_random_seed(&self) -> Box<[u8; 48]> {
425-
Box::new([0u8; 48])
425+
self.blockchain_info_box.previous_block_info.block_random_seed.clone()
426426
}
427427

428428
fn sha256(&self, data: &[u8]) -> H256 {

mandos/example.scen.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,15 @@
6161
"previousBlockInfo": {
6262
"blockNonce": "222",
6363
"blockRound": "333",
64-
"blockEpoch": "444"
64+
"blockEpoch": "444",
65+
"blockRandomSeed": "0x42BA9AE77C08604DD7EB9D209488B88DD5A301D9C9F3D4A6B4B40E95AA6F4A1E20519698D3F774052F475B6877449CF3"
6566
},
6667
"currentBlockInfo": {
6768
"blockTimestamp": "511",
6869
"blockNonce": "522",
6970
"blockRound": "533",
70-
"blockEpoch": "544"
71+
"blockEpoch": "544",
72+
"blockRandomSeed": "0x567A4637C658910A21C2AED8638D8A1A543B065929CD6D0452F279A9CF72CE80F6A15F66A217E92045DED9E3DF9441FB"
7173
}
7274
},
7375
{

mandos/src/scenario.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ pub struct BlockInfo {
169169
pub block_nonce: Option<U64Value>,
170170
pub block_round: Option<U64Value>,
171171
pub block_epoch: Option<U64Value>,
172+
pub block_random_seed: Option<BytesValue>,
172173
}
173174

174175
impl InterpretableFrom<BlockInfoRaw> for BlockInfo {
@@ -186,6 +187,9 @@ impl InterpretableFrom<BlockInfoRaw> for BlockInfo {
186187
block_epoch: from
187188
.block_epoch
188189
.map(|v| U64Value::interpret_from(v, context)),
190+
block_random_seed: from
191+
.block_random_seed
192+
.map(|v| BytesValue::interpret_from(v, context)),
189193
}
190194
}
191195
}

mandos/src/scenario_raw.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ pub struct BlockInfoRaw {
147147
#[serde(default)]
148148
#[serde(skip_serializing_if = "Option::is_none")]
149149
pub block_epoch: Option<ValueSubTree>,
150+
151+
#[serde(default)]
152+
#[serde(skip_serializing_if = "Option::is_none")]
153+
pub block_random_seed: Option<ValueSubTree>,
150154
}
151155

152156
#[derive(Serialize, Deserialize)]

0 commit comments

Comments
 (0)