1. 程式人生 > >區塊鏈初探

區塊鏈初探

  • 編寫簡單的智慧合約,並在remix下進行除錯
    • 智慧合約
      pragma solidity ^0.4.0;
      
      contract SimpleContract {
          string message;
          
          function setMessage(string x) public{
              
              message = x;
          }
          
          function getMessage() constant public returns (string) {
              
              return message;
          }
      }
      
    • 編譯合約
      • 選擇合適的編譯器版本
      • 點選右側欄的Compile模組下的Start to compile按鈕進行編譯,同時編譯成功可以在Run中模擬執行。
        preview
    • 部署合約
      部署合約就是將編譯好的合約位元組碼通過外部賬號傳送交易的形式部署到以太坊區塊鏈上。
      步驟:
      • compile頁面編譯成功後點擊Details按鈕,出現浮層頁面在浮層中找到WEB3DEPLOY , 將WEB3DEPLOY中的內容複製。

      • 將智慧合約直接貼上到命令列(console)

        var simplecontractContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"x","type":"string"}],"name":"setMessage","outputs":[],"payable":false,"type":"function","stateMutability":"nonpayable"},{"constant":true,"inputs":[],"name":"getMessage","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"}]);
        var simplecontract = simplecontractContract.new(
        {
            from: web3.eth.accounts[0], 
            data: '0x606060405261028f806100126000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063368b877214610047578063ce6d41de146100a257610042565b610002565b34610002576100a06004808035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091905050610122565b005b34610002576100b460048050506101d3565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156101145780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017157805160ff19168380011785556101a2565b828001600101855582156101a2579182015b828111156101a1578251826000505591602001919060010190610183565b5b5090506101cd91906101af565b808211156101c957600081815060009055506001016101af565b5090565b50505b50565b602060405190810160405280600081526020015060006000508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102805780601f1061025557610100808354040283529160200191610280565b820191906000526020600020905b81548152906001019060200180831161026357829003601f168201915b5050505050905061028c565b9056', 
            gas: '4700000'
        }, function (e, contract){
            console.log(e, contract);
            if (typeof contract.address !== 'undefined') {
                console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
            }
        })
        

        10

        • 出現報錯,進行部署之前,先將交易的賬號進行解鎖,不然會出現錯誤

          personal.unlockAccount(eth.accounts[0])
          

          8

      • 再次進行貼上,沒有報錯了

        11

      • 檢查一下交易池,檢視當前交易的待處理狀況:

        txpool.status
        

        12
        看到當前的交易池中有一個交易正在等待確認。然後,我們檢視待確認交易的詳細內容:

        eth.getBlock("pending",true).transactions
        

        13
        檢視區塊資訊與我們之前所設定的相同。

        • from資料項就是我們傳送交易的地址
        • input就是合約編譯完成的位元組碼
        • 新的交易建立在第3號區塊中
      • 檢視日誌

        INFO [11-03|02:52:58.543] Submitted contract creation              fullhash=0x16acefe5b61cff177b3cc65d21237594913bdd7e0c71d97200a42db22147f55d contract=0xE87619e16Aa3d2fd7BeA8A18Bb770b8B1Fd808b8
        

        說明交易已經發送到區塊鏈中了,正在等待礦工的確認,確認後才真正完成智慧合約的部署

        • 注意:接下來要開始挖礦(miner.start(1))
    • 呼叫智慧合約
      • 使用一個在某個地址上已經存在的合約
        • simplecontract是合約物件,通過建立合約的交易來部署合約,是第一個合約
        • simplecontract.address 得到之前部署了的合約的合約地址
        • testcontract為合約物件,通過交易修改合約的資料。
        // instantiate by address
        testcontract = simplecontractcontract.at(simplecontract.address)
        
        14
      • 呼叫
        如果呼叫的智慧合約函式需要合約中的資料, 則需要消耗以太坊gas,否則不需要消耗。由於需要修改合約中的資料, 呼叫setMessage()時需要使用sendTransaction()發起交易, 並附加發起者的賬號. 以上操作只是發起了交易, 但交易並不一定會被處理. 交易被處理還必須要有節點處於挖礦模式。想要獲取到修改後的資料,必須等到交易完成後,getMessage才可以獲取到修改後的資料。
        • 呼叫setMessage方法

          testcontract.setMessage.sendTransaction("sysu", {from:eth.accounts[0]})
          

          15
          解決方法與之前一樣,只需要解鎖一下賬號就可以了
          16
          17
          返回的值傳送的交易的hash值
          檢視交易池資訊以及詳細的交易資訊
          18
          然後開始挖礦 - miner.start(1)

        • 呼叫getMessage方法

          19