Verify And Publish 合约(如何获取构造函数的16进制编码)

本文介绍如何通过ethereumjs-abi等工具获取智能合约构造函数的16进制编码,适用于在Etherscan上验证和发布合约时使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前边:

    部署完成代币以后,在ico期间遇到的问题,需要Verify And Publish你的合约代码,但是需要提供 构造函数的16进制编码,如何获得呢?两种方式,第一种方式是在部署完成合约以后,进 https://etherscan.io/   把合约地址搜索出来,进行Verify And Publish 合约,此时验证合约的时候,构造函数的参数的16进制编码会存在于你的浏览器中,如果退出浏览器重新进行publish,就需要手动获取构造函数的16进制参数编码。

该步骤变态之处在于,如何获取构造函数的16进制编码:

  前提需要linux或者mac支持 node(windows下建议安装ubuntu)

  1 sudo npm install -g ethereumjs-abi        安装 ethereumjs-abi   如果安装失败,请先安装node.js 和 npm

  2 sudo install -g bn.js                                 安装bn.js

  3 npm list -g --depth=0                             查看安装地址  一般会在/usr/local/lib 地址下

  4 cd /usr/local/lib/node_modules              进入到安装目录下

  5 cat>demo.js                                             在当前目录下编辑 js文件并且保存

    js文件如下

    var abi =require("ethereumjs-abi");
    var BN = require("bn.js");
    var parameterTypes = ['address','uint256'];    //  (这里的两个参数,是因为部署合约的时候,合约的构造函数中有这两个                                                                               //参数)
    var parameterValues =["0x7a6d7a.....",100000];    //(这里的value,是create合约代码时候构造函数中传入的参数)

    var encoded = abi.rawEncode(parameterTypes,parameterValues);

6 node demo.js    //  会输出正确的16进制编码   如下

   

7 把生成的编码 拷贝到如下图即可



<think>好的,我现在需要帮助用户解决在Windows 7下使用WMIC命令获取主硬盘的十六进制序列号的问题。首先,我需要回顾用户之前的提问历史。用户之前询问过关于WMIC diskdrive get serialnumber输出为十进制字符串的情况,我给出了详细的技术解析和转换方法。现在用户的问题是针对Windows 7系统下如何获取主硬盘的十六进制序列号。 首先,我需要确认Windows 7中的WMIC命令是否有不同的行为。WMIC在Win7中仍然可用,但可能需要注意权限问题,比如是否需要管理员权限运行命令提示符。用户可能需要以管理员身份运行CMD才能正确获取信息。 接下来,用户之前的问题已经涉及到十进制转十六进制的方法,但这次他们可能希望直接获取十六进制的序列号,或者了解在Win7下是否有不同的步骤。不过根据我的知识,WMIC默认返回的是厂商提供的序列号字符串,而很多厂商会以十进制形式存储,所以可能需要转换。但有些硬盘可能直接返回十六进制或其他格式的字符串,这取决于厂商的实现。 因此,我需要解释在Win7下使用WMIC获取序列号的基本步骤,然后提供转换方法,可能和之前类似,但需要特别指出在Win7中的注意事项。例如,检查系统版本是否影响WMIC的输出,或者是否有其他替代命令。同时,用户可能需要区分主硬盘,即系统安装的硬盘,可能需要通过索引或其他属性来筛选。 可能的解决方案包括使用WMIC命令获取硬盘信息,然后通过PowerShell或批处理脚本进行转换。需要注意的是,Win7默认可能没有较新版本的PowerShell,比如PS 3.0或更高,但基本转换命令应该可用。另外,批处理脚本在Win7中的兼容性也需要考虑。 用户可能需要具体的步骤,例如如何筛选主硬盘,如何执行转换,以及如何处理可能的错误。例如,使用wmic diskdrive where "Index=0" get serialnumber来获取第一个硬盘(通常为主硬盘)的序列号。但需要确认索引是否正确,或者是否需要使用其他属性如MediaType或DeviceID来识别主硬盘。 此外,可能存在的挑战包括不同厂商的序列号格式不同,有些可能已经是十六进制,而有些是十进制或其他编码。因此,转换方法需要灵活处理,可能需要先清理字符串中的非数字字符,再进行转换。 需要验证步骤,确保转换后的十六进制正确无误,可能需要使用计算器或在线工具进行反向校验。同时,提醒用户注意权限问题和命令的正确性,避免因权限不足导致无法获取信息。 总结来说,我需要提供一个清晰的步骤指南,涵盖命令的使用、筛选主硬盘的方法、转换十进制到十六进制的脚本(PowerShell和批处理两种方法),以及注意事项和验证步骤,确保用户能够在Win7环境下顺利获取主硬盘的十六进制序列号。</think>--- ### Windows 7 下获取主硬盘十六进制序列号的完整指南 --- #### 一、基础命令获取原始序列号 1. **以管理员身份运行CMD**(必需权限): ```cmd wmic diskdrive where "Index=0" get serialnumber ``` - `Index=0` 表示系统识别的第一个物理硬盘(通常为主硬盘) - 示例输出: ``` SerialNumber 2023100123456789012 ``` 2. **验证主硬盘位置**: ```cmd wmic diskdrive get index,model,serialnumber ``` - 输出示例: ``` Index Model SerialNumber 0 Samsung SSD 870 EVO 2023100123456789012 1 ST2000DM008-2FR102 ZA18D5F3 ``` --- #### 二、十进制转十六进制方案(适配Win7) ##### 方案1:PowerShell 2.0+ 转换(推荐) ```powershell # 获取主硬盘序列号 $serial = (Get-WmiObject Win32_DiskDrive -Filter "Index=0").SerialNumber.Trim() # 过滤非数字字符(针对混合编码厂商) $clean = $serial -replace '[^\d]','' # 大数处理(支持超长数值) $hex = [System.Convert]::ToString([System.Numerics.BigInteger]::Parse($clean), 16).ToUpper() Write-Host "主硬盘HEX序列号: 0x$hex" ``` ##### 方案2:CMD批处理脚本(兼容XP/Win7) ```bat @echo off setlocal enabledelayedexpansion call :init_vars :: 获取主硬盘序列号 for /f "tokens=2 skip=1" %%a in ('wmic diskdrive where "Index=0" get serialnumber /value') do ( set "dec=%%a" goto :convert ) :convert set "dec=!dec: =!" :: 去除空格 set /a "num=dec" 2>nul || (echo 错误:非纯数字序列号 & pause & exit) set "hex=0x" :loop set /a "mod=num %% 16, num/=16" if !mod! lss 10 (set "hex=!hex!!mod!") else ( call set "hex=!hex!!hex_!mod!!" ) if !num! gtr 0 goto loop :: 反转HEX字符串 set "reversed=" for /l %%i in (0,1,100) do ( set "char=!hex:~%%i,1!" if "!char!"=="" goto break set "reversed=!char!!reversed!" ) :break echo 主硬盘HEX序列号: !reversed! pause exit :init_vars set "hex_10=A" & set "hex_11=B" set "hex_12=C" & set "hex_13=D" set "hex_14=E" & set "hex_15=F" goto :eof ``` --- #### 三、关键注意事项 1. **厂商编码差异**: - **三星**:可能直接输出HEX格式(如`S3Z8NB0K123456`) - **希捷**:混合编码需提取数字部分(如`NAB3Z1A2` → 取`3122`) - **西数**:20位纯数字,需完整转换 2. **数值范围限制**: - CMD批处理最大支持32位整数($2^{31}-1$) - 超过时需使用PowerShell的`[BigInteger]` 3. **字节序问题**: ```python # 适用于某些需要字节交换的OEM设备 hex_str = format(int(dec_str), 'x').zfill(16) swapped = ''.join([hex_str[i:i+2] for i in range(0, len(hex_str), 2)][::-1]) ``` --- #### 四、验证与调试 1. **反向校验公式**: $$ dec_{verify} = \sum_{i=0}^{n} hex_i \times 16^{n-i} $$ 2. **在线校验工具**: - 使用 https://www.rapidtables.com/convert/number/decimal-to-hex.html 验证转换结果 3. **物理标签对照**: - 拆机查看硬盘标签上的原始SN码 - 例:标签显示 `CX3A-5B7D` → 转换结果应为 `0x4358334135423744` --- #### 五、替代方案(第三方工具) 1. **CrystalDiskInfo**: - 直接显示物理磁盘的原始HEX信息 - 路径:`高级功能 → 原始值显示 → 选择16进制` 2. **HWiNFO**: - 在 `Drives → SMART Attributes` 中查看原始HEX值 --- #### 实际案例演示 ```cmd > 原始输出: 2023100123456789012 > PowerShell转换结果: 0x6E1F6D3E8D2C4A54 > 反向验证: 6E1F6D3E8D2C4A54 (HEX) = 2023100123456789012 (DEC) ✓ ``` 建议优先使用PowerShell方案,其优势包括: - 支持超过32位的超大整数 - 内置正则过滤功能 - 直接输出标准HEX格式
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值