给定一个智能合约的(Solidity)源代码,有没有办法能够确定代码编译并能够将其与区块链上的代码进行比较呢? 我想验证该合约是否符合源代码中所声称的内容并且没有被作者篡改。

原文地址

7 人回答 0

7 个回答
投票数
最旧发布
最近发布

回答发布于 2018-09-04 15:26:13

据我所知,目前最好的办法就是:使用和作者完全一样的编译器版本,然后再次编译源代码(因此,该方法需要公开一些内容)并比较字节码。

因此,你应该检查是否匹配的是:编译后的字节码与创建交易tx的合约数据

||
||

回答发布于 2018-09-04 15:26:12

补充@thomas-bertani的回复,现在以太坊官网(etherchain.org)发布了以太坊智能合约的验证工具(verification tool for Ethereum contracts

下面是摘自“How does it work ”这一页的引文 :

  • Retrieve the payload of the transaction that created the contract
  • Compile the provided source code with the provided compiler&settings
  • If the creation and the provided bytecode match it can be assumed that the provided sourcecode equals to what was previously deployed on the blockchain

注解:

  • 检索创建合约交易的有效负载
  • 使用提供的编译器编译源代码
  • 如果新创建的与提供的字节码匹配,则可以假定:提供的源代码与先前部署在区块链上的合约一致。
||
||

回答发布于 2018-09-04 15:26:12

现今的工作流程十分恼人。你需要利用同一个版本编译器以及相同的设置来编译合约。(注意:“optimization=true”标志)

现在请注意:生成的字节码与存储在该地址上的字节码并不匹配。产生这个结果的原因是——已编译的合约包含了初始化部分,而这部分只在合约提交到区块链时运行了一次,所以存储在区块链上的字节码不包含这部分代码。

你有两种选择来验证代码:

  1. 将已编译的代码提交到(虚拟)区块链上,然后使用getCode命令检查生成的代码。
  2. 将已编译的代码与创建合约的交易的有效负载进行比较。

Etherchain可以帮助你完成此过程

主要模式匹配技术可用于辨识合约——即使使用的编译器不完全相同。 能做到这点且通常将高级别的合约(Serpent/Solidity)与以太坊地址联系起来的项目是:Etherscrape

||
||

回答发布于 2018-09-04 15:26:11

https://etherscan.io/verifyContract 是一个验证工具。 通过提供Solidity源代码,它可以检验生成的字节码是否与合约字节码(在给定地址的情况下)匹配。 用户应选择相同的编译器并启用或禁用优化(optimization)。

||
||

回答发布于 2018-09-04 15:26:10

另一种方法是反编译字节码并将其与源代码进行比较。

有一个叫Porosity的工具可以做到这一点。

||
||

回答发布于 2018-09-04 15:26:09

建议使用ConsenSys刚发布的开源命令行工具——字节码验证器(bytecode-verifier),有单独的npm包

Bytecode Verifier是一个很方便的命令行工具,用于验证目标Solidity合约在本地编译后的字节码与实际存储在以太坊区块链对应合约地址上的字节码是否匹配。

  • 字节码的完整性/正确性:实际存储在链上的内容是对特定合约的正确编译,这对重要的具有潜在高价值的合约部署(例如MultiSig Wallet)来说可能会有所帮助,特别是通过第三方平台部署的合约。

  • 最小化工作量,便于使用:solidity编译器包含超时和其他一些次要的更改,这使得字节码的验证变得复杂。 (正如在Ethereum Stack Exchange中多次出现“字节码不匹配”问题)。 Bytecode Verifier已经针对最新版本进行了测试——一直测试到一些最早部署的合约。

  • 对测试网络友好:大多数项目在将合约系统部署到主链之前都会在先在测试网络上运行,该工具支持Rinkeby,Kovan和Ropsten Testnet,它们构成了大多数以太坊开发人员使用的三个活跃且维护良好的测试网络。

希望有所帮助!

||
||

回答发布于 2018-09-04 15:26:08

下面是我在web3脚本上所做的:

首先,编译代码:

const solc = require('solc');

//contract sources
const contractPath = "../contracts/";

const input = {
  "ContractName.sol" : fs.readFileSync(contractPath + 'contractName.sol', 'utf8'),
}

let solcOutput = await solc.compile({ sources: input }, 1);

先在比对字节码

let blockCode = await web3.eth.getCode(contractAddress);
let solcCode = '0x' + (solcOutput.contracts["contractName.sol:contracName"].runtimeBytecode);}
||
||

回答发布于 2018-09-04 15:26:08

下面是我在web3脚本上所做的:

首先,编译代码:

const solc = require('solc');

//contract sources
const contractPath = "../contracts/";

const input = {
  "ContractName.sol" : fs.readFileSync(contractPath + 'contractName.sol', 'utf8'),
}

let solcOutput = await solc.compile({ sources: input }, 1);

先在比对字节码

let blockCode = await web3.eth.getCode(contractAddress);
let solcCode = '0x' + (solcOutput.contracts["contractName.sol:contracName"].runtimeBytecode);}
||
||

回答发布于 2018-09-04 15:26:09

建议使用ConsenSys刚发布的开源命令行工具——字节码验证器(bytecode-verifier),有单独的npm包

Bytecode Verifier是一个很方便的命令行工具,用于验证目标Solidity合约在本地编译后的字节码与实际存储在以太坊区块链对应合约地址上的字节码是否匹配。

  • 字节码的完整性/正确性:实际存储在链上的内容是对特定合约的正确编译,这对重要的具有潜在高价值的合约部署(例如MultiSig Wallet)来说可能会有所帮助,特别是通过第三方平台部署的合约。

  • 最小化工作量,便于使用:solidity编译器包含超时和其他一些次要的更改,这使得字节码的验证变得复杂。 (正如在Ethereum Stack Exchange中多次出现“字节码不匹配”问题)。 Bytecode Verifier已经针对最新版本进行了测试——一直测试到一些最早部署的合约。

  • 对测试网络友好:大多数项目在将合约系统部署到主链之前都会在先在测试网络上运行,该工具支持Rinkeby,Kovan和Ropsten Testnet,它们构成了大多数以太坊开发人员使用的三个活跃且维护良好的测试网络。

希望有所帮助!

||
||

回答发布于 2018-09-04 15:26:10

另一种方法是反编译字节码并将其与源代码进行比较。

有一个叫Porosity的工具可以做到这一点。

||
||

回答发布于 2018-09-04 15:26:11

https://etherscan.io/verifyContract 是一个验证工具。 通过提供Solidity源代码,它可以检验生成的字节码是否与合约字节码(在给定地址的情况下)匹配。 用户应选择相同的编译器并启用或禁用优化(optimization)。

||
||

回答发布于 2018-09-04 15:26:12

补充@thomas-bertani的回复,现在以太坊官网(etherchain.org)发布了以太坊智能合约的验证工具(verification tool for Ethereum contracts

下面是摘自“How does it work ”这一页的引文 :

  • Retrieve the payload of the transaction that created the contract
  • Compile the provided source code with the provided compiler&settings
  • If the creation and the provided bytecode match it can be assumed that the provided sourcecode equals to what was previously deployed on the blockchain

注解:

  • 检索创建合约交易的有效负载
  • 使用提供的编译器编译源代码
  • 如果新创建的与提供的字节码匹配,则可以假定:提供的源代码与先前部署在区块链上的合约一致。
||
||

回答发布于 2018-09-04 15:26:12

现今的工作流程十分恼人。你需要利用同一个版本编译器以及相同的设置来编译合约。(注意:“optimization=true”标志)

现在请注意:生成的字节码与存储在该地址上的字节码并不匹配。产生这个结果的原因是——已编译的合约包含了初始化部分,而这部分只在合约提交到区块链时运行了一次,所以存储在区块链上的字节码不包含这部分代码。

你有两种选择来验证代码:

  1. 将已编译的代码提交到(虚拟)区块链上,然后使用getCode命令检查生成的代码。
  2. 将已编译的代码与创建合约的交易的有效负载进行比较。

Etherchain可以帮助你完成此过程

主要模式匹配技术可用于辨识合约——即使使用的编译器不完全相同。 能做到这点且通常将高级别的合约(Serpent/Solidity)与以太坊地址联系起来的项目是:Etherscrape

||
||

回答发布于 2018-09-04 15:26:13

据我所知,目前最好的办法就是:使用和作者完全一样的编译器版本,然后再次编译源代码(因此,该方法需要公开一些内容)并比较字节码。

因此,你应该检查是否匹配的是:编译后的字节码与创建交易tx的合约数据

||
||

回答发布于 2018-09-04 15:26:13

据我所知,目前最好的办法就是:使用和作者完全一样的编译器版本,然后再次编译源代码(因此,该方法需要公开一些内容)并比较字节码。

因此,你应该检查是否匹配的是:编译后的字节码与创建交易tx的合约数据

||
||

回答发布于 2018-09-04 15:26:12

补充@thomas-bertani的回复,现在以太坊官网(etherchain.org)发布了以太坊智能合约的验证工具(verification tool for Ethereum contracts

下面是摘自“How does it work ”这一页的引文 :

  • Retrieve the payload of the transaction that created the contract
  • Compile the provided source code with the provided compiler&settings
  • If the creation and the provided bytecode match it can be assumed that the provided sourcecode equals to what was previously deployed on the blockchain

注解:

  • 检索创建合约交易的有效负载
  • 使用提供的编译器编译源代码
  • 如果新创建的与提供的字节码匹配,则可以假定:提供的源代码与先前部署在区块链上的合约一致。
||
||

回答发布于 2018-09-04 15:26:12

现今的工作流程十分恼人。你需要利用同一个版本编译器以及相同的设置来编译合约。(注意:“optimization=true”标志)

现在请注意:生成的字节码与存储在该地址上的字节码并不匹配。产生这个结果的原因是——已编译的合约包含了初始化部分,而这部分只在合约提交到区块链时运行了一次,所以存储在区块链上的字节码不包含这部分代码。

你有两种选择来验证代码:

  1. 将已编译的代码提交到(虚拟)区块链上,然后使用getCode命令检查生成的代码。
  2. 将已编译的代码与创建合约的交易的有效负载进行比较。

Etherchain可以帮助你完成此过程

主要模式匹配技术可用于辨识合约——即使使用的编译器不完全相同。 能做到这点且通常将高级别的合约(Serpent/Solidity)与以太坊地址联系起来的项目是:Etherscrape

||
||

回答发布于 2018-09-04 15:26:11

https://etherscan.io/verifyContract 是一个验证工具。 通过提供Solidity源代码,它可以检验生成的字节码是否与合约字节码(在给定地址的情况下)匹配。 用户应选择相同的编译器并启用或禁用优化(optimization)。

||
||

回答发布于 2018-09-04 15:26:10

另一种方法是反编译字节码并将其与源代码进行比较。

有一个叫Porosity的工具可以做到这一点。

||
||

回答发布于 2018-09-04 15:26:09

建议使用ConsenSys刚发布的开源命令行工具——字节码验证器(bytecode-verifier),有单独的npm包

Bytecode Verifier是一个很方便的命令行工具,用于验证目标Solidity合约在本地编译后的字节码与实际存储在以太坊区块链对应合约地址上的字节码是否匹配。

  • 字节码的完整性/正确性:实际存储在链上的内容是对特定合约的正确编译,这对重要的具有潜在高价值的合约部署(例如MultiSig Wallet)来说可能会有所帮助,特别是通过第三方平台部署的合约。

  • 最小化工作量,便于使用:solidity编译器包含超时和其他一些次要的更改,这使得字节码的验证变得复杂。 (正如在Ethereum Stack Exchange中多次出现“字节码不匹配”问题)。 Bytecode Verifier已经针对最新版本进行了测试——一直测试到一些最早部署的合约。

  • 对测试网络友好:大多数项目在将合约系统部署到主链之前都会在先在测试网络上运行,该工具支持Rinkeby,Kovan和Ropsten Testnet,它们构成了大多数以太坊开发人员使用的三个活跃且维护良好的测试网络。

希望有所帮助!

||
||

回答发布于 2018-09-04 15:26:08

下面是我在web3脚本上所做的:

首先,编译代码:

const solc = require('solc');

//contract sources
const contractPath = "../contracts/";

const input = {
  "ContractName.sol" : fs.readFileSync(contractPath + 'contractName.sol', 'utf8'),
}

let solcOutput = await solc.compile({ sources: input }, 1);

先在比对字节码

let blockCode = await web3.eth.getCode(contractAddress);
let solcCode = '0x' + (solcOutput.contracts["contractName.sol:contracName"].runtimeBytecode);}
||
||