Skip to main content

為智能合約加入新功能

我們在HelloWorld.sol中再加入一個echo方法,echo方法接受輸入一個參數,並回傳傳送的參數。

function echo(string name) constant returns (string) {
return name;
}

修改後的合約畫成UML圖如下

{% plantuml %} class HelloWorld {

  • sayHello()
  • echo() } {% endplantuml %}

新的echo方法中傳入了一個name參數。我們也為echo方法加入一個constant宣告,表示呼叫這個方法並不會改變區塊鏈的狀態。如此一來,透過truffle-contract來呼叫此方法時,會自動選用call來呼叫,也不需要額外提供gas。

由於更新了合約內容,我們需要先重新新編譯一次,將編譯結果部署到testrpc上,再透過truffle console執行看看結果。

$ truffle compile
...
$ truffle migrate --reset
...
$ truffle console
> let contract
> HelloWorld.deployed().then(instance => contract = instance)
> contract.echo("yo man")
'yo man'
>

echo方法確實將我們輸入的內容回傳了。同時因為宣告了constant,我們不需要直接呼叫call()方法,truffle會自動選用call來呼叫。

另一點需要注意的,是這次如果還是用truffle migrate命令,我們會得到如下訊息:

$ truffle migrate
Using network 'development'.

Network up to date.

Truffle會告訴你現在網路上的合約都已是最新的,但事實上剛剛程式中新增的方法並沒有更新到區塊鏈上。要更新區塊鏈上已部署的程式,需要改寫migrations中的腳本,但現在還不到介紹migration的時候。還好我們開發用的區塊鏈是怎麼修改都沒關係的ganache-cli,可以使用truffle migrate --reset命令直接重新在ganache-cli上部署一次🎉。

使用truffle develop命令 {#使用truffle-develop命令}

truffle 4.0.0 版本之後加入了truffle develop命令。這個命令讓我們不需要另外安裝ganache-cli等環境,就能直接上手開發。

例如

truffle develop
Truffle Develop started at http://localhost:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

truffle(develop)> compile
truffle(develop)> migrate
Using network 'develop'.
Running migration: 1_initial_migration.js
Deploying Migrations...
...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying HelloWorld...
...
Saving artifacts...
truffle(develop)> let contract
truffle(develop)> HelloWorld.deployed().then(instance =>contract = instance)
...
truffle(develop)> contract.sayHello.call()
'Hello World'

可以看到,在命令行中輸入truffle develop命令,可以直接在裡面執行compilemigrate指令,還可以直接使用console命令所提供的與區塊鏈互動等功能。

結語 {#結語}

本篇設計的範例1相當簡單,但已快速⚡地帶大家走一遍完整的智能合約開發流程。要透過智能合約實現各種功能,可以進一步參考Solidity by exampleTruffle getting started 網站學習更多的內容。

參考資料