成都校區*精品*solidity面向對象使用(二)

目標

Solidity是一種面向對象的智能合約高級語言,運行在以太坊區塊鏈平臺的虛擬機(EVM)上。我們現在就使用它去編寫一個hello world 入門程序。

第一步

在命令行環境中輸入以下命令, 連接到以太坊測試網絡

geth --testnet --fast --cache=512 console

第二步

在 Geth 提示符下輸入以下代碼, 創建一個用戶並設置密碼

personal.newAccount()

第三步

在 Geth 提示符下輸入以下代碼, 確認新用戶的賬戶餘額為 0, 並開始”挖 礦”(mine)

eth.getBalance(eth.accounts[0]) miner.start()

第四步

新開一個命令行窗口並輸入以下命令, 將這個窗口連接到正在挖礦的窗口

geth attach

第五步

在 Geth 提示符下輸入以下代碼, 確認新用戶的賬戶餘額有所增長

eth.getBalance(eth.accounts[0])

第六步

使用智能合約的在線編譯器 https://ethereum.github.io/browser-solidity/編譯以 下代碼

[Bash shell]

contract HelloWorld

{

address creator;

string greeting;

function HelloWorld(string _greeting) public

{

creator = msg.sender;

greeting = _greeting;

}

function greet() constant returns (string)

{

return greeting;

}

function setGreeting(string _newgreeting)

{

greeting = _newgreeting;

}

/**********

Standard kill() function to recover funds

**********/

function kill()

{

if (msg.sender == creator)

suicide(creator); // kills this contract and sends remaining

funds back to creator

}

}

第七步

編譯器生成的代碼如下

[Bash shell]

var _greeting = /* var of type string here */ ;

var helloworldContract =

web3.eth.contract([{"constant":false,"inputs":[],"name":"kill","outputs

":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"n

ame":"_newgreeting","type":"string"}],"name":"setGreeting","outputs":[]

,"payable":false,"type":"function"},{"constant":true,"inputs":[],"name"

:"greet","outputs":[{"name":"","type":"string"}],"payable":false,"type"

:"function"},{"inputs":[{"name":"_greeting","type":"string"}],"type":"c

onstructor"}]);

var helloworld = helloworldContract.new(

_greeting,

{

from: web3.eth.accounts[0],

data:

'606060405260405161044e38038061044e833981016040528080518201919060200150

505b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff0

21916908302179055508060016000509080519060200190828054600181600116156101

000203166002900490600052602060002090601f016020900481019282601f1061009e5

7805160ff19168380011785556100cf565b828001600101855582156100cf579182015b

828111156100ce5782518260005055916020019190600101906100b0565b5b509050610

0fa91906100dc565b808211156100f657600081815060009055506001016100dc565b50

90565b50505b506103428061010c6000396000f360606040526000357c0100000000000

0000000000000000000000000000000000000000000009004806341c0e1b51461005257

8063a413686214610066578063cfae3217146100c15761004d565b610002565b3461000

2576100646004805050610141565b005b34610002576100bf6004808035906020019082

018035906020019191908080601f0160208091040260200160405190810160405280939

291908181526020018383808284378201915050505050509090919050506101d5565b00

5b34610002576100d36004805050610286565b604051808060200182810382528381815

18152602001915080519060200190808383829060006004602084601f0104600302600f

01f150905090810190601f1680156101335780820380516001836020036101000a03191

6815260200191505b509250505060405180910390f35b600060009054906101000a9004

73ffffffffffffffffffffffffffffffffffffffff1673fffffffffffffffffffffffff

fffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156101

d257600060009054906101000a900473fffffffffffffffffffffffffffffffffffffff

f1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b80600160005090

80519060200190828054600181600116156101000203166002900490600052602060002

090601f016020900481019282601f1061022457805160ff191683800117855561025556

5b82800160010185558215610255579182015b828111156102545782518260005055916

02001919060010190610236565b5b5090506102809190610262565b8082111561027c57

60008181506000905550600101610262565b5090565b50505b50565b602060405190810

16040528060008152602001506001600050805460018160011615610100020316600290

0480601f016020809104026020016040519081016040528092919081815260200182805

4600181600116156101000203166002900480156103335780601f106103085761010080

8354040283529160200191610333565b820191906000526020600020905b81548152906

001019060200180831161031657829003601f168201915b5050505050905061033f565b

9056',

gas: 4700000

}, function (e, contract){

console.log(e, contract);

if (typeof contract.address !== 'undefined') {

console.log('Contract mined! address: ' + contract.address + '

transactionHash: ' + contract.transactionHash);

}

})

設置顯示的字符串以及減少費用(gas)

var _greeting = "Hello World" ;

gas: 300000

第九步

將修改完的代碼複製到第四步的窗口中, 如果出現:

[Bash shell]

Error: account is locked undefined

錯誤的話, 則使用

personal.unlockAccount(eth.accounts[0], 'password')

命令將用戶解鎖.

第十步

等候一段時間之後, geth 窗口就會出現

Contract mined! address...,

表明合約 代碼發佈成功

第十一步

使用 helloworld.greet()命令來運行該合約

控制檯將會顯示“Hello World”

以上是入門demo,接著瞭解下基本概念。以太坊:

以太坊是一個開源的,分佈式的,基於區塊鏈技術的公共平臺,無需審查及第三方干擾即可運行應用程序。

智能合約:

智能合約僅僅是電腦程序。我們基於智能合約創建以太坊應用。請記住,雖然這個概念 現在隨著以太坊出現,但是它實際上是由 Nick Szabo 於 1996 年提出。

EVM:

EVM 是以太坊智能合約的沙盒運行時以及完全獨立的環境。這意味著每個在 EVM 中運 行的智能合約無法連接網絡、文件系統或者其他進程。簡稱以太坊虛擬機。

Gas:

鑑於以太坊是一個分佈式平臺,所以必須有一種方式來限定給定智能合約的可用資源, 否則可能會使得整個網絡的算力癱瘓。Gas 通過為 EVM 中執行的每個指令確定它的執行成 本來解決這個問題。一個重要的事情是,每筆發送到網絡中的交易都有一個“Gas 預算”。如 果預算的 Gas 用完了,交易將以失敗告終,但是這筆交易仍然會被開採到區塊鏈中。

Ether(ETH):

這是以太坊的加密數字貨幣。Gas/Ether 的動態兌換價格用來衡量一個操作將花費多少 ETH。執行交易所需支付的費用通過 Gas 用量與 Gas 價格相乘得出(計算所得的費用將使用 ETH 支付)。你可以將交易的 Gas 價格設置為任何值。但是,如果你設置的 Gas 價格太低的 話,沒有人會執行你的代碼。

賬戶:

每個賬戶都是由一個地址標識的。同一地址空間由兩種賬戶共享。一種是由公私鑰對控 制的外部賬戶,該賬戶通常由人擁有,用來存儲 ETH。另一種是由它存儲的代碼控制的合約 賬戶。這兩種賬戶之間存在一些差異,其中非常重要的一點,只有外部賬戶才能啟動交易。

交易:

交易是從一個賬戶發送到另一個賬戶的消息。你可以發送一筆交易給另一個賬戶以轉移 ETH。如果目的賬戶是合約賬戶,其代碼也將被執行。請注意,涉及代碼執行的每筆交易都 將在網絡中的所有節點上執行。此外,所有的代碼運行以及交易執行都將被記錄在以太坊區 塊鏈上。

結束語

入門的小demo,和基本的相關概念,就是今天所有的內容啦。下次內容將介紹搭環境,和開發一個基於以太坊的代幣。謝謝觀看。


成都校區*精品*solidity面向對象使用(二)


分享到:


相關文章: