OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / protocol / vm / pushdata.go
1 package vm
2
3 import "encoding/binary"
4
5 func opFalse(vm *virtualMachine) error {
6         err := vm.applyCost(1)
7         if err != nil {
8                 return err
9         }
10         return vm.pushBool(false, false)
11 }
12
13 func opPushdata(vm *virtualMachine) error {
14         err := vm.applyCost(1)
15         if err != nil {
16                 return err
17         }
18         d := make([]byte, len(vm.data))
19         copy(d, vm.data)
20         return vm.push(d, false)
21 }
22
23 func op1Negate(vm *virtualMachine) error {
24         err := vm.applyCost(1)
25         if err != nil {
26                 return err
27         }
28         return vm.pushInt64(-1, false)
29 }
30
31 func opNop(vm *virtualMachine) error {
32         return vm.applyCost(1)
33 }
34
35 func PushdataBytes(in []byte) []byte {
36         l := len(in)
37         if l == 0 {
38                 return []byte{byte(OP_0)}
39         }
40         if l <= 75 {
41                 return append([]byte{byte(OP_DATA_1) + uint8(l) - 1}, in...)
42         }
43         if l < 1<<8 {
44                 return append([]byte{byte(OP_PUSHDATA1), uint8(l)}, in...)
45         }
46         if l < 1<<16 {
47                 var b [2]byte
48                 binary.LittleEndian.PutUint16(b[:], uint16(l))
49                 return append([]byte{byte(OP_PUSHDATA2), b[0], b[1]}, in...)
50         }
51         var b [4]byte
52         binary.LittleEndian.PutUint32(b[:], uint32(l))
53         return append([]byte{byte(OP_PUSHDATA4), b[0], b[1], b[2], b[3]}, in...)
54 }
55
56 func PushdataInt64(n int64) []byte {
57         if n == 0 {
58                 return []byte{byte(OP_0)}
59         }
60         if n >= 1 && n <= 16 {
61                 return []byte{uint8(OP_1) + uint8(n) - 1}
62         }
63         return PushdataBytes(Int64Bytes(n))
64 }