From a9ae25c26e1f866229a7c7a743b0a47265d80cdf Mon Sep 17 00:00:00 2001 From: WGB5445 Date: Thu, 23 Jun 2022 09:21:09 +0800 Subject: [PATCH] optimization loop (#39) --- build/StarcoinFramework/BuildInfo.yaml | 2 +- .../bytecode_modules/Block.mv | Bin 2327 -> 2046 bytes build/StarcoinFramework/docs/Block.md | 54 ++++++++---------- .../StarcoinFramework/source_maps/Block.mvsm | Bin 17081 -> 17547 bytes integration-tests/block/block_checkpoint.move | 5 ++ sources/Block.move | 54 ++++++++---------- 6 files changed, 52 insertions(+), 63 deletions(-) create mode 100644 integration-tests/block/block_checkpoint.move diff --git a/build/StarcoinFramework/BuildInfo.yaml b/build/StarcoinFramework/BuildInfo.yaml index f261608f..7dcad3de 100644 --- a/build/StarcoinFramework/BuildInfo.yaml +++ b/build/StarcoinFramework/BuildInfo.yaml @@ -252,7 +252,7 @@ compiled_package_info: ? address: "0x00000000000000000000000000000001" name: YieldFarmingV2 : StarcoinFramework - source_digest: 8AF3F22BAB3F63C31F6D513CA5132834975CBE4A5EB4BC1BE1D56342A29EC843 + source_digest: D6FF543203F081039996FF7838A1D48623744E8A12F64AA3BD3524A8A3B339C7 build_flags: dev_mode: false test_mode: false diff --git a/build/StarcoinFramework/bytecode_modules/Block.mv b/build/StarcoinFramework/bytecode_modules/Block.mv index f5618084b59aaea6ee11f5fedfe9a26693238668..27789c5d25f5a3e603fa8e9e865ad0d3c66c5155 100644 GIT binary patch delta 613 zcmZ8eJx?1!5Z&3m-PxO+yYnUI0|&{GabbZ)5XM0p@gHa?+@z1v(jf|0sc52D2#E$7 zONas~@{h?+pyMZ??Aga*vCVwEd2eU;U4MAVet+7!1$>f^k-fr}nd6B5;g~P&Jtm9n z@6l(NO<>qgkt`^Z60KC>L?o45+`ze9wDeDye#>bnS&(RfH!MRG1p@)C(z34#J+9EI z)$!Phyj5MjzuuCCTN_Y?BrqUWr)1F13BV{X1_%N~XXr#8=d>%>&}G~oqBM|tl)!&Inbko-!rEbTr%qI zQ9alMcIGu_OV-%B>Z@aYnsNh@EyFIX$sQiqO-{*?{z~b7$u6+o*0cI3ye2chYMrHM zHg8nF>mNxrd&bS_Bz%wzA7qxkP>8{om||L`!Iuj?2QnE{y$&muPJVGJIHc03r!GO? h0l9HA;YB9fE_1JpP)9y#ON!U_i}jf^l~;e_jsNy&Fl+z- delta 856 zcmZ{gO-NKx6vywmAMeh)_r7tS%rI7lZ!9piPf~gb2GeLwU??*h)kcjF7qy7Kkgy>^ zs)b>UVA#hZ`hW;UimXk7i(1rHBCG_-jSLY%WJp7IMt$nSyE*rs^E>}@&p%r*SlGX@ z_!0079;Ut_9x$Hq5iCBNRjNX|N242_4McXt6=?*MXQZTA!Z z=D$BozT1&4?B4tSYRSuyZwtH69?Be?*>sx>JJDFIQeQI z)_61-&j~y2g(qvqTHd5TRea1ojm{^}(WzV5xf5!v>6n~2(9^fx^fmd>%s%Jh>8ZgV zW#UZ9uJa4O!(aI2C-&V7ZDVsYH?87Xn!K{I$O}L1gwzpRRAQxl34m)Tsv`;-%c>FL zXSSdUvG8JHxjU?oM2ZOQsOC$F!|HMhg19_DT_4%Ts=YT3%HEByOh&h&#ZsJ9y z0i%2=o5!Ta_IOx1tFmMs+o~m$(d(fad+cGgEN-bBmU3-TffW}#@0QSUja$dq2_Y0_ zt&4?~jj+VZ6lOkMN;=sf2wnifR8$d3c1o&!BYq=7F0mWnEw;$Gr~rp#9zU+{R9R9< v%e6vSn5(?(1J)0EI%5M`*wY9rCYdr>yX3&B9W29u5g-5^u-*_5K@|N5elmd? diff --git a/build/StarcoinFramework/docs/Block.md b/build/StarcoinFramework/docs/Block.md index c6f5137f..a999e203 100644 --- a/build/StarcoinFramework/docs/Block.md +++ b/build/StarcoinFramework/docs/Block.md @@ -588,21 +588,13 @@ Call at block prologue
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)
 }
@@ -629,7 +621,7 @@ Call at block prologue
 
 
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 ;
@@ -644,6 +636,16 @@ Call at block prologue
         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){
@@ -653,26 +655,16 @@ Call at block prologue
 
     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)
 }
 
diff --git a/build/StarcoinFramework/source_maps/Block.mvsm b/build/StarcoinFramework/source_maps/Block.mvsm index ee4c02d9971ec43240931c63b51f095308104dc6..6335792c7e3f68142b19e97e62266b4aa14ffd9b 100644 GIT binary patch literal 17547 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 diff --git a/integration-tests/block/block_checkpoint.move b/integration-tests/block/block_checkpoint.move new file mode 100644 index 00000000..c2220888 --- /dev/null +++ b/integration-tests/block/block_checkpoint.move @@ -0,0 +1,5 @@ +//# init -n dev + +//# faucet --addr alice + +//# run --signers alice diff --git a/sources/Block.move b/sources/Block.move index 7aafb018..494e5140 100644 --- a/sources/Block.move +++ b/sources/Block.move @@ -184,21 +184,13 @@ module Block { public fun latest_state_root():(u64,vector) acquires Checkpoints{ let checkpoints = borrow_global(CoreAddresses::GENESIS_ADDRESS()); let len = Vector::length(&checkpoints.checkpoints); - let i = if(checkpoints.index == 0){ - len - }else{ - checkpoints.index - 1 - }; - while( i != checkpoints.index){ - if( Option::is_some>(&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::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) } @@ -206,7 +198,7 @@ module Block { public fun update_state_root(account: &signer, header:vector) acquires Checkpoints{ CoreAddresses::assert_genesis_address(account); - header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000"; + // header = x"20b82a2c11f2df62bf87c2933d0281e5fe47ea94d5f0049eec1485b682df29529abf17ac7d79010000000000000000000000000000000000000000000000000001002043609d52fdf8e4a253c62dfe127d33c77e1fb4afdefb306d46ec42e21b9103ae20414343554d554c41544f525f504c414345484f4c4445525f48415348000000002061125a3ab755b993d72accfea741f8537104db8e022098154f3a66d5c23e828d00000000000000000000000000000000000000000000000000000000000000000000000000b1ec37207564db97ee270a6c1f2f73fbf517dc0777a6119b7460b7eae2890d1ce504537b010000000000000000"; assert!(Vector::length(&header) == BLOCK_HEADER_LENGTH , Errors::invalid_argument(ERROR_NOT_BLOCK_HEADER)); let i = 1 ; @@ -221,6 +213,16 @@ module Block { Vector::push_back(&mut number_vec , *Vector::borrow(&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(); i = 133; while(i < 165){ @@ -230,26 +232,16 @@ module Block { let checkpoints = borrow_global_mut(CoreAddresses::GENESIS_ADDRESS()); let len = Vector::length(&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>( 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>( &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) } }