1#!/usr/bin/env python3 2 3from test_framework.test_framework import BitcoinTestFramework 4from test_framework.util import * 5from test_framework.script import * 6from test_framework.mininode import * 7from test_framework.address import * 8 9class QtumGlobalsStateChangerTest(BitcoinTestFramework): 10 def set_test_params(self): 11 self.setup_clean_chain = True 12 self.num_nodes = 1 13 14 def skip_test_if_missing_module(self): 15 self.skip_if_no_wallet() 16 17 def run_test(self): 18 self.node = self.nodes[0] 19 self.nodes[0].generate(10 + COINBASE_MATURITY) 20 21 """ 22 pragma solidity ^0.4.12; 23 24 contract Test { 25 uint public stateChanger; 26 27 function blkblockhash() payable { 28 stateChanger = uint(block.blockhash(block.number-1)); 29 } 30 31 function blkcoinbase() payable { 32 stateChanger = uint(block.coinbase); 33 } 34 35 function blkdifficulty() payable { 36 stateChanger = block.difficulty; 37 } 38 39 function blkgaslimit() payable { 40 stateChanger = block.gaslimit; 41 } 42 43 function blknumber() payable { 44 stateChanger = block.number; 45 } 46 47 function blktimestamp() payable { 48 stateChanger = block.timestamp; 49 } 50 } 51 73c9330d blkblockhash() 52 5facaf8e blkcoinbase() 53 009e8657 blkdifficulty() 54 49b573d4 blkgaslimit() 55 6bde2d73 blknumber() 56 c1a5257b blktimestamp() 57 6c7804b5 stateChanger() 58 """ 59 contract_bytecode = "6060604052341561000f57600080fd5b5b6101738061001f6000396000f30060606040523615610080576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680629e86571461008557806349b573d41461008f5780635facaf8e146100995780636bde2d73146100a35780636c7804b5146100ad57806373c9330d146100d6578063c1a5257b146100e0575b600080fd5b61008d6100ea565b005b6100976100f4565b005b6100a16100fe565b005b6100ab61011e565b005b34156100b857600080fd5b6100c0610128565b6040518082815260200191505060405180910390f35b6100de61012e565b005b6100e861013d565b005b446000819055505b565b456000819055505b565b4173ffffffffffffffffffffffffffffffffffffffff166000819055505b565b436000819055505b565b60005481565b4340600190046000819055505b565b426000819055505b5600a165627a7a72305820a4033d29ccf12dc58fda987b64dec57272d205023628eb3be8ba613585453d770029" 60 contract_address = self.nodes[0].createcontract(contract_bytecode)['address'] 61 self.node.generate(1) 62 63 print("State change based on block.blockhash") 64 block_count = self.node.getblockcount() 65 self.node.sendtocontract(contract_address, "73c9330d", 0, 1000000) 66 self.node.generate(1) 67 assert_equal(self.node.getblockcount(), block_count+1) 68 69 print("State change based on block.coinbase") 70 block_count = self.node.getblockcount() 71 self.node.sendtocontract(contract_address, "5facaf8e", 0, 1000000) 72 self.node.generate(1) 73 assert_equal(self.node.getblockcount(), block_count+1) 74 75 print("State change based on block.difficulty") 76 block_count = self.node.getblockcount() 77 self.node.sendtocontract(contract_address, "009e8657", 0, 1000000) 78 self.node.generate(1) 79 assert_equal(self.node.getblockcount(), block_count+1) 80 81 print("State change based on block.gaslimit") 82 block_count = self.node.getblockcount() 83 self.node.sendtocontract(contract_address, "49b573d4", 0, 1000000) 84 self.node.generate(1) 85 assert_equal(self.node.getblockcount(), block_count+1) 86 87 print("State change based on block.number") 88 block_count = self.node.getblockcount() 89 self.node.sendtocontract(contract_address, "6bde2d73", 0, 1000000) 90 self.node.generate(1) 91 assert_equal(self.node.getblockcount(), block_count+1) 92 93 print("State change based on block.timestamp") 94 block_count = self.node.getblockcount() 95 self.node.sendtocontract(contract_address, "c1a5257b", 0, 1000000) 96 self.node.generate(1) 97 assert_equal(self.node.getblockcount(), block_count+1) 98 99if __name__ == '__main__': 100 QtumGlobalsStateChangerTest().main() 101