智慧合約開發踩坑小計(3)
渡過了一個愉快的週末後回來繼續踩坑。
顯然,上次的問題是因為編譯器的版本不匹配造成的。現在我有兩個選擇,一個是尋找視訊中的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 中找到了答案
- modify all input parameter "string" to "string memory". problem solved... but I don't know the reason –TLHBM Nov 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
雖然好像有點湊字數之嫌,但真的挺有成就感的。