一、说明
在 web3.js 中,用户交互方式对消息进行签名可以通过以下步骤实现:
- 使用
web3.eth.accounts.sign()
方法签名消息。 - 在签名之前,需要使用
web3.eth.personal.unlockAccount()
方法来解锁当前用户的账户,以便进行交互式签名。该方法需要传递账户地址和账户密码作为参数。如果账户已经解锁,则无需再次解锁。 - 调用
web3.eth.accounts.sign()
方法,并传入要签名的消息和私钥作为参数。 - 如果签名成功,该方法将返回一个包含签名消息的对象。本dapp示例代码包含通过metamask钱包客户端签名的方式,私钥后台签名的方式,以及solidity链端完成签名验签的过程,最后执行代币的充提接口。
dapp前端页面展示效果如下:
二、核心代码实现
1、web3.js类库前端产生签名消息的代码
const Web3 = require('web3'); //web3.js创建web3对象 const web3 = new Web3('https://mainnet.infura.io/v3/<PROJECT_ID>'); // 1. 解锁账户 await web3.eth.personal.unlockAccount(accountAddress, accountPassword); // 2. 签名消息 const signature = await web3.eth.accounts.sign(message, privateKey); // 3. 打印签名结果 console.log("Signature: ", signature); //4. 拆分签名消息,验证签名公钥地址 const r = signature.slice(0, 66); const s = "0x" + signature.slice(66, 130); const v = parseInt(signature.slice(130, 132), 16);
2、solidity端签名验签代码如下:
function getEthSignedMessageHash(bytes32 _messageHash) private pure returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", _messageHash ) ); } function queryEthSignedMessageHash( uint256 amount, address to, uint256 _nonce ) external pure returns (bytes32) { bytes32 messageHash = getMessageHash(amount, to, _nonce); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return ethSignedMessageHash; }
3、dapp前端页面布局代码如下:
<form> <label for="address-input">提币地址:</label> <input type="text" id="address-input"> <label for="amount-input">提币数量:</label> <input type="number" id="amount-input"> <label for="nonce-input">提币nonce:</label> <input type="number" id="nonce-input"> <p class="form-note">提币数量需要包含精度,提币nonce值需要唯一,nonce步长值为2</p> </form> <div class="button-group"> <button class="connect-wallet-btn" onclick="connWallet()">连接钱包</button> <button class="signmgs-btn" onclick="signMessage()">签名消息(钱包)</button> <button class="signmgs-btn" onclick="signMessagePriKey()">签名消息(私钥)</button> <button class="verifysig-btn" onclick="verifyMessage()">验证签名</button> <button class="execute-contract-btn" onclick="withdraw()">执行提币</button> </div>
前端根据用户form表达是输入,对多个变量值进行hash签名产生正确的签名消息后,提交到链端,由链端完成签名验签,最终完成代币的自动化提币,dapp中会员可以自动实现链上充提币操作。
至此,完成web3.js中私钥方式对消息进行签名并实现链端验签,完成系统会员的代币自动充提所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册