7 "golang.org/x/crypto/sha3"
13 func opSha256(vm *virtualMachine) error {
14 return doHash(vm, sha256.New)
17 func opSha3(vm *virtualMachine) error {
18 return doHash(vm, sha3.New256)
21 func doHash(vm *virtualMachine, hashFactory func() hash.Hash) error {
22 x, err := vm.pop(false)
30 err = vm.applyCost(cost)
39 return vm.push(h.Sum(nil), false)
42 func opCheckSig(vm *virtualMachine) error {
43 err := vm.applyCost(1024)
47 pubkeyBytes, err := vm.pop(true)
51 msg, err := vm.pop(true)
55 sig, err := vm.pop(true)
62 if len(pubkeyBytes) != ed25519.PublicKeySize {
63 return vm.pushBool(false, true)
65 return vm.pushBool(ed25519.Verify(ed25519.PublicKey(pubkeyBytes), msg, sig), true)
68 func opCheckMultiSig(vm *virtualMachine) error {
69 numPubkeys, err := vm.popInt64(true)
73 pubCost, ok := checked.MulInt64(numPubkeys, 1024)
74 if numPubkeys < 0 || !ok {
77 err = vm.applyCost(pubCost)
81 numSigs, err := vm.popInt64(true)
85 if numSigs < 0 || numSigs > numPubkeys || (numPubkeys > 0 && numSigs == 0) {
88 pubkeyByteses := make([][]byte, 0, numPubkeys)
89 for i := int64(0); i < numPubkeys; i++ {
90 pubkeyBytes, err := vm.pop(true)
94 pubkeyByteses = append(pubkeyByteses, pubkeyBytes)
96 msg, err := vm.pop(true)
103 sigs := make([][]byte, 0, numSigs)
104 for i := int64(0); i < numSigs; i++ {
105 sig, err := vm.pop(true)
109 sigs = append(sigs, sig)
112 pubkeys := make([]ed25519.PublicKey, 0, numPubkeys)
113 for _, p := range pubkeyByteses {
114 if len(p) != ed25519.PublicKeySize {
115 return vm.pushBool(false, true)
117 pubkeys = append(pubkeys, ed25519.PublicKey(p))
120 for len(sigs) > 0 && len(pubkeys) > 0 {
121 if ed25519.Verify(pubkeys[0], msg, sigs[0]) {
124 pubkeys = pubkeys[1:]
126 return vm.pushBool(len(sigs) == 0, true)
129 func opTxSigHash(vm *virtualMachine) error {
130 err := vm.applyCost(256)
134 if vm.context.TxSigHash == nil {
137 return vm.push(vm.context.TxSigHash(), false)
140 func opBlockHash(vm *virtualMachine) error {
141 err := vm.applyCost(1)
145 if vm.context.BlockHash == nil {
148 return vm.push(*vm.context.BlockHash, false)