| 
									
										
										
										
											2017-11-13 22:04:53 +01:00
										 |  |  | // Copyright 2017 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 19:01:22 +02:00
										 |  |  | package vm | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 17:15:37 +02:00
										 |  |  | import ( | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/crypto" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-06-03 19:01:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestJumpDestAnalysis(t *testing.T) { | 
					
						
							|  |  |  | 	tests := []struct { | 
					
						
							|  |  |  | 		code  []byte | 
					
						
							|  |  |  | 		exp   byte | 
					
						
							|  |  |  | 		which int | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0x40, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0x50, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1}, | 
					
						
							|  |  |  | 		{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0x03, 0}, | 
					
						
							|  |  |  | 		{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1}, | 
					
						
							|  |  |  | 		{[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0}, | 
					
						
							|  |  |  | 		{[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0x7f, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0xA0, 1}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH32)}, 0x7F, 0}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH32)}, 0xFF, 1}, | 
					
						
							|  |  |  | 		{[]byte{byte(PUSH32)}, 0xFF, 2}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, test := range tests { | 
					
						
							| 
									
										
										
										
											2017-09-08 12:47:44 +02:00
										 |  |  | 		ret := codeBitmap(test.code) | 
					
						
							| 
									
										
										
										
											2017-06-03 19:01:22 +02:00
										 |  |  | 		if ret[test.which] != test.exp { | 
					
						
							|  |  |  | 			t.Fatalf("expected %x, got %02x", test.exp, ret[test.which]) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-04 17:15:37 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-03 19:01:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 17:15:37 +02:00
										 |  |  | func BenchmarkJumpdestAnalysis_1200k(bench *testing.B) { | 
					
						
							|  |  |  | 	// 1.4 ms | 
					
						
							|  |  |  | 	code := make([]byte, 1200000) | 
					
						
							|  |  |  | 	bench.ResetTimer() | 
					
						
							|  |  |  | 	for i := 0; i < bench.N; i++ { | 
					
						
							|  |  |  | 		codeBitmap(code) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	bench.StopTimer() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | func BenchmarkJumpdestHashing_1200k(bench *testing.B) { | 
					
						
							|  |  |  | 	// 4 ms | 
					
						
							|  |  |  | 	code := make([]byte, 1200000) | 
					
						
							|  |  |  | 	bench.ResetTimer() | 
					
						
							|  |  |  | 	for i := 0; i < bench.N; i++ { | 
					
						
							|  |  |  | 		crypto.Keccak256Hash(code) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	bench.StopTimer() | 
					
						
							| 
									
										
										
										
											2017-06-03 19:01:22 +02:00
										 |  |  | } |