以太坊:從入門到實踐
- 以太坊簡介
- 智能合約
- EVM
- 實踐
- Solidity撰寫合約
- Truffle配置
- Metamask
- Web3
- 部署與測驗
以太坊簡介
以太坊是一個開放的有智能合約功能的公共區塊鏈平臺,通過其專用加密貨幣以太幣提供以太虛擬機處理去中心化合約應用,以太坊將其程式智能合約存盤于區塊鏈上,通過挖礦節點執行,將以太幣作為獎勵(gas)交付給礦工,具有圖靈完備性(可以解決所有的可計算問題),
智能合約
由于智能合約存盤在區塊鏈上,具有自己的賬戶地址,因此它是“規則公開透明,合約內的規則以及資料對外部可見;所有交易公開可見,不會存在任何虛假或者隱藏的交易”的公開透明程式,智能合約由交易驅動,每一筆發送給智能合約的交易都包含與合約相關的資訊,驅動合約代碼執行,由于智能合約具有賬戶,因此它不但可以處理資訊,還可以接受、儲存和發送價值,其作業示意圖如下:

圖靈完備的以太坊智能合約的功能幾乎沒有邊界,這使得其適用范圍也幾乎沒有邊界,
鑒于智能合約公平公開易監管不易癱瘓的特性,以智能合約開發的DAPP(去中心化應用)得到了廣泛應用,由于區塊鏈只能新增不能洗掉和修改,且附有強大的共識機制,使得智能合約抗干擾、可追溯的優勢更為突出,運行于以太坊上的智能合約代碼避免了中心化帶來的開銷和安全問題,使得DAPP成本低廉、運行高效,
智能合約編譯后會產生ABI(應用程式二進制介面),描述合約欄位名稱、欄位型別、方法名稱、引數名稱、引數型別、方法回傳值型別等,ABI介面為呼叫者提供函式屬性與引數屬性,同時可以與合約地址一起形成合約實體以便呼叫,
EVM
EVM(以太坊虛擬機)是一個完全獨立的沙盒,合約代碼可對外完全隔離并在EVM內部運行,EVM可以將區塊鏈主鏈與運行環境隔離,方便智能合約的創建與測驗,交易被輸入EVM后,EVM會確認轉賬是否有正確的數值,確認簽名的有效性以及是否轉賬nonce符合特定轉賬數量的nonce,如果有誤差,轉賬會被作為錯誤回傳,之后礦工運行節點會收取固定的gas,數額以交易位元組數為單位,在執行交易之前,交易會被轉化為合約型別,之后進入解釋器執行,執行的每一步均需要收取相應的gas.有了以太坊虛擬機和智能合約,你可以通過簡單地點擊按鍵,就可以在全球進行交易,而且還無需任何中介,因此也避免了多余的費用,
實踐
以太坊開發相關實踐主要集中在撰寫智能合約、部署智能合約以及與智能合約互動的程序中,智能合約的撰寫主要采用Solidity語言,可借助不同的框架等技術實作部署、測驗與互動,我在學習的程序中通過Metamask+Truffle+Ganache實作了部署與測驗,由于選擇Truffle的官方webpack專案測驗時缺少相應的引導吃了不少苦頭,這里講一下官方檔案沒有的東西,希望以后可以長進,
Solidity撰寫合約
Solidity官方檔案.
solidity語言與java、c++很像,只是有一些合約相關的變化,以下是官方代幣合約代碼,
pragma solidity >=0.4.21 <0.7.0;
import "./ConvertLib.sol";
contract MetaCoin {
mapping (address => uint) balances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
constructor() public {
balances[msg.sender] = 10000;
}
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfer(msg.sender, receiver, amount);
return true;
}
function getBalanceInEth(address addr) public view returns(uint) {
return ConvertLib.convert(getBalance(addr),2);
}
function getBalance(address addr) public view returns(uint) {
return balances[addr];
}
}
在代碼開頭先要宣告solidity版本,truffle使用編譯器版本為0.5.16,
pragma solidity >=0.4.21 <0.7.0;
truffle版本可以在truffle-config.js檔案中查到:
compilers: {
solc: {
version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version)
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
// settings: { // See the solidity docs for advice about optimization and evmVersion
// optimizer: {
// enabled: false,
// runs: 200
// },
// evmVersion: "byzantium"
// }
}
}
在該檔案中引入別的sol檔案需要顯示import并在部署時進行鏈接,否則會報錯,
import "./ConvertLib.sol";
鏈接代碼在migrations檔案夾下的js檔案中
deployer.link(ConvertLib, MetaCoin);
宣告合約,相當于類
contract MetaCoin {
event是動作介面,
event Transfer(address indexed _from, address indexed _to, uint256 _value);
Truffle配置
快速入門 Truffle.
找到truffle-config.js檔案修改埠號和網路id為Gnanche的埠號和網路id,可以在Ganache里自己設定,


Metamask
matamask.
提取碼:tf2f
metamask官網谷歌插件下載連接我怎么也打不開,這里提供一個下載,metamask是一個以太坊錢包,可以交易以太幣,這里主要將它作為web-provider連接web3.小狐貍很可愛,

小狐貍腦袋會隨游標移動而移動,
需要自定義連接的埠來連Ganache


具體內容同truffle配置,
Web3
Web3.js API 中文檔案
js代碼與合約互動采用web3.js
const networkId = await web3.eth.net.getId();
const deployedNetwork = metaCoinArtifact.networks[networkId];
this.meta = new web3.eth.Contract(
metaCoinArtifact.abi,
deployedNetwork.address,
);
互動的核心采用 web3.eth.Contract獲取合約實體,這樣就可以呼叫合約的方法了,
呼叫方法時如果沒成功,很有可能是部署不成功沒生成地址,可以看bulid檔案夾下相應的json檔案,拉到最底下找networks
"networks": {
"5777": {
"events": {},
"links": {
"ConvertLib": "0x3E6f048Ef226B131F1A9aB8a62FE5BC18F0397db"
},
"address": "0x1914d3349699a5EbF7383D95a93569E0B3288912",
"transactionHash": "0xa4a64381b4b11ca27892b9cd3b57a2aeb647d433be03676e981d655fe13b6e93"
}
},
如果是空的就是沒部署,
abi還可以直接復制粘貼到js檔案里,就在json檔案開頭,
部署與測驗
部署與測驗時我在官方專案中沒遇到問題,但在自己寫的專案中遇到了大量的問題,truffle通過編譯與部署后運行環境時遇到的大量問題困擾了我好幾天,見著拆招很是痛苦,在這里歸納一下,
npm ERR! code EPERM npm ERR! syscall unlink npm ERR! ERRNO -4048
更新npm無用,需要洗掉專案下的package-lock.json
WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' f
在webpack.config.js檔案中添加mode屬性即可,
'webpack-dev-server' 不是內部或外部命令,也不是可運行的程式 或批處理檔案,
這個遇到了很多次,有三種情況,第一種是npm install裝上包就沒事了,第二種是因為webpack與webpack-dev-server版本沖突,降到webpack3與webpack-dev-server2解決,偶爾直接npm install webpack-dev-server能直接裝好,大多數狀況不行,有時候會解決后出現另外的錯,
gyp ERR! build error gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.ex
cnpm install 解決,
gyp ERR! find Python
需要裝python2.7,框架不支持高版本python,
本文為哈爾濱工程大學計算機學院2021年區塊鏈技術課程課程設計選做內容,
作者為2018065816申富元
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/287212.html
標籤:區塊鏈
上一篇:位元幣——美元霸權的顛覆者
下一篇:Go函式名之前括號中的內容
