以太坊ethereum 離線生成帳號,計算私鑰,進行簽名
阿新 • • 發佈:2019-02-10
<script src="dist/keythereum.js" type="text/javascript"></script> <script src="dist/bundle.js" type="text/javascript"></script> <script> function createAccount(){ var newAccountpwd = document.getElementById('createpwd').value; console.log( "密碼為:"+newAccountpwd); var params = { keyBytes: 32, ivBytes: 16 }; var dk = keythereum.create(params) var options = { kdf: "scrypt", cipher: "aes-128-ctr", kdfparams: { n:262144, r : 8, p : 1, dklen: 32 } }; var keyObject = keythereum.dump(newAccountpwd, dk.privateKey, dk.salt, dk.iv, options); document.getElementById('newcreate').innerHTML = JSON.stringify(keyObject); } function clean() { document.getElementById('signResult').innerHTML = ''; document.getElementById('signResulttest').innerHTML = ''; } function shuzuTo16Str(as){ var rtnStr = ''; for(j = 0,len=as.length; j < len; j++) { rtnStr += as[j].toString(16); } return '0x' + rtnStr; } const txDatatext = { from:'0x06EDaF5dC947b8409F4c26c8577Ed7290bF591e9', to:'0x7854C8a4DbC0AB7E639626db2db11A4bD7D59D9E', value: '0x8AC7230489E80000', nonce: 115, gas : "0x76c0", gasPrice: '0x9184e72a000' } function getSign(){ var privatekey = document.getElementById('private').innerHTML console.log("私鑰"+ privatekey); var Data = document.getElementById('signStr').value; var objData = JSON.parse(Data); let { sign, verify, unsign } = window.ethereumjs_tx_sign; var out = sign(objData,privatekey); var newout = JSON.parse(JSON.stringify(out)); var privatekey2 = document.getElementById('private').innerHTML; var testSign = sign(txDatatext,privatekey2); var newtestSign = JSON.parse(JSON.stringify(testSign)); //rawTx document.getElementById('signResult').innerHTML = newout.rawTx; document.getElementById('signResulttest').innerHTML = newtestSign.rawTx; } function getPrivate(){ var jsonStr = document.getElementById('jsonStr').value; console.log(jsonStr); var keyObject = JSON.parse(jsonStr); var pwd = document.getElementById('pwd').value; console.log(pwd); var privatekey = keythereum.recover(pwd,keyObject); var newKey = JSON.parse(JSON.stringify(privatekey)); document.getElementById('private').innerHTML = shuzuTo16Str(newKey.data) ; console.log(privatekey); } var options = { kdf: "scrypt", cipher: "aes-128-ctr", kdfparams: { dklen:32, n:262144, p:1, r:8, } }; </script> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <h2>賬號生成</h2> 輸入密碼: <input type="text" id="createpwd" /> <button type="button" onclick = "createAccount()" >生成賬號</button> <p id = 'newcreate'>生成賬號</p> <textarea id = "jsonStr" rows="10" cols="120"> {"address":"a983b670e3bce5aaf2ebc6643c8bca245c167cec","crypto":{"cipher":"aes-128-ctr","ciphertext":"d5576192b093f9e9dc02c066bfeaf024a7ecef2de8369a3c6c6a2c9da8d6d5b8","cipherparams":{"iv":"67129f36c72a3c19b8a931009bda1df8"},"mac":"b57200f427ea213cbf067ca77ffe9d1b14b4a0f5c20f4046ad7ceb33fc9e388a","kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"r":8,"p":1,"salt":"af6e63ec4abf6cc80d836ff6e611ca0c6e5dedda9d96bbc5ab7bc458b993fbe6"}},"id":"530089f1-618c-41c3-a480-a2affc8a74b3","version":3} </textarea> </br> 輸入密碼: <input type="text" id="pwd" /> <button type="button" onclick = "getPrivate()" >獲取到私鑰</button>(會進行計算一段時間,密碼錯誤會報錯) 私鑰為 :<h2 id = "private"></h2> <textarea id = "signStr" rows="10" cols="120"> {"from":"0xa983b670e3bce5aaf2ebc6643c8bca245c167cec", "to":"0x7854C8a4DbC0AB7E639626db2db11A4bD7D59D9E", "value": "0x8AC7230489E80000", "nonce": 115, "gas" : "0x76c0", "gasPrice": "0x9184e72a000" } </textarea> </br> <button type="button" onclick = "getSign()" >進行簽名</button> <button type="button" onclick = "clean()" >重置簽名結果</button> (簽名之前需要先計算出私鑰) 呼叫geth sendRawTransaction 的時候 注意獲取到nonce <h2 id = "signResult">簽名結果</h2> </br> <h2 id = "signResulttest">簽名結果比對</h2>
測試程式碼如上(測試環境chrome):
主要使用的為兩個js檔案(從github下載)
由於不是太明白js和nodejs的區別 許多js方法使用有一定問題,望高手解答疑問。