一、说明
在dapp开发中涉及到签名验签的场景比较多,使用区块链技术构建的应用程序。签名和验签在 DApp 开发中是非常重要的,它们用于保护用户的隐私和确保交易的安全性。主要应用场景如下:资产转移、身份验证、消息验证、代币销毁、智能合约。
本代码示例演示了在ether.js端通过私钥对原始消息hash产生签名消息,原始消息为多个变量值。本示例代码中的原始消息为提币地址address,提币数量amount,提币临时变量nonce, 对三个提币信息格式化为32位长度的字节数组,转换为hash值,然后对hash值使用指定私钥进行签名,产生签名消息,然后将签名消息提交到solidity链端。在链端完成对签名消息的验签,如果验证签名地址与solidity中指定的公钥地址一致,则认为是合法的提币请求,执行链端的提币操作。
具体的流程如下:
dapp前端页面展示效果如下:
二、核心代码实现
1、ether.js端对多个变量产生hash并执行私钥签名的代码
const ethers = require('ethers'); const address = document.getElementById("address-input").value; const amount = document.getElementById("amount-input").value; const nonce = document.getElementById("nonce-input").value; // 将变量转换为字符串,并使用 ethers.utils.solidityKeccak256 进行哈希 const hash = ethers.utils.solidityKeccak256( ['string', 'uint256', 'bool'], [address.toString(), amount.toString(), nonce.toString()] ); // 使用私钥对哈希进行签名 const privateKey = '0x123...'; // 替换为实际的私钥 const wallet = new ethers.Wallet(privateKey); const signature = await wallet.signMessage(ethers.utils.arrayify(hash));
2、solidity端验证签名的核心代码
pragma solidity ^0.8.0; contract SignatureVerification { function verify( bytes32 message, bytes memory signature, address signer ) public pure returns (bool) { bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", message)); bytes32 r; bytes32 s; uint8 v; if (signature.length != 65) { return false; } assembly { r := mload(add(signature, 32)) s := mload(add(signature, 64)) v := byte(0, mload(add(signature, 96))) } if (v < 27) { v += 27; } if (v != 27 && v != 28) { return false; } address recovered = ecrecover(hash, v, r, s); return recovered == signer; } }
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中会员可以自动实现链上充提币操作。
至此,完成ether.js中产生签名消息,solidity端验证签名的实现方式所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册