渡过了一个愉快的周末后回来继续踩坑.
显然, 上次的问题是因为编译器的版本不匹配造成的. 现在我有两个选择, 一个是寻找视频中的 solc 版本的下载方法, 从而无缝衔接视频中的教程. 但这样子做就少了好多的趣味性, 一昧的跟着视频敲代码并不是我希望的. 于是我选择了一条更坑的道路.
调整智能合约的编译版本
pragma solidity ^0.4.17;
→
pragma solidity ^0.5.4;
这样做之后编译器不再报版本不匹配的错误了. 取而代之的是报了一个更加难懂的错误.
'Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use"constructor(...) { ... }"to define it.',
跟着视频敲的代码也是会报错的
从这行报错中应该可以看到智能合约的语法是多么的不成熟, 以前定义构造方法的方式, 在最新版本中已经不能使用了 (坑爹呢).
取而代之的是 constructor 限定词 (我也不知道这个词应该算作限定词还是方法名, 感觉它更类似 PHP 语法中的魔术方法)
尝试着照着它给的提示修改构造方法, 如下:
- constructor(string _message) public{
- message = _message;
- }
调用 compile.JS 后不再出现构造方法的问题 (运气真好:)).
等等, 为什么后面的 get/set 方法还报错了.
报错信息如下:
- 'compile.sol:9:25: TypeError: Data location must be"memory" for parameter in function, but none was given.\n
- function setMessage(string _message) public{\r\n --------------\n',
有了上面的经验后我觉得这个错误应该是编译器升级后引入的新的语法造成的, 从报错信息可以看出在代码
function setMessage(string _message)
缺乏限定词 "memory", 因此编译不给我通过.
但这个限定词应当加在哪里好呢, 是放在 function 前后还是放在 string 前后还是放在方法名前后还是放在括号前后呢?
我总不可能去一一尝试过去, 拷贝了错误信息贴到谷歌上, 在 StackExchange https://ethereum.stackexchange.com/ 中找到了答案
modify all input parameter "string" to "string memory". problem solved... but I don't know the reason - TLHBMNov 23'18 at 11:02
原来需要将 string 修改为 string memory 就可以解决问题了.
愉快的将原来的 sol 文件修改为如下
- pragma solidity ^0.5.4;
- contract Inbox{
- string public message;
- constructor(string memory _message) public{
- message = _message;
- }
- function setMessage(string memory _message) public{
- message = _message;
- }
- function getMessage() public view returns(string memory){
- return message;
- }
- }
执行 node compile.JS. 控制台打印出了 output 中的内容
- {
- contracts: {
- 'compile.sol': {
- Inbox: [Object]
- }
- },
- sources: {
- 'compile.sol': {
- id: 0
- }
- }
- }
感觉这次似乎是成功了.
于是打开 compile.JS 中注释的代码
- for (var contractName in output.contracts['compile.sol']) {
- console.log(contractName + ':' + output.contracts['compile.sol'][contractName].evm.bytecode.object)
- }
再次执行编译脚本后成功的打印出了智能合约的二进制码.
- Inbox: 608060405234801561001057600080fd5b506040516105a63803806105a68339810180604052602081101561003357600080fd5b8101908
- 0805164010000000081111561004b57600080fd5b8281019050602081018481111561006157600080fd5b815185600182028301116401000000008
- 211171561007e57600080fd5b5050929190505050806000908051906020019061009c9291906100a3565b5050610148565b8280546001816001161
- 56101000203166002900490600052602060002090601f016020900481019282601f106100e457805160ff1916838001178555610112565b8280016
- 0010185558215610112579182015b828111156101115782518255916020019190600101906100f6565b5b50905061011f9190610123565b5090565
- b61014591905b80821115610141576000816000905550600101610129565b5090565b90565b61044f806101576000396000f3fe608060405234801
- 561001057600080fd5b506004361061005e576000357c010000000000000000000000000000000000000000000000000000000090048063368b877
- 214610063578063ce6d41de1461011e578063e21f37ce146101a1575b600080fd5b61011c6004803603602081101561007957600080fd5b8101908
- 08035906020019064010000000081111561009657600080fd5b8201836020820111156100a857600080fd5b8035906020019184600183028401116
- 40100000000831117156100ca57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828
- 437600081840152601f19601f820116905080830192505050505050509192919290505050610224565b005b61012661023e565b604051808060200
- 1828103825283818151815260200191508051906020019080838360005b8381101561016657808201518184015260208101905061014b565b50505
- 050905090810190601f1680156101935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101a
- 96102e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101e95780820151818401526
- 020810190506101ce565b50505050905090810190601f1680156102165780820380516001836020036101000a031916815260200191505b5092505
- 05060405180910390f35b806000908051906020019061023a92919061037e565b5050565b606060008054600181600116156101000203166002900
- 480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102d6578
- 0601f106102ab576101008083540402835291602001916102d6565b820191906000526020600020905b8154815290600101906020018083116102b
- 957829003601f168201915b5050505050905090565b60008054600181600116156101000203166002900480601f016020809104026020016040519
- 0810160405280929190818152602001828054600181600116156101000203166002900480156103765780601f1061034b576101008083540402835
- 29160200191610376565b820191906000526020600020905b81548152906001019060200180831161035957829003601f168201915b50505050508
- 1565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103bf57805160ff191683800
- 11785556103ed565b828001600101855582156103ed579182015b828111156103ec5782518255916020019190600101906103d1565b5b509050610
- 3fa91906103fe565b5090565b61042091905b8082111561041c576000816000905550600101610404565b5090565b9056fea165627a7a72305820f
- 4da336af6f23e9e9a00e388dbcb9a573e2a590730e4c623917ab8bff1240ed00029
虽然好像有点凑字数之嫌, 但真的挺有成就感的.
来源: http://www.jianshu.com/p/45405a56832c