美文网首页
eth钱包开发(nodejs)(一)

eth钱包开发(nodejs)(一)

作者: zachary_lee726 | 来源:发表于2018-12-05 18:14 被阅读0次

    使用bip39通过助记词生成钱包

    /**
     * bip39 and wallet
     */
    const bip39 = require('bip39');
    const HDKey = require('ethereumjs-wallet/hdkey');
    
    /**
     * 派生子账户
     * @param id
     */
    const getChildKey = (id) => {
        const seed = bip39.mnemonicToSeed(mainMne);
        const masterKey = HDKey.fromMasterSeed(seed);
        return masterKey.derivePath("m/44'/60'/0'/0/" + id);
    };
    
    /**
     * 获取eth地址
     * @param id
     * @returns {*}
     */
    const getAddress = (id) => {
        const childKey = getChildKey(id);
        return childKey.getWallet().getAddressString();
    
    };
    
    /**
     * 获取eth私钥
     * @param id
     * @returns {*}
     */
    const getPrivateKey = (id) => {
        const childKey = getChildKey(id);
        return childKey.getWallet().getPrivateKeyString();
    };
    
    

    使用web3.js进行离线签名转账

    /**
     * service层
     */
    const userService = require('../service/users');
    
    /**
     * web3 and contract
     */
    const web3 = require('./web3Util');
    const contract = require('../contracts/contract');
    
    //token合约地址
    const contractAddress = require('../contracts/address/index');
    const EthereumTx = require('ethereumjs-tx');
    
    /**
     * 进行离线签名交易
     * @param uid
     * @param desAddress
     * @param value  eth数量
     * @param tokenValue  token数量
     * @returns {Promise<void>}
     */
    const sendEthTransaction = async (uid, desAddress, value, tokenValue) => {
    
        //获取数据库对象
        const findUser = await userService.findById(uid);
    
        //获取私钥
        const privateKeyString = decodePrivateKey(findUser.ethPrivateKey).substring(2);
        const privateKey = Buffer.from(privateKeyString, 'hex');
    
        //iValue 转账金额
        let dataAbi = "";
        let iValue;
        let toAddress;
        let gasLimit;
        if(tokenValue !== 0 && tokenValue !=="0") {
            //获取转账数据abi
            dataAbi = contract.methods.transfer(desAddress, tokenValue.toString()).encodeABI();
            logger.debug("data:" + dataAbi);
            iValue = 0;
            toAddress = contractAddress;
            gasLimit = await contract.methods.transfer(desAddress, tokenValue.toString()).estimateGas({from: findUser.ethAddress});
    
        } else {
            iValue = parseInt(value);
            toAddress = desAddress;
            gasLimit = 21000;
        }
    
        //gas
        const gasPrice = await web3.eth.getGasPrice();
    
        logger.debug("gasLimit: " + gasLimit);
    
        //nonce
        let nonce = await web3.eth.getTransactionCount(findUser.ethAddress, "pending");
        logger.debug("nonce: " + nonce);
    
        const txParams = {
            nonce: toHex(nonce),
            gasPrice: toHex(gasPrice * gasPriceFactor),
            gasLimit: toHex(gasLimit),
            to: toAddress,
            value: toHex(iValue),
            data: dataAbi,
            chainId: chainId
        };
    
        const tx = new EthereumTx(txParams);
        tx.sign(privateKey);
        const serializedTx = tx.serialize();
    
        const block = await web3.eth.sendSignedTransaction(toHex(serializedTx));
        logger.debug(block.transactionHash);
    
        return block;
    };
    

    tips: sendEthTransaction方法将eth转账和token转账合并,转账eth时将tokenValue赋值为0,转账token时将value赋值为0即可

    相关文章

      网友评论

          本文标题:eth钱包开发(nodejs)(一)

          本文链接:https://www.haomeiwen.com/subject/njtrzftx.html