Skip to content

Commit

Permalink
optimization loop (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
WGB5445 authored and WGB5445 committed Jun 29, 2022
1 parent 33f1578 commit 8e60a05
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 63 deletions.
2 changes: 1 addition & 1 deletion build/StarcoinFramework/BuildInfo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ compiled_package_info:
? address: "0x00000000000000000000000000000001"
name: YieldFarmingV2
: StarcoinFramework
source_digest: BF6C3B0DC4B1F8B86C7E2EB55B9CF77AFEB1CF8BA191369FF98931C0810B07BC
source_digest: EAB7A24EE64BCAB1F16279AAA66766062B05BD0B30EDF44BDE5E1027951498E3
build_flags:
dev_mode: false
test_mode: false
Expand Down
Binary file modified build/StarcoinFramework/bytecode_modules/Block.mv
Binary file not shown.
54 changes: 23 additions & 31 deletions build/StarcoinFramework/docs/Block.md
Original file line number Diff line number Diff line change
Expand Up @@ -588,21 +588,13 @@ Call at block prologue
<pre><code><b>public</b> <b>fun</b> <a href="Block.md#0x1_Block_latest_state_root">latest_state_root</a>():(u64,vector&lt;u8&gt;) <b>acquires</b> <a href="Block.md#0x1_Block_Checkpoints">Checkpoints</a>{
<b>let</b> checkpoints = <b>borrow_global</b>&lt;<a href="Block.md#0x1_Block_Checkpoints">Checkpoints</a>&gt;(<a href="CoreAddresses.md#0x1_CoreAddresses_GENESIS_ADDRESS">CoreAddresses::GENESIS_ADDRESS</a>());
<b>let</b> len = <a href="Vector.md#0x1_Vector_length">Vector::length</a>&lt;<a href="Block.md#0x1_Block_Checkpoint">Checkpoint</a>&gt;(&checkpoints.checkpoints);
<b>let</b> i = <b>if</b>(checkpoints.index == 0){
len
}<b>else</b>{
checkpoints.index - 1
};
<b>while</b>( i != checkpoints.index){
<b>if</b>( <a href="Option.md#0x1_Option_is_some">Option::is_some</a>&lt;vector&lt;u8&gt;&gt;(&<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i).state_root)) {
<b>return</b> (<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i).block_number, *&<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i).block_hash)
<b>let</b> i = checkpoints.index ;
<b>while</b>( i &lt; len + checkpoints.index){
<b>if</b>( <a href="Option.md#0x1_Option_is_some">Option::is_some</a>&lt;vector&lt;u8&gt;&gt;(&<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i % len).state_root)) {
<b>return</b> (<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i % len).block_number, *&<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&checkpoints.checkpoints, i % len).block_hash)
};

i = <b>if</b>( i == 0 ){
len
}<b>else</b>{
i - 1
};
i = i + 1;
};
<b>abort</b> <a href="Errors.md#0x1_Errors_invalid_state">Errors::invalid_state</a>(<a href="Block.md#0x1_Block_ERROR_NO_HAVE_CHECKPOINT">ERROR_NO_HAVE_CHECKPOINT</a>)
}
Expand All @@ -629,7 +621,7 @@ Call at block prologue

<pre><code><b>public</b> <b>fun</b> <a href="Block.md#0x1_Block_update_state_root">update_state_root</a>(account: &signer, header:vector&lt;u8&gt;) <b>acquires</b> <a href="Block.md#0x1_Block_Checkpoints">Checkpoints</a>{
<a href="CoreAddresses.md#0x1_CoreAddresses_assert_genesis_address">CoreAddresses::assert_genesis_address</a>(account);
header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000";
// header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000";

<b>assert</b>!(<a href="Vector.md#0x1_Vector_length">Vector::length</a>&lt;u8&gt;(&header) == <a href="Block.md#0x1_Block_BLOCK_HEADER_LENGTH">BLOCK_HEADER_LENGTH</a> , <a href="Errors.md#0x1_Errors_invalid_argument">Errors::invalid_argument</a>(<a href="Block.md#0x1_Block_ERROR_NOT_BLOCK_HEADER">ERROR_NOT_BLOCK_HEADER</a>));
<b>let</b> i = 1 ;
Expand All @@ -644,6 +636,16 @@ Call at block prologue
<a href="Vector.md#0x1_Vector_push_back">Vector::push_back</a>&lt;u8&gt;(&<b>mut</b> number_vec , *<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>&lt;u8&gt;(&header , i));
i = i + 1;
};
<b>let</b> number: u128 = 0;
<b>let</b> offset = 0;
<b>let</b> i = 0;
<b>while</b> (i &lt; 8) {
<b>let</b> byte = *<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&number_vec, offset + i);
<b>let</b> s = (i <b>as</b> u8) * 8;
number = number + ((byte <b>as</b> u128) &lt;&lt; s);
i = i + 1;
};

<b>let</b> state_root = <a href="Vector.md#0x1_Vector_empty">Vector::empty</a>&lt;u8&gt;();
i = 133;
<b>while</b>(i &lt; 165){
Expand All @@ -653,26 +655,16 @@ Call at block prologue

<b>let</b> checkpoints = <b>borrow_global_mut</b>&lt;<a href="Block.md#0x1_Block_Checkpoints">Checkpoints</a>&gt;(<a href="CoreAddresses.md#0x1_CoreAddresses_GENESIS_ADDRESS">CoreAddresses::GENESIS_ADDRESS</a>());
<b>let</b> len = <a href="Vector.md#0x1_Vector_length">Vector::length</a>&lt;<a href="Block.md#0x1_Block_Checkpoint">Checkpoint</a>&gt;(&checkpoints.checkpoints);
<b>let</b> i = <b>if</b>(checkpoints.index == 0){
len
}<b>else</b>{
checkpoints.index - 1
};
<b>while</b>( i != checkpoints.index){
<b>if</b>( &<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&<b>mut</b> checkpoints.checkpoints, i).block_hash == &block_hash ) {
<a href="Vector.md#0x1_Vector_borrow_mut">Vector::borrow_mut</a>(&<b>mut</b> checkpoints.checkpoints, i).block_number = 1;
<b>let</b> stro = &<b>mut</b> <a href="Vector.md#0x1_Vector_borrow_mut">Vector::borrow_mut</a>(&<b>mut</b> checkpoints.checkpoints, i).state_root;

*<a href="Option.md#0x1_Option_borrow_mut">Option::borrow_mut</a>&lt;vector&lt;u8&gt;&gt;( stro) = state_root;
<b>let</b> i = checkpoints.index ;
<b>while</b>( i &lt; len + checkpoints.index){
<b>if</b>( &<a href="Vector.md#0x1_Vector_borrow">Vector::borrow</a>(&<b>mut</b> checkpoints.checkpoints, i % len).block_hash == &block_hash ) {
<a href="Vector.md#0x1_Vector_borrow_mut">Vector::borrow_mut</a>(&<b>mut</b> checkpoints.checkpoints, i % len).block_number = (number <b>as</b> u64 );
*<a href="Option.md#0x1_Option_borrow_mut">Option::borrow_mut</a>&lt;vector&lt;u8&gt;&gt;( &<b>mut</b> <a href="Vector.md#0x1_Vector_borrow_mut">Vector::borrow_mut</a>(&<b>mut</b> checkpoints.checkpoints, i % len).state_root) = state_root;
<b>return</b>
};

i = <b>if</b>( i == 0 ){
len
}<b>else</b>{
i - 1
};
i = i + 1 ;
};

<b>abort</b> <a href="Errors.md#0x1_Errors_invalid_state">Errors::invalid_state</a>(<a href="Block.md#0x1_Block_ERROR_NO_HAVE_CHECKPOINT">ERROR_NO_HAVE_CHECKPOINT</a>)
}
</code></pre>
Expand Down
Binary file modified build/StarcoinFramework/source_maps/Block.mvsm
Binary file not shown.
5 changes: 5 additions & 0 deletions integration-tests/block/block_checkpoint.move
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//# init -n dev

//# faucet --addr alice

//# run --signers alice
54 changes: 23 additions & 31 deletions sources/Block.move
Original file line number Diff line number Diff line change
Expand Up @@ -184,29 +184,21 @@ module Block {
public fun latest_state_root():(u64,vector<u8>) acquires Checkpoints{
let checkpoints = borrow_global<Checkpoints>(CoreAddresses::GENESIS_ADDRESS());
let len = Vector::length<Checkpoint>(&checkpoints.checkpoints);
let i = if(checkpoints.index == 0){
len
}else{
checkpoints.index - 1
};
while( i != checkpoints.index){
if( Option::is_some<vector<u8>>(&Vector::borrow(&checkpoints.checkpoints, i).state_root)) {
return (Vector::borrow(&checkpoints.checkpoints, i).block_number, *&Vector::borrow(&checkpoints.checkpoints, i).block_hash)
let i = checkpoints.index ;
while( i < len + checkpoints.index){
if( Option::is_some<vector<u8>>(&Vector::borrow(&checkpoints.checkpoints, i % len).state_root)) {
return (Vector::borrow(&checkpoints.checkpoints, i % len).block_number, *&Vector::borrow(&checkpoints.checkpoints, i % len).block_hash)
};

i = if( i == 0 ){
len
}else{
i - 1
};
i = i + 1;
};
abort Errors::invalid_state(ERROR_NO_HAVE_CHECKPOINT)
}


public fun update_state_root(account: &signer, header:vector<u8>) acquires Checkpoints{
CoreAddresses::assert_genesis_address(account);
header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000";
// header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000";

assert!(Vector::length<u8>(&header) == BLOCK_HEADER_LENGTH , Errors::invalid_argument(ERROR_NOT_BLOCK_HEADER));
let i = 1 ;
Expand All @@ -221,6 +213,16 @@ module Block {
Vector::push_back<u8>(&mut number_vec , *Vector::borrow<u8>(&header , i));
i = i + 1;
};
let number: u128 = 0;
let offset = 0;
let i = 0;
while (i < 8) {
let byte = *Vector::borrow(&number_vec, offset + i);
let s = (i as u8) * 8;
number = number + ((byte as u128) << s);
i = i + 1;
};

let state_root = Vector::empty<u8>();
i = 133;
while(i < 165){
Expand All @@ -230,26 +232,16 @@ module Block {

let checkpoints = borrow_global_mut<Checkpoints>(CoreAddresses::GENESIS_ADDRESS());
let len = Vector::length<Checkpoint>(&checkpoints.checkpoints);
let i = if(checkpoints.index == 0){
len
}else{
checkpoints.index - 1
};
while( i != checkpoints.index){
if( &Vector::borrow(&mut checkpoints.checkpoints, i).block_hash == &block_hash ) {
Vector::borrow_mut(&mut checkpoints.checkpoints, i).block_number = 1;
let stro = &mut Vector::borrow_mut(&mut checkpoints.checkpoints, i).state_root;

*Option::borrow_mut<vector<u8>>( stro) = state_root;
let i = checkpoints.index ;
while( i < len + checkpoints.index){
if( &Vector::borrow(&mut checkpoints.checkpoints, i % len).block_hash == &block_hash ) {
Vector::borrow_mut(&mut checkpoints.checkpoints, i % len).block_number = (number as u64 );
*Option::borrow_mut<vector<u8>>( &mut Vector::borrow_mut(&mut checkpoints.checkpoints, i % len).state_root) = state_root;
return
};

i = if( i == 0 ){
len
}else{
i - 1
};
i = i + 1 ;
};

abort Errors::invalid_state(ERROR_NO_HAVE_CHECKPOINT)
}
}
Expand Down

0 comments on commit 8e60a05

Please sign in to comment.