Imported from CityOfZion/neo-storm (c0ee185a7cfd2c222fb7b4c8ca19885844d53855).
This commit is contained in:
Anthony De Meulemeester 2018-08-23 10:17:42 +02:00 committed by Roman Khimov
parent b997eeb051
commit f14833893c
4 changed files with 12 additions and 28 deletions

View file

@ -4,6 +4,7 @@ import (
"github.com/CityOfZion/neo-storm/interop/engine" "github.com/CityOfZion/neo-storm/interop/engine"
"github.com/CityOfZion/neo-storm/interop/runtime" "github.com/CityOfZion/neo-storm/interop/runtime"
"github.com/CityOfZion/neo-storm/interop/storage" "github.com/CityOfZion/neo-storm/interop/storage"
"github.com/CityOfZion/neo-storm/interop/util"
) )
// Token holds all token info // Token holds all token info
@ -81,35 +82,16 @@ func (t Token) CanTransfer(ctx storage.Context, from []byte, to []byte, amount i
// IsUsableAddress checks if the sender is either the correct NEO address or SC address // IsUsableAddress checks if the sender is either the correct NEO address or SC address
func IsUsableAddress(addr []byte) bool { func IsUsableAddress(addr []byte) bool {
if len(addr) == 20 { if len(addr) == 20 {
if runtime.CheckWitness(addr) { if runtime.CheckWitness(addr) {
return true return true
} }
// Check if a smart contract is calling scripthash // Check if a smart contract is calling scripthash
callingScriptHash := engine.GetCallingScriptHash() callingScriptHash := engine.GetCallingScriptHash()
if EqualAddresses(callingScriptHash, addr) { if util.CompareBytes(callingScriptHash, addr) {
return true return true
} }
} }
return false return false
} }
// EqualAddresses compares two addresses if they're equal
// also returns false if one of the two - or both - aren't actual addresses
func EqualAddresses(a []byte, b []byte) bool {
aLen := len(a)
bLen := len(b)
if aLen != bLen || aLen != 20 || bLen != 20 {
return false
}
for i := 0; i < aLen; i++ {
if a[i] != b[i] {
return false
}
}
return true
}

View file

@ -4,3 +4,9 @@ package util
func FromAddress(address string) []byte { func FromAddress(address string) []byte {
return nil return nil
} }
// CompareBytes compares a with b and will return true whether a and b
// are equal.
func CompareBytes(a, b []byte) bool {
return false
}

View file

@ -13,14 +13,8 @@ var (
// Go language builtin functions and custom builtin utility functions. // Go language builtin functions and custom builtin utility functions.
builtinFuncs = []string{ builtinFuncs = []string{
"len", "append", "SHA256", "len", "append", "SHA256",
"SHA1", "Hash256", "Hash160", "FromAddress", "SHA1", "Hash256", "Hash160",
} "FromAddress", "CompareBytes",
// VM system calls that have no return value.
noRetSyscalls = []string{
"Notify", "Log", "Put", "Register", "Delete",
"SetVotes", "ContractDestroy", "MerkleRoot", "Hash",
"PrevHash", "GetHeader",
} }
) )

View file

@ -571,6 +571,8 @@ func (c *codegen) convertBuiltin(expr *ast.CallExpr) {
emitOpcode(c.prog, vm.HASH256) emitOpcode(c.prog, vm.HASH256)
case "Hash160": case "Hash160":
emitOpcode(c.prog, vm.HASH160) emitOpcode(c.prog, vm.HASH160)
case "CompareBytes":
emitOpcode(c.prog, vm.EQUAL)
case "FromAddress": case "FromAddress":
// We can be sure that this is a ast.BasicLit just containing a simple // We can be sure that this is a ast.BasicLit just containing a simple
// address string. Note that the string returned from calling Value will // address string. Note that the string returned from calling Value will