7 "golang.org/x/crypto/sha3"
9 "github.com/bytom/crypto"
10 "github.com/bytom/crypto/ed25519"
11 "github.com/bytom/crypto/sm3"
12 "github.com/bytom/math/checked"
15 func opSha256(vm *virtualMachine) error {
16 return doHash(vm, sha256.New)
19 func opSha3(vm *virtualMachine) error {
20 return doHash(vm, sha3.New256)
23 func doHash(vm *virtualMachine, hashFactory func() hash.Hash) error {
24 x, err := vm.pop(false)
32 err = vm.applyCost(cost)
41 return vm.push(h.Sum(nil), false)
44 func opCheckSig(vm *virtualMachine) error {
45 err := vm.applyCost(1024)
49 pubkeyBytes, err := vm.pop(true)
53 msg, err := vm.pop(true)
57 sig, err := vm.pop(true)
64 if len(pubkeyBytes) != ed25519.PublicKeySize {
65 return vm.pushBool(false, true)
67 return vm.pushBool(ed25519.Verify(ed25519.PublicKey(pubkeyBytes), msg, sig), true)
70 func opCheckMultiSig(vm *virtualMachine) error {
71 numPubkeys, err := vm.popInt64(true)
75 pubCost, ok := checked.MulInt64(numPubkeys, 1024)
76 if numPubkeys < 0 || !ok {
79 err = vm.applyCost(pubCost)
83 numSigs, err := vm.popInt64(true)
87 if numSigs < 0 || numSigs > numPubkeys || (numPubkeys > 0 && numSigs == 0) {
90 pubkeyByteses := make([][]byte, 0, numPubkeys)
91 for i := int64(0); i < numPubkeys; i++ {
92 pubkeyBytes, err := vm.pop(true)
96 pubkeyByteses = append(pubkeyByteses, pubkeyBytes)
98 msg, err := vm.pop(true)
105 sigs := make([][]byte, 0, numSigs)
106 for i := int64(0); i < numSigs; i++ {
107 sig, err := vm.pop(true)
111 sigs = append(sigs, sig)
114 pubkeys := make([]ed25519.PublicKey, 0, numPubkeys)
115 for _, p := range pubkeyByteses {
116 if len(p) != ed25519.PublicKeySize {
117 return vm.pushBool(false, true)
119 pubkeys = append(pubkeys, ed25519.PublicKey(p))
122 for len(sigs) > 0 && len(pubkeys) > 0 {
123 if ed25519.Verify(pubkeys[0], msg, sigs[0]) {
126 pubkeys = pubkeys[1:]
128 return vm.pushBool(len(sigs) == 0, true)
131 func opTxSigHash(vm *virtualMachine) error {
132 err := vm.applyCost(256)
136 if vm.context.TxSigHash == nil {
139 return vm.push(vm.context.TxSigHash(), false)
142 func opHash160(vm *virtualMachine) error {
143 data, err := vm.pop(false)
148 cost := int64(len(data) + 64)
149 if err = vm.applyCost(cost); err != nil {
153 return vm.push(crypto.Ripemd160(data), false)
156 func opSm3(vm *virtualMachine) error {
157 return doHash(vm, sm3.New)