常见
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)
EIP-712
签名/验签: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; } }
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