github.com/deroproject/derosuite@v2.1.6-1.0.20200307070847-0f2e589c7a2b+incompatible/blockchain/inputmaturity/inputmaturity.go (about) 1 // Copyright 2017-2018 DERO Project. All rights reserved. 2 // Use of this source code in any form is governed by RESEARCH license. 3 // license can be found in the LICENSE file. 4 // GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8 5 // 6 // 7 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 8 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 9 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 10 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 11 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 12 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 13 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 14 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 15 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 16 17 package inputmaturity 18 19 import "time" 20 import "github.com/deroproject/derosuite/config" 21 22 //this file implements the logic to detect whether an input is mature or still locked 23 //This function is crucial as any bugs can have catastrophic effects 24 //this function is used both by the core blockchain and wallet 25 //TODO we need to check the edge cases 26 func Is_Input_Mature(current_chain_height uint64, input_block_height uint64, locked_to_height uint64, sigtype uint64) bool { 27 28 // current_chain_height must be greater or equal to input height 29 if current_chain_height < input_block_height { // wrong cases reject 30 return false 31 } 32 33 // all miner txs end up here 34 if sigtype == 0 { // miner tx will also always unlock 60 blocks in future 35 if current_chain_height >= (input_block_height + config.MINER_TX_AMOUNT_UNLOCK) { 36 return true 37 } 38 return false 39 } 40 41 // 99.99 % normal tx cases come here 42 if locked_to_height == 0 { // input is not locked, so it must be unlocked in 8 blocks 43 if current_chain_height >= (input_block_height + (config.NORMAL_TX_AMOUNT_UNLOCK)) { 44 return true 45 } 46 return false 47 } 48 49 // input_block_height is no longer useful 50 51 // if we are here input was locked to specific height or time 52 if locked_to_height < config.CRYPTONOTE_MAX_BLOCK_NUMBER { // input was locked to specific block height 53 if current_chain_height >= locked_to_height { 54 return true 55 } 56 return false 57 } 58 59 // anything above LIMIT is time based lock 60 // input was locked to specific time in epoch 61 if locked_to_height < (uint64(time.Now().UTC().Unix())) { 62 return true 63 } 64 65 return false // reject time based locks if not mature 66 }