此Ethereum Stack Exchange和其他网站上都提供了Solidity代码的一些片段和函数。有什么方法可以快速测试它们,并尽可能地调试一下这些代码,然后直接可以用上它们?

原文地址

8 人回答 0

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

回答发布于 2018-09-03 15:43:20

其中一种方法是使用Remix——基于浏览器的Solidity实时编译器并且可以运行solidity(以前命名为browser-solidity)。

  1. 将代码粘贴到Remix
  2. 如果需要的话可在合约内包括一个函数(例如:contract C { ... }
  3. 点击Contract按钮和create来实例化合约
  4. 给函数输入满足预设要求的输入值:
    • 对于bytes1 … bytes32,使用带引号的十六进制字符串,比如对于bytes3,输入"0xabcdef"
    • 对于bytes,使用十六进制字符串数组,比如:["0xab", "0xcd", "0xef"]
    • 对于strings,要确保带有引号。
    • 对于很大的数,也要确保带有引号。
    • 对于任意一个数组,使用[],比如:["hello", 42, "0xabcd"]
  5. 点击函数获取结果。结果是编码后的应用程序二进制接口(ABI

下面是示例截图:

||
||

回答发布于 2018-09-03 15:43:19

这里有不少方法可以测试Solidity合约。至少在我看来,最简单的就是使用Truffle进行黑盒测试。合约往往相对较小且独立,因此黑盒测试用在这里似乎是很合适的。

Truffle允许你使用Pudding在Javascript中编写单元测试,Pudding是web3,MochaChai的扩展。 典型的测试如下所示:

contract('MetaCoin', function(accounts) {
  it("should put 10000 MetaCoin in the first account", function(done) {
    // Get a reference to the deployed MetaCoin contract, as a JS object.
    var meta = MetaCoin.deployed();

    // Get the MetaCoin balance of the first account, and assert that it's 10000.
    meta.getBalance.call(accounts[0]).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    }).then(done).catch(done);
  });
});
||
||

回答发布于 2018-09-03 15:43:18

我自己使用Dapple编写Solidity单元测试。它的优点是不需要Javascript测试框架层,所以你可以完全保持Solidity。另外我可以用它来测试使用导入功能的合约——但我不确定在chriseth的在线solidity编译器中是否可行。

编注:对于想要了解语言的人来说,已被接受的答案绝对是一个更好的选择。但我仍然坚持认为Dapple对于像我这样的人(喜欢停留于命令行并且想要快速测试一些代码,使得一些语言的灰暗角落能够再现光芒)来说是一个更好的选择。(你可能很轻易地就低估了我对命令行的偏好。这是有点荒谬——延伸到敲出短脚本,从而使得我可以在无需切换到浏览器的情况下检查网站。)

也就是说,自从回答这个问题后,我发现了一个名为Solidity REPL的工具,它完全符合其名称的含义:在命令行中为你提供Solidity REPL。为了对某种语言进行快速且全面的检验,就像使用Python语言一样,我建议使用Dapple上的工具。

||
||

回答发布于 2018-09-03 15:43:17

另一个选择是使用EthereumJ来实现。 我们最近发布了1.2.0版,它具有很好的功能,特别适合这种情况。 您可以从这里查看样本。

StandaloneBlockchain bc = new StandaloneBlockchain();

SolidityContract contract = bc.submitNewContract(
       "contract A { uint a; ... }"
);

contract.callFunction("funcName", "arg1", 2, new byte[] {1,2,3}, "arg4");
bc.createBlock()

System.out.println("Result: " + contract.callConstFunction("getResultFunc"));
||
||

回答发布于 2018-09-03 15:43:15

如果你只是在寻找一种快速测试代码并可在浏览器中运行的方法,那么你可以试一下https://ethfiddle.com/ (披露一下:我是建立它的团队中的一员。)

我发现Remix的用户界面很复杂,在很多情况下都是过于复杂,大多数时候我想做的就是:1)快速运行并测试我在网上发现的一些合约代码,2)与其他人分享合约代码而不需要他们为了运行它而到其他地方去复制/粘贴。 因此,我们构建了一个主要关注于简单性和共享性的替代方案。

下面是一个快速演示:

||
||

回答发布于 2018-09-03 15:43:15

如果您只对solidity感兴趣,那么正如已经回答过的那样,Dapple可以为单元测试提供最好的框架。

但是如果你在.Net/Nethereum中开发,那么你可以按照solidity合约进行集成测试:

var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var test = contract.GetFunction("test4"); Assert.True(await test.CallAsync<bool(BigInteger.Parse("3457987492347979798742")));

你可能需要将智能合约部署到你的测试网络上。 在上面的示例所示,我们已经知道了ABI(存储在一个字符串中),并且我们使用合约地址来初始化合约。

测试合约中的事件也很重要,例如在ERC20上,转移事件(Transfer event)可以如下进行测试:

var allTransfersFilter = await transfersEvent.CreateFilterAsync(new BlockParameter(3000)); var eventLogsAll = await transfersEvent.GetAllChanges<Transfer>(allTransfersFilter);

 Assert.Equal(1, eventLogsAll.Count); var transferLog = eventLogsAll.First(); Assert.Equal(transferLog.Log.TransactionIndex.HexValue, transferReceipt.TransactionIndex.HexValue); Assert.Equal(transferLog.Log.BlockNumber.HexValue, transferReceipt.BlockNumber.HexValue); Assert.Equal(transferLog.Event.AddressTo, newAddress); Assert.Equal(transferLog.Event.Value, (ulong)1000);

如上所示,我们正在检索事件,验证交易和特定事件属性,例如发送金额的地址和值。

||
||

回答发布于 2018-09-03 15:43:12

恕我直言,能够实现快速测试、代码调试并直接使用的最简单的方法就是solidity-repl,因为它的目标就是Solidity代码的快速测试。

我相信该项目会就你问的问题做出最好的回应,并且说实话,我感觉到你在考虑自己所写的问题的答案时带着一种偏见,以便你能够接受它。 如果不出意料的话,那个问题中的remix标签就是一个很有说服力的指示。:)

因此,虽然你对自己问题的“预期答案”标准是有自己想法的并且不容置疑,但我仍然在这里建议solidity-repl,因为可能会有其他人在这里考虑类似的问题并可以从中找到更合适的工具 。

||
||

回答发布于 2018-09-03 15:43:11

首先,我会建议你在一个集成开发环境(IDE)中编写代码,比如Sublime Text。然后我会使用Remix来测试自己代码的语法是否正确,并且它会编译代码。虽然人们也提到使用Truffle,但是在我看来它只是改变了学习曲线。Truffle在背后使用testrpc,你可以单独设置和使用它们。 我建议你花时间学习系统学习一下。

总而言之,testrpc只是模拟功能。 我还是要建议你在“真实”的环境中测试你的合约。 Ropsten测试网络对这个来说是最好的测试网络。

EthTools.com(我们公司建立了这个)有一个工具,用于向区块链上提交合约,然后与它们进行交互。 你可以通过与合约交互来验证合约中的函数是否有效以及是否获得了正确的响应。 你可以在ropsten测试网络或主网上执行此操作(根据你的需求)。

这是一些视频链接:

||
||

回答发布于 2018-09-03 15:43:11

首先,我会建议你在一个集成开发环境(IDE)中编写代码,比如Sublime Text。然后我会使用Remix来测试自己代码的语法是否正确,并且它会编译代码。虽然人们也提到使用Truffle,但是在我看来它只是改变了学习曲线。Truffle在背后使用testrpc,你可以单独设置和使用它们。 我建议你花时间学习系统学习一下。

总而言之,testrpc只是模拟功能。 我还是要建议你在“真实”的环境中测试你的合约。 Ropsten测试网络对这个来说是最好的测试网络。

EthTools.com(我们公司建立了这个)有一个工具,用于向区块链上提交合约,然后与它们进行交互。 你可以通过与合约交互来验证合约中的函数是否有效以及是否获得了正确的响应。 你可以在ropsten测试网络或主网上执行此操作(根据你的需求)。

这是一些视频链接:

||
||

回答发布于 2018-09-03 15:43:12

恕我直言,能够实现快速测试、代码调试并直接使用的最简单的方法就是solidity-repl,因为它的目标就是Solidity代码的快速测试。

我相信该项目会就你问的问题做出最好的回应,并且说实话,我感觉到你在考虑自己所写的问题的答案时带着一种偏见,以便你能够接受它。 如果不出意料的话,那个问题中的remix标签就是一个很有说服力的指示。:)

因此,虽然你对自己问题的“预期答案”标准是有自己想法的并且不容置疑,但我仍然在这里建议solidity-repl,因为可能会有其他人在这里考虑类似的问题并可以从中找到更合适的工具 。

||
||

回答发布于 2018-09-03 15:43:15

如果你只是在寻找一种快速测试代码并可在浏览器中运行的方法,那么你可以试一下https://ethfiddle.com/ (披露一下:我是建立它的团队中的一员。)

我发现Remix的用户界面很复杂,在很多情况下都是过于复杂,大多数时候我想做的就是:1)快速运行并测试我在网上发现的一些合约代码,2)与其他人分享合约代码而不需要他们为了运行它而到其他地方去复制/粘贴。 因此,我们构建了一个主要关注于简单性和共享性的替代方案。

下面是一个快速演示:

||
||

回答发布于 2018-09-03 15:43:15

如果您只对solidity感兴趣,那么正如已经回答过的那样,Dapple可以为单元测试提供最好的框架。

但是如果你在.Net/Nethereum中开发,那么你可以按照solidity合约进行集成测试:

var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var test = contract.GetFunction("test4"); Assert.True(await test.CallAsync<bool(BigInteger.Parse("3457987492347979798742")));

你可能需要将智能合约部署到你的测试网络上。 在上面的示例所示,我们已经知道了ABI(存储在一个字符串中),并且我们使用合约地址来初始化合约。

测试合约中的事件也很重要,例如在ERC20上,转移事件(Transfer event)可以如下进行测试:

var allTransfersFilter = await transfersEvent.CreateFilterAsync(new BlockParameter(3000)); var eventLogsAll = await transfersEvent.GetAllChanges<Transfer>(allTransfersFilter);

 Assert.Equal(1, eventLogsAll.Count); var transferLog = eventLogsAll.First(); Assert.Equal(transferLog.Log.TransactionIndex.HexValue, transferReceipt.TransactionIndex.HexValue); Assert.Equal(transferLog.Log.BlockNumber.HexValue, transferReceipt.BlockNumber.HexValue); Assert.Equal(transferLog.Event.AddressTo, newAddress); Assert.Equal(transferLog.Event.Value, (ulong)1000);

如上所示,我们正在检索事件,验证交易和特定事件属性,例如发送金额的地址和值。

||
||

回答发布于 2018-09-03 15:43:17

另一个选择是使用EthereumJ来实现。 我们最近发布了1.2.0版,它具有很好的功能,特别适合这种情况。 您可以从这里查看样本。

StandaloneBlockchain bc = new StandaloneBlockchain();

SolidityContract contract = bc.submitNewContract(
       "contract A { uint a; ... }"
);

contract.callFunction("funcName", "arg1", 2, new byte[] {1,2,3}, "arg4");
bc.createBlock()

System.out.println("Result: " + contract.callConstFunction("getResultFunc"));
||
||

回答发布于 2018-09-03 15:43:18

我自己使用Dapple编写Solidity单元测试。它的优点是不需要Javascript测试框架层,所以你可以完全保持Solidity。另外我可以用它来测试使用导入功能的合约——但我不确定在chriseth的在线solidity编译器中是否可行。

编注:对于想要了解语言的人来说,已被接受的答案绝对是一个更好的选择。但我仍然坚持认为Dapple对于像我这样的人(喜欢停留于命令行并且想要快速测试一些代码,使得一些语言的灰暗角落能够再现光芒)来说是一个更好的选择。(你可能很轻易地就低估了我对命令行的偏好。这是有点荒谬——延伸到敲出短脚本,从而使得我可以在无需切换到浏览器的情况下检查网站。)

也就是说,自从回答这个问题后,我发现了一个名为Solidity REPL的工具,它完全符合其名称的含义:在命令行中为你提供Solidity REPL。为了对某种语言进行快速且全面的检验,就像使用Python语言一样,我建议使用Dapple上的工具。

||
||

回答发布于 2018-09-03 15:43:19

这里有不少方法可以测试Solidity合约。至少在我看来,最简单的就是使用Truffle进行黑盒测试。合约往往相对较小且独立,因此黑盒测试用在这里似乎是很合适的。

Truffle允许你使用Pudding在Javascript中编写单元测试,Pudding是web3,MochaChai的扩展。 典型的测试如下所示:

contract('MetaCoin', function(accounts) {
  it("should put 10000 MetaCoin in the first account", function(done) {
    // Get a reference to the deployed MetaCoin contract, as a JS object.
    var meta = MetaCoin.deployed();

    // Get the MetaCoin balance of the first account, and assert that it's 10000.
    meta.getBalance.call(accounts[0]).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    }).then(done).catch(done);
  });
});
||
||

回答发布于 2018-09-03 15:43:20

其中一种方法是使用Remix——基于浏览器的Solidity实时编译器并且可以运行solidity(以前命名为browser-solidity)。

  1. 将代码粘贴到Remix
  2. 如果需要的话可在合约内包括一个函数(例如:contract C { ... }
  3. 点击Contract按钮和create来实例化合约
  4. 给函数输入满足预设要求的输入值:
    • 对于bytes1 … bytes32,使用带引号的十六进制字符串,比如对于bytes3,输入"0xabcdef"
    • 对于bytes,使用十六进制字符串数组,比如:["0xab", "0xcd", "0xef"]
    • 对于strings,要确保带有引号。
    • 对于很大的数,也要确保带有引号。
    • 对于任意一个数组,使用[],比如:["hello", 42, "0xabcd"]
  5. 点击函数获取结果。结果是编码后的应用程序二进制接口(ABI

下面是示例截图:

||
||

回答发布于 2018-09-03 15:43:20

其中一种方法是使用Remix——基于浏览器的Solidity实时编译器并且可以运行solidity(以前命名为browser-solidity)。

  1. 将代码粘贴到Remix
  2. 如果需要的话可在合约内包括一个函数(例如:contract C { ... }
  3. 点击Contract按钮和create来实例化合约
  4. 给函数输入满足预设要求的输入值:
    • 对于bytes1 … bytes32,使用带引号的十六进制字符串,比如对于bytes3,输入"0xabcdef"
    • 对于bytes,使用十六进制字符串数组,比如:["0xab", "0xcd", "0xef"]
    • 对于strings,要确保带有引号。
    • 对于很大的数,也要确保带有引号。
    • 对于任意一个数组,使用[],比如:["hello", 42, "0xabcd"]
  5. 点击函数获取结果。结果是编码后的应用程序二进制接口(ABI

下面是示例截图:

||
||

回答发布于 2018-09-03 15:43:19

这里有不少方法可以测试Solidity合约。至少在我看来,最简单的就是使用Truffle进行黑盒测试。合约往往相对较小且独立,因此黑盒测试用在这里似乎是很合适的。

Truffle允许你使用Pudding在Javascript中编写单元测试,Pudding是web3,MochaChai的扩展。 典型的测试如下所示:

contract('MetaCoin', function(accounts) {
  it("should put 10000 MetaCoin in the first account", function(done) {
    // Get a reference to the deployed MetaCoin contract, as a JS object.
    var meta = MetaCoin.deployed();

    // Get the MetaCoin balance of the first account, and assert that it's 10000.
    meta.getBalance.call(accounts[0]).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    }).then(done).catch(done);
  });
});
||
||

回答发布于 2018-09-03 15:43:18

我自己使用Dapple编写Solidity单元测试。它的优点是不需要Javascript测试框架层,所以你可以完全保持Solidity。另外我可以用它来测试使用导入功能的合约——但我不确定在chriseth的在线solidity编译器中是否可行。

编注:对于想要了解语言的人来说,已被接受的答案绝对是一个更好的选择。但我仍然坚持认为Dapple对于像我这样的人(喜欢停留于命令行并且想要快速测试一些代码,使得一些语言的灰暗角落能够再现光芒)来说是一个更好的选择。(你可能很轻易地就低估了我对命令行的偏好。这是有点荒谬——延伸到敲出短脚本,从而使得我可以在无需切换到浏览器的情况下检查网站。)

也就是说,自从回答这个问题后,我发现了一个名为Solidity REPL的工具,它完全符合其名称的含义:在命令行中为你提供Solidity REPL。为了对某种语言进行快速且全面的检验,就像使用Python语言一样,我建议使用Dapple上的工具。

||
||

回答发布于 2018-09-03 15:43:17

另一个选择是使用EthereumJ来实现。 我们最近发布了1.2.0版,它具有很好的功能,特别适合这种情况。 您可以从这里查看样本。

StandaloneBlockchain bc = new StandaloneBlockchain();

SolidityContract contract = bc.submitNewContract(
       "contract A { uint a; ... }"
);

contract.callFunction("funcName", "arg1", 2, new byte[] {1,2,3}, "arg4");
bc.createBlock()

System.out.println("Result: " + contract.callConstFunction("getResultFunc"));
||
||

回答发布于 2018-09-03 15:43:15

如果你只是在寻找一种快速测试代码并可在浏览器中运行的方法,那么你可以试一下https://ethfiddle.com/ (披露一下:我是建立它的团队中的一员。)

我发现Remix的用户界面很复杂,在很多情况下都是过于复杂,大多数时候我想做的就是:1)快速运行并测试我在网上发现的一些合约代码,2)与其他人分享合约代码而不需要他们为了运行它而到其他地方去复制/粘贴。 因此,我们构建了一个主要关注于简单性和共享性的替代方案。

下面是一个快速演示:

||
||

回答发布于 2018-09-03 15:43:15

如果您只对solidity感兴趣,那么正如已经回答过的那样,Dapple可以为单元测试提供最好的框架。

但是如果你在.Net/Nethereum中开发,那么你可以按照solidity合约进行集成测试:

var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var test = contract.GetFunction("test4"); Assert.True(await test.CallAsync<bool(BigInteger.Parse("3457987492347979798742")));

你可能需要将智能合约部署到你的测试网络上。 在上面的示例所示,我们已经知道了ABI(存储在一个字符串中),并且我们使用合约地址来初始化合约。

测试合约中的事件也很重要,例如在ERC20上,转移事件(Transfer event)可以如下进行测试:

var allTransfersFilter = await transfersEvent.CreateFilterAsync(new BlockParameter(3000)); var eventLogsAll = await transfersEvent.GetAllChanges<Transfer>(allTransfersFilter);

 Assert.Equal(1, eventLogsAll.Count); var transferLog = eventLogsAll.First(); Assert.Equal(transferLog.Log.TransactionIndex.HexValue, transferReceipt.TransactionIndex.HexValue); Assert.Equal(transferLog.Log.BlockNumber.HexValue, transferReceipt.BlockNumber.HexValue); Assert.Equal(transferLog.Event.AddressTo, newAddress); Assert.Equal(transferLog.Event.Value, (ulong)1000);

如上所示,我们正在检索事件,验证交易和特定事件属性,例如发送金额的地址和值。

||
||

回答发布于 2018-09-03 15:43:12

恕我直言,能够实现快速测试、代码调试并直接使用的最简单的方法就是solidity-repl,因为它的目标就是Solidity代码的快速测试。

我相信该项目会就你问的问题做出最好的回应,并且说实话,我感觉到你在考虑自己所写的问题的答案时带着一种偏见,以便你能够接受它。 如果不出意料的话,那个问题中的remix标签就是一个很有说服力的指示。:)

因此,虽然你对自己问题的“预期答案”标准是有自己想法的并且不容置疑,但我仍然在这里建议solidity-repl,因为可能会有其他人在这里考虑类似的问题并可以从中找到更合适的工具 。

||
||

回答发布于 2018-09-03 15:43:11

首先,我会建议你在一个集成开发环境(IDE)中编写代码,比如Sublime Text。然后我会使用Remix来测试自己代码的语法是否正确,并且它会编译代码。虽然人们也提到使用Truffle,但是在我看来它只是改变了学习曲线。Truffle在背后使用testrpc,你可以单独设置和使用它们。 我建议你花时间学习系统学习一下。

总而言之,testrpc只是模拟功能。 我还是要建议你在“真实”的环境中测试你的合约。 Ropsten测试网络对这个来说是最好的测试网络。

EthTools.com(我们公司建立了这个)有一个工具,用于向区块链上提交合约,然后与它们进行交互。 你可以通过与合约交互来验证合约中的函数是否有效以及是否获得了正确的响应。 你可以在ropsten测试网络或主网上执行此操作(根据你的需求)。

这是一些视频链接:

||
||