在浏览器上开源合约代码,会碰到一些常见问题,这里做一个汇总以及相关解决方案
配置
基本配置
以下基本配置必须一样
- 编译版本 (这个指的是remix编译的版本,而不是合约代码里面写的版本)
- EVM 版本 (一般都是default,如果有需要选了版本时,开源也要对应版本)
- 是否优化,优化 (一般 是否优化, 优化配置默认是200)
- 代码
代码除了注释以外,需要保证和部署的一样 这里说下有些代码使用了openzeppelin的相关代码
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
如果代码中使用了这种,建议要么部署完后,
- 立马开源
- 要么自己手动把对应的文件整理到本地,或者使用flattener工具整合成一个文件备份
第2种情况,主要是避免,如果隔了很久再想开源,而且上面链接指向的代码更新过了,就没法开源了…
特殊情况,如果确认代码没问题,也没有构造参数之类的,也是提交不了,那么你只能在提交页面,不断切换是否优化,切换不同的编译版本,去尝试提交开源 (代码中使用^,remix可能会给你默认选中当前版本的最后版本,比如0.6.0的代码,remix默认选中了0.6.12版本,部署的时候没注意看就给发布了)
其他配置说明 查看下图,红色的是一定要记住的,否则没法开源,只能一个一个试 黄色框里面是代码里面的版本 ^表示之上的版本都可以,所以这里remix可以使用0.8.7 勾选优化也会省手续费,以及有些时候超限也得勾选优化
其他配置
- 构造参数 (浏览器验证有时需要填,有时不需要填,原因不详… 有时提交不过,加上构造参数就好了)
- library (部分合约部署的时候额外部署了library就需要)
这两个是可能需要的
library
如果缺少library, 浏览器上会明确提示缺少library, 这个在配置里面添加即可 一般部署合约的时候,如果发了两个交易,第一个就是library (还一种情况是remix连着部署两次主合约,第二次部署没有两次交易,使用了第一次时的library)
Error! Unable to generate Contract ByteCode and ABI (Expected library(ies) but one or more was not provided)
错误图
提交页面加上library
构造参数
构造参数填不填都可能可以提交成功, 比较迷,不了解区块浏览器提交时咋校验/以及要求的
构造参数有两种情况需要处理
- 如果你确认上面所说的基本配置都选对了的情况下,还是提交了,错误就是常规的说byteCode不一样,这个时候可以尝试把构造参数填上
- 如果开源页面,构造参数自动给填了一堆东西,需要删掉提交, 删掉还是不成功,按照1的情况处理一遍
第二种情况缺图~~
第一种情况,就是指的byteCode不一样,没有额外提示
Error! Unable to generate Contract ByteCode and ABI
这里说下如何构建构造参数
方式一
通过 https://abi.hashex.org/# 网站来生成 填入合约的ABI,点击Parse, 然后选择constructor, 生成的内容填到开源页面的构造参数里面
注:这个生成的,有时不能用,不能用的时候,查看方式二, 为啥不能用,不详,确实和实际的不一样 有可能是因为0.8.x的数组方式编码有所改变,或者其他,没有细究
方式二
这个方式是无意中发现的,就是因为上面的方式一 编码的结果无法提交开源 最后把所有bytecode复制出来,查询某个参数时,发现bytecode里面有这个参数,然后有细微差别
以下是代码的相关参数
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address[4] memory addrs, // reward, router, marketing wallet, dividendTracker
uint256[3] memory feeSettings, // rewards, liquidity, marketing
uint256 minimumTokenBalanceForDividends_
)
以下是顺序参数
BABY
BB
1000000000000000000000000
["0x0000000000000000000000000000000000000001","0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3","0x0000000000000000000000000000000000000002","0x0000000000000000000000000000000000000003"]
[1,2,3]
10000000000000000000000
(注:地址中,内部需要使用到路由,所以使用的对应地址,其他瞎填略过)
方式一生成的
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000000000004424142590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024242000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
方式二获取的
000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000000000004424142590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024242000000000000000000000000000000000000000000000000000000000000
开源流程示例
合约地址 https://testnet.bscscan.com/address/0x502fD252c99Da72918532cDC5B8191477cBEFF45#code
参数配置
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address[4] memory addrs, // reward, router, marketing wallet, dividendTracker
uint256[3] memory feeSettings, // rewards, liquidity, marketing
uint256 minimumTokenBalanceForDividends_
)
以下是顺序参数
BABY
BB
1000000000000000000000000
["0x0000000000000000000000000000000000000001","0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3","0x0000000000000000000000000000000000000002","0x0000000000000000000000000000000000000003"]
[1,2,3]
10000000000000000000000
(注:地址中,内部需要使用到路由,所以使用的对应地址,其他瞎填略过)
情况1 基本配置都正确,没有构造参数和library
情况2 补上library,不填构造参数
情况3 填写构造参数(一般可以通过,也可能无法通过)
对于这个代码,可能涉及数组或者是0.8.x动态数据构建有啥变化,原因不确定 内容如下,通过 https://abi.hashex.org 生成的
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000000000004424142590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024242000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c3000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
错误和情况2中的一模一样, 这里就不填图了
情况4 从浏览器提示中取构造参数
查看上图
- 最右边的红色箭头,将滚动条拖动到最右边,然后双击上面内容,复制,(你也可以按住拖动复制到最右边)
- 将内容粘贴到文本框,在最后面找很多0开始的地方…
如我现在这个例子,第一参数是字符串,下面data第一个内容16,不确定是偏移量还是指的长度。 刚开源一个发现没有固定前缀, 如果第一个是地址类型,那么地址签名还会有24个0
所以,找很多0的地方,开始截取,就是构造参数
注意:不要在页面直接双击,双击得到的不是完整内容,只是左边部分,右边还有两个{ipfs}开始的,双击不会带上, 得拖动到最右边 另外图上面看起来最右边还有两个0没有复制到,忽略,可能是浏览器显示问题
得到的内容如下 000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000d3c21bcecceda100000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000009ac64cc6e4415144c455bd8e4837fea55603e5c30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000000000004424142590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024242000000000000000000000000000000000000000000000000000000000000
可以对比通过hashex网址构建到的不一样
以上就开源成功了
如果想开源library, 找到library的地址, 把基本配置填一样的, 代码还是用整个代码即可,提交就直接通过了
测试
如果你想测试这样开源,可以复制上面链接的代码,在代码中随便加个代码, 比如
uint256 abcd = 123;
这样可以避免和已开源的一样,直接被开源了
其他
这里补充一个以前在heco上面的坑 多文件部署的合约 开源的时候,选择上传多个文件, 怎么提交都不通过, 最后把文件合并成一个文件,给通过了…
|