1. 常见web3对象用法示例:

     /// 创建 web3 对象实例
     var Web3 = require("web3")
     var web3 = new Web3()
     web3.setProvider("http://localhost:8545")
     /// --- web3.eth
     /// 转账
     web3.eth.sendTransaction({
         from: '0x65290c7c646F050F2f80387B7cd33fD10c409bE0',
         to: '0x16E89d23411F37C4e0374B1810C1438DD9Aa87b1',
         value: '1000000000000000000'
     },function(error, hash){
         console.log(error,hash)
     })
     /// --- web3.eth.Contract
     /// 调用合约
     var contractJson = require("./build/contracts/Demo.json");
     var abi = contractJson.abi;
     var contractAddress = '0x6CDb1a024d6EA0CB976f61f9d746907B984fd7b4'
     var myContract = new web3.eth.Contract(abi, contractAddress, {
         from: '0x65290c7c646F050F2f80387B7cd33fD10c409bE0',
         gasPrice: '20000000000'
     })
     // 调用合约方法: add
     myContract.methods.add(2).send({}, function(error, transactionHash){
         console.log(error,transactionHash)
     })
     // 调用合约方法: get
     myContract.methods.get().call({}, function(error, result){
         console.log(error,result)
     })
     // 调用合约方法: doTransfer
     myContract.methods.doTransfer('0xef6a214542A5371F321a3e457EeC76DA2b4b3C34').send({value: 10**18}, function(error, transactionHash){
         console.log(error,transactionHash)
     })
     // 调用合约方法: getBalance
     myContract.methods.getBalance('0xef6a214542A5371F321a3e457EeC76DA2b4b3C34').call({}, function(error, result){
         console.log(error,result)
     })
     /// --- web3.eth.accounts
     /// 获取私钥对应的账号地址
     var ret = web3.eth.accounts.privateKeyToAccount('a4e22ce0212b565b6e08a67147b3b1b233542912bc0992bb86d240db2deca819');
     console.log(ret.address)
     /// --- web3.utils
     /// 判断地址是否有效
     var ret = web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d')
     console.log(ret)
     /// 将 ether 转换为 wei
     var ret = web3.utils.toWei('1', 'ether')
     console.log(ret)
     /// 将 wei 转换为 ether
     var ret = web3.utils.fromWei('1', 'ether')
     console.log(ret)
  2. EIP-712签名/验签:

    1. Sign.sol
       // SPDX-License-Identifier: GPL-3.0
       pragma solidity ^0.8.0;
       import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
       import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
       contract Sign is EIP712 {
           constructor(string memory name, string memory version) EIP712(name, version) {
           }
           // 获取签名人(V4)
           function recoverV4(
               address from,
               address to,
               uint256 value,
               bytes memory signature
           ) internal view returns (address) {
               bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
                       keccak256("Mail(address from,address to,uint256 value)"),
                       from,
                       to,
                       value
                   )));
               return ECDSA.recover(digest, signature);
           }
           // 验签
           function verify(
               address from,
               address to,
               uint256 value,
               bytes memory signature
           ) public view returns (bool) {
               address signer = recoverV4(from, to, value, signature);
               return signer == from;
           }
           // 获取 chain id
           function getChainId() public view returns(uint256) {
               return block.chainid;
           }
       }
    2. index.js
       // 创建web3对象
       var Web3 = require('web3');
       var sigUtil = require("eth-sig-util")
       var provider = new Web3.providers.HttpProvider("http://localhost:8545");
       var web3 = new Web3(provider);
       // ---
       var account = "0x3aef6cef1d29bc247b076fe3eeb3018c5684c6d6";
       var accountTo = "0xa3f3749e212bfd54a2fde91038138e9ffea29713";
       var _value = 12345;
       var privateKey = "53395cf932f2e7ca0146a9fac6f2fa0a1fcb92dd13b015e4e98a051a66388ba8";
       var privateKeyHex = Buffer.from(privateKey, 'hex');
       var chainId = 1337;
       // ---
       var contractJson = require("./build/contracts/Sign.json");
       var contractAddr = '0x9cc4EB448e0a6ddcd56783527f6AA370e2C6e4F0';
       var demoContract = new web3.eth.Contract(contractJson.abi, contractAddr);
       // 获取链ID
       demoContract.methods.getChainId().call({from: account}, function(error, result){
           if (error) {
               console.log(error);
           }
           console.log("getChainId:", result);
       });
       // 构造结构体
       const typedData = {
           types: {
               EIP712Domain: [
                   { name: 'name', type: 'string' },
                   { name: 'version', type: 'string' },
                   { name: 'chainId', type: 'uint256' },
                   { name: 'verifyingContract', type: 'address' },
               ],
               Mail: [
                   { name: 'from', type: 'address' },
                   { name: 'to', type: 'address' },
                   { name: 'value', type: 'uint256' },
               ],
           },
           domain: {
               name: 'Demo',
               version: '1.0',
               chainId: chainId,
               verifyingContract: contractAddr,
           },
           primaryType: 'Mail',
           message: {
               from: account,
               to: accountTo,
               value: _value,
           },
       }
       // javascript-V4签名
       var signature = sigUtil.signTypedData_v4(privateKeyHex, { data: typedData })
       console.log("signature:", signature)
       // javascript-V4验签
       const recovered = sigUtil.recoverTypedSignature_v4({
           data: typedData,
           sig: signature,
       });
       console.log("recovered:", recovered)
       // solidity-V4验签
       demoContract.methods.verify(typedData.message.from, typedData.message.to, typedData.message.value, signature).call({from: account}, function(error, result){
           if (error) {
               console.log(error);
           }
           console.log("verify:", result);
       });
文档更新时间: 2024-04-20 10:57   作者:lee