diff --git a/account/manager_test.go b/account/manager_test.go index d580c1a9e..8b172a477 100644 --- a/account/manager_test.go +++ b/account/manager_test.go @@ -19,7 +19,10 @@ package account import ( + "crypto/md5" + "fmt" "testing" + "time" "os" @@ -252,6 +255,18 @@ func TestForCryptoJS(t *testing.T) { input: "Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem.", output: "4236aa9974eb7b9ddb0f7a7ed06d4bf3d9c0e386", }, + + { + method: "md5", + input: "Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem.", + output: "9954125a33a380c3117269cff93f76a7", + }, + + { + method: "base64", + input: "Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem.", + output: "TmVidWxhcyBpcyBhIG5leHQgZ2VuZXJhdGlvbiBwdWJsaWMgYmxvY2tjaGFpbiwgYWltaW5nIGZvciBhIGNvbnRpbnVvdXNseSBpbXByb3ZpbmcgZWNvc3lzdGVtLg==", + }, } for _, tt := range tests { @@ -264,6 +279,11 @@ func TestForCryptoJS(t *testing.T) { out = byteutils.Hex(hash.Sha3256([]byte(tt.input))) case "ripemd160": out = byteutils.Hex(hash.Ripemd160([]byte(tt.input))) + case "md5": + r := md5.Sum([]byte(tt.input)) + out = byteutils.Hex(r[:]) + case "base64": + out = string(hash.Base64Encode([]byte(tt.input))) } assert.Equal(t, tt.output, out) }) @@ -305,3 +325,65 @@ func TestForCryptoJS(t *testing.T) { err = os.Remove(acc.path) assert.Nil(t, err) } +func TestCryptoPerformance(t *testing.T) { + // test sha256 + start := time.Now() + out := "" + for i := 0; i < 1000; i++ { + out = byteutils.Hex(hash.Sha256([]byte("Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem."))) + } + cost := time.Now().Sub(start).Nanoseconds() + fmt.Println("sha256", out, cost) + + // test md5 + start = time.Now() + for i := 0; i < 1000; i++ { + r := md5.Sum([]byte("Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem.")) + out = byteutils.Hex(r[:]) + } + cost = time.Now().Sub(start).Nanoseconds() + fmt.Println("md5", out, cost) + + // test recover address + + manager, _ := NewManager(nil) + addr, err := manager.NewAccount([]byte("passphrase")) + assert.Nil(t, err, "new address err") + err = manager.Unlock(addr, []byte("passphrase"), keystore.DefaultUnlockDuration) + assert.Nil(t, err, "unlock err") + key, err := manager.ks.GetUnlocked(addr.String()) + assert.Nil(t, err, "get key err") + + signature, err := crypto.NewSignature(1) + assert.Nil(t, err, "get signature err") + + err = signature.InitSign(key.(keystore.PrivateKey)) + assert.Nil(t, err, "init signature err") + + data := hash.Sha3256([]byte("Nebulas is a next generation public blockchain, aiming for a continuously improving ecosystem.")) + assert.Equal(t, "564733f9f3e139b925cfb1e7e50ba8581e9107b13e4213f2e4708d9c284be75b", byteutils.Hex(data)) + signData, err := signature.Sign(data) + assert.Nil(t, err, "sign data err") + signHex := byteutils.Hex(signData) + + // recover + rb, err := byteutils.FromHex(signHex) + assert.Nil(t, err, "from hex error") + rAddr, err := core.RecoverSignerFromSignature(keystore.Algorithm(1), data, rb) + start = time.Now() + for i := 0; i < 1000; i++ { + core.RecoverSignerFromSignature(keystore.Algorithm(1), data, rb) + } + cost = time.Now().Sub(start).Nanoseconds() + fmt.Println("recoverAddress", rAddr.String(), cost) + + assert.Nil(t, err, "recover err") + assert.Equal(t, addr.String(), rAddr.String()) + + acc, err := manager.getAccount(addr) + assert.Nil(t, err, "get acc err") + err = manager.Remove(addr, []byte("passphrase")) + assert.Nil(t, err) + err = os.Remove(acc.path) + assert.Nil(t, err) +} diff --git a/nf/nvm/crypto.go b/nf/nvm/crypto.go index d8818cc03..9abe6e1d6 100644 --- a/nf/nvm/crypto.go +++ b/nf/nvm/crypto.go @@ -35,7 +35,7 @@ import ( //export Sha256Func func Sha256Func(data *C.char, gasCnt *C.size_t) *C.char { s := C.GoString(data) - *gasCnt = C.size_t(len(s) * 100) + *gasCnt = C.size_t(len(s) + 20000) r := hash.Sha256([]byte(s)) return C.CString(byteutils.Hex(r)) @@ -45,7 +45,7 @@ func Sha256Func(data *C.char, gasCnt *C.size_t) *C.char { //export Sha3256Func func Sha3256Func(data *C.char, gasCnt *C.size_t) *C.char { s := C.GoString(data) - *gasCnt = C.size_t(len(s) * 100) + *gasCnt = C.size_t(len(s) + 20000) r := hash.Sha3256([]byte(s)) return C.CString(byteutils.Hex(r)) @@ -55,7 +55,7 @@ func Sha3256Func(data *C.char, gasCnt *C.size_t) *C.char { //export Ripemd160Func func Ripemd160Func(data *C.char, gasCnt *C.size_t) *C.char { s := C.GoString(data) - *gasCnt = C.size_t(len(s) * 100) + *gasCnt = C.size_t(len(s) + 20000) r := hash.Ripemd160([]byte(s)) return C.CString(byteutils.Hex(r)) @@ -67,7 +67,7 @@ func RecoverAddressFunc(alg int, data, sign *C.char, gasCnt *C.size_t) *C.char { d := C.GoString(data) s := C.GoString(sign) - *gasCnt = C.size_t(1000) + *gasCnt = C.size_t(20000) plain, err := byteutils.FromHex(d) if err != nil { @@ -107,7 +107,7 @@ func RecoverAddressFunc(alg int, data, sign *C.char, gasCnt *C.size_t) *C.char { //export Md5Func func Md5Func(data *C.char, gasCnt *C.size_t) *C.char { s := C.GoString(data) - *gasCnt = C.size_t(len(s) * 100) + *gasCnt = C.size_t(len(s) + 6000) r := md5.Sum([]byte(s)) return C.CString(byteutils.Hex(r[:])) @@ -117,7 +117,7 @@ func Md5Func(data *C.char, gasCnt *C.size_t) *C.char { //export Base64Func func Base64Func(data *C.char, gasCnt *C.size_t) *C.char { s := C.GoString(data) - *gasCnt = C.size_t(1000 + len(s)) + *gasCnt = C.size_t(len(s) + 3000) r := hash.Base64Encode([]byte(s)) return C.CString(string(r))