当前位置:   article > 正文

本地链使用web3js发送签名交易_web3j 设置chainid

web3j 设置chainid

这是我查阅了网上教程和参考同学文章,自己动手调好的一个例子,探究的过程也是坑坑洼洼。话不多说,咱们实用派直接上代码。

转账签名交易

  1. const Tx = require('ethereumjs-tx');
  2. const Web3 = require('web3');
  3. const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
  4. // const web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'));
  5. var privateKey = Buffer.from('b87957c8f12546ce1aef1840a91144d5618dc5b75bc31613f201f00e73eebb8e', 'hex')
  6. var _from = '0xf0fd5854ebaee2652a8250bdb2933334a3dc73b1';
  7. console.log("web3-version==> ", Web3.version);
  8. web3.eth.net.getId().then((chainId)=>{
  9. console.log("chainId==> ", chainId);
  10. });
  11. web3.eth.getTransactionCount(_from, (error, txCount)=> {
  12. var rawTx = {
  13. chainId: 4224,
  14. nonce: web3.utils.toHex(txCount),
  15. gasPrice: '0x09184e72a000', // 10000000000000
  16. gasLimit: web3.utils.toHex(21000),
  17. // from: '0xF0fD5854eBaeE2652a8250Bdb2933334A3DC73b1', // accounts[0]
  18. to: '0x7efdc95699fa8b842462912d0c90bd9b726d5040', // accounts[1]
  19. // Please pass numbers as strings or BN objects to avoid precision errors.
  20. value: web3.utils.toHex(web3.utils.toWei('3', 'ether')),
  21. // data: '0x'
  22. }
  23. var tx = new Tx(rawTx);
  24. tx.sign(privateKey);
  25. var serializedTx = tx.serialize();
  26. console.log("serializedTx==> ", serializedTx.toString('hex'));
  27. // 注意web3版本: eth_sendRawTransaction | eth.sendSignedTransaction
  28. web3.eth.sendSignedTransaction(
  29. '0x'+ serializedTx.toString('hex')).on('receipt',console.log);
  30. });

注意一下web3js有两个版本,web3js0.2 web3js1.0 ,1.0以上版本中sendRawTransaction函数修改为eth.sendSignedTransaction了 。

安装依赖

web3.js:    npm install web3       (测试中我使用的是1.2.6,下同)

ethereumjs-tx  :  npm install ethereumjs-tx       (2.1.2)

读取帐户私钥

以上代码用web3js发送交易,但是交易签名时需要私钥,而私钥是加密存储在keystore文件里。为了方便大家测试,这里贴出一个我写好的程序代码,来获取geth中账户的私钥:

  1. var keythereum = require("keythereum");
  2. // 本地链安装目录(包含keystore文件夹的)
  3. var datadir = "E:\\blockChain\\privateNode";
  4. var address= "0xfBbe31cb73D23Ae79771157c2Bb7C45Cce7C1E18"; // accounts[0]
  5. const password = "12345"; // accounts[0] 账户解锁密码
  6. var keyObject = keythereum.importFromFile(address, datadir);
  7. var privateKey = keythereum.recover(password, keyObject);
  8. console.log(privateKey.toString('hex'));

这里用到了一个js库 keythereum    执行 npm install keythereum 安装。

或者使用web3提供的方法eth.accounts.decrypt():

  1. const Web3 = require('web3');
  2. const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
  3. console.log(web3.eth.accounts.decrypt({
  4. "id":"efe3a1f2-0a68-4a9c-ad4d-2ef92d913fa9",
  5. "version":3,
  6. "address":"f0fd5854ebaee2652a8250bdb2933334a3dc73b1",
  7. "crypto": {
  8. "cipher": "aes-128-ctr",
  9. "ciphertext": "cc18a4fe45a64716e63be280561b7942fe7533f42ab881df792e302d4a068f44",
  10. "cipherparams":{"iv":"bfa5179cb43526b7983d31c73fd32ad8"},
  11. "kdf":"scrypt",
  12. "kdfparams": {
  13. "dklen":32,
  14. "n":262144,
  15. "p":1,
  16. "r":8,
  17. "salt":"c1ffe7c6e05e76f06ac39cf3fc59c5003ccf372307029f0dd603f4850a52454f"
  18. },
  19. "mac":"348d0ad358a0283c8cd4b5ea3f0ca2e3f3d709aa77740f7a82e96a002eb6f0cf"
  20. }, // keystore文件夹中UTC文件(格式化一下)
  21. }, '12345')); // 对应账户解锁密码

找到本地链的安装目录,有个keystore目录,里面有已创建账户信息,我的如下:

最后再贴个运行结果看看:

 结语

可能其中还有尚待发现的问题和完善的代码逻辑,欢迎━(*`∀´*)ノ亻!各位博友们留言,希望与你们一同交流,一齐成长。还有一点感谢我的那位技术大牛同学(已实习了)曾经写的Web3-Js: ethereumjs-tx发送签名交易,有兴趣的小伙伴可以翻翻他的文章哦。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/647625
推荐阅读
相关标签
  

闽ICP备14008679号