99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀你的第一個智能合約「Hello World」,好像也不是很智能
你的第一個智能合約「Hello World」,好像也不是很智能
2018-03-30
收藏

你的第一個智能合約「Hello World」,好像也不是很智能

在看過 我花了 99 個以太坊(Ethereum)來學(xué)智能合約開發(fā)(http://davidfnck.com/blockchain/ethereum-smart-contract-intro.html/) 之后,相信你對以太坊的整體開發(fā)有了一個全局的概念。

開發(fā)環(huán)境

Solidity 選擇

為了快速上手,我們用基于瀏覽器的方便版本來進行 Browser-Solidity(https://ethereum.github.io/browser-solidity)。

等練習(xí)之后,你想自己手動安裝一個,可以參考這里 Solidity 安裝指南(https://solidity.readthedocs.io/en/develop/installing-solidity.html),教程之后更新。

Geth 配置

Geth 是以太坊的客戶端,之前文章  中介紹過。

我的用的 Macbook,之前也安裝好了 Homebrew,所以裝起來非常方便。

brew tap ethereum/ethereum
brew install ethereum

這樣就算安裝完成了,下面開始吧。

啟動環(huán)境

利用 Geth 開始啟動一個以太坊(開發(fā)者)網(wǎng)絡(luò)節(jié)點:

geth --datadir testNet --dev console 2>> test.log

代碼解讀:

–dev 啟用開發(fā)者網(wǎng)絡(luò)(模式),開發(fā)者網(wǎng)絡(luò)會使用POA共識,默認(rèn)預(yù)分配一個開發(fā)者賬戶并且會自動開啟挖礦。
–datadir 后面的參數(shù)是區(qū)塊數(shù)據(jù)及秘鑰存放目錄。
testNet 第一次輸入命令后,它會放在當(dāng)前目錄下新建一個testNet目錄來存放數(shù)據(jù)。

console 進入控制臺
2>> test.log 表示把控制臺日志輸出到test.log文件

執(zhí)行完之后,就會進入到 Geth 控制臺,這時候就像 Python 界面一樣,有一個向右的小箭頭,如下圖:


這時候你可以看到,文件夾里面出現(xiàn)了這樣的文件:

為了更好的理解,建議新開一個命令行終端,實時顯示日志:

tail -f test.log

效果如下圖:

準(zhǔn)備賬戶

部署智能合約需要一個外部賬戶,我們先來看看分配的開發(fā)者賬戶,在控制臺使用以下命令查看賬戶:

th.accounts

    也可以使用personal.listAccounts查看賬戶。
再來看一下賬戶里的余額,使用一下命令:
eth.getBalance(eth.accounts[0])
eth.accounts[0]表示賬戶列表第一個賬戶
回車后,可以看到大量的余額,如:
1.15792089237316195423570985008687907853269… e+77

開發(fā)者賬戶因余額太多,如果用這個賬戶來部署合約時會無法看到余額變化,為了更好的體驗完整的過程,這里選擇創(chuàng)建一個新的賬戶。

創(chuàng)建賬戶

創(chuàng)建賬戶
使用以下命令創(chuàng)建賬戶:

> personal.newAccount("davidfnck")
davidfnck 為新賬戶的密碼,回車后,返回一個新賬戶。

這時我們查看賬戶列表:
> eth.accounts
可以看到賬戶數(shù)組你包含兩個賬戶,新賬戶在第二個(索引為1)位置。
現(xiàn)在看看賬戶的余額:
> eth.getBalance(eth.accounts[1])
0

回車后,返回的是0,新賬戶是0。結(jié)果如:

給新賬戶轉(zhuǎn)賬

我們知道沒有余額的賬戶是沒法部署合約的,那我們就從默認(rèn)賬戶轉(zhuǎn)1以太幣給新賬戶,使用以下命令(請使用你自己eth.accounts對應(yīng)輸出的賬戶):

eth.sendTransaction({
from:
'0x19c3a00836780bd96e787f92b0684beedcdbe216',
to:
'0xe837c346e8545907beae50a827b18734443ea685',
value:
web3.toWei(1, "ether")
})

在打開的tail -f test.log日志終端里,可以同時看到挖礦記錄

再次查看新賬戶余額,可以新賬戶有1個以太幣

解鎖賬戶

在部署合約前需要先解鎖賬戶(就像銀行轉(zhuǎn)賬要輸入密碼一樣),使用以下命令:

personal.unlockAccount
(eth.accounts[1],"davidfnck")
這一步很關(guān)鍵,如果你解鎖,你是無法進行以下操作的,會得到這樣的報錯。
Error: authentication needed: password or unlock undefined

編寫合約

現(xiàn)在我們來開始編寫第一個智能合約代碼,solidity代碼如下:

pragma solidity ^0.4.21;
contract hello {
 string greeting;
        
 function hello(string _greeting) public {
  greeting = _greeting;
            
 }

  function say()
  constant public returns (string) {
                return greeting;
 }

}

簡單解釋下,我們定義了一個名為hello的合約,在合約初始化時保存了一個字符串(我們會傳入hello world),每次調(diào)用say返回字符串。

把這段代碼復(fù)制到 Browser-Solidity,如果沒有錯誤,點擊Details獲取部署代碼,如下圖:

在彈出的對話框中找到WEB3DEPLOY部分,點拷貝,粘貼到編輯器后,修改初始化字符串為hello world。

部署合約

代碼如下:

var _greeting = "Hello World" ;
var helloContract = web3.eth.contract([
{"constant":true,"inputs":[],"name":"say",
"outputs":[{"name":"","type":"string"}],
"payable":false,"stateMutability":"view",
"type":"function"},
{"inputs":[{"name":"_greeting",
"type":"string"}],"payable":false,"
stateMutability":"nonpayable",
"type":"constructor"}]);
var hello = helloContract.new(
       _greeting,
    {
 from: web3.eth.accounts[1],
 data: '
 0x6060604052341561000f57600080fd5b604051610
 2b83803806102b88339810160405280805182019190
 5050806000908051906020019061004192919061004
 8565b50506100ed565b828054600181600116156101
 000203166002900490600052602060002090601f016
 020900481019282601f1061008957805160ff191683
 80011785556100b7565b82800160010185558215610
 0b7579182015b828111156100b65782518255916020
 0191906001019061009b565b5b5090506100c491906
 100c8565b5090565b6100ea91905b808211156100e6
 5760008160009055506001016100ce565b5090565b9
 0565b6101bc806100fc6000396000f3006060604052
 60043610610041576000357c0100000000000000000
 0000000000000000000000000000000000000009004
 63ffffffff168063954ab4b214610046575b600080f
 d5b341561005157600080fd5b6100596100d4565b60
 4051808060200182810382528381815181526020019
 1508051906020019080838360005b83811015610099
 57808201518184015260208101905061007e565b505
 05050905090810190601f1680156100c65780820380
 516001836020036101000a031916815260200191505
 b509250505060405180910390f35b6100dc61017c56
 5b60008054600181600116156101000203166002900
 480601f016020809104026020016040519081016040
 5280929190818152602001828054600181600116156
 101000203166002900480156101725780601f106101
 4757610100808354040283529160200191610172565
 b820191906000526020600020905b81548152906001
 019060200180831161015557829003601f168201915
 b5050505050905090565b6020604051908101604052
 806000815250905600a165627a7a72305820df2cce8
 777859296a1396a055f4c0801a5ec58702c4b96d3f3
 ccba1f6a752f340029',
 gas: '4700000'
           
 }, function (e, contract){
  console.log(e, contract);
  if (typeof contract.address !== 'undefined')
   {
   console.log('Contract mined! address: '
   + contract.address + ' transactionHash: '
   + contract.transactionHash);
                
  }
         
 }
 )

修改了以下幾點:

第1行:修改字符串為Hello World
第2行:修改合約變量名
第3行:修改合約實例變量名,之后可以直接用實例調(diào)用函數(shù)。
第6行:修改部署賬戶為新賬戶索引,即使用新賬戶來部署合約。
第8行:準(zhǔn)備付的gas費用,IDE已經(jīng)幫我們預(yù)估好了。
第9行:設(shè)置部署回調(diào)函數(shù)。

將該代碼直接拷貝到 Geth 控制臺的小箭頭后面,回車后,就會看到輸出:

說明合約已經(jīng)部署成功。

現(xiàn)在我們查看下新賬戶的余額:

> eth.getBalance(eth.accounts[1])
999999999999793757
比之前的少了。
運行合約
> hello.say()
"Hello World"

輸出Hello World,我們第一個合約Hello World,成功運行了。

到此為止,你的第一個智能合約就完成了,是不是很簡單,確實好像也沒多智能,比其他的好像還要復(fù)雜,不過確實能夠幫助你來了解一下整個的開發(fā)過程了。

如何掌握區(qū)塊鏈技術(shù)

區(qū)塊鏈創(chuàng)新的推動以及數(shù)字經(jīng)濟的蓬勃發(fā)展離不開人才的培育,而CDA數(shù)據(jù)分析師作為行業(yè)的領(lǐng)頭羊,緊密結(jié)合當(dāng)前區(qū)塊鏈發(fā)展實際與人才需求結(jié)構(gòu),重磅推出CDA區(qū)塊鏈學(xué)院。

掃描二維碼,進入 CDA 區(qū)塊鏈學(xué)院,學(xué)習(xí)區(qū)塊鏈知識,選擇很多,站對未來

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }