聊一聊區(qū)塊鏈技術(shù)的開發(fā)
本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室 」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。
概述
本文將向大家提供有關(guān)區(qū)塊鏈技術(shù)開發(fā)入門時(shí)應(yīng)該了解的一切的簡(jiǎn)要概述,在這里給大家展示的是學(xué)習(xí)區(qū)塊鏈應(yīng)用程序開發(fā)的基礎(chǔ)知識(shí),由區(qū)塊鏈提供支持的去中心化應(yīng)用程序(Dapps)。
有許多不同的區(qū)塊鏈為我們的Dapp提供動(dòng)力,而最大的就是我們所知的以太坊。
為了與以太坊生態(tài)系統(tǒng)進(jìn)行交互,則需要一個(gè)以太坊錢包和一些以太坊。Metamask,是最受歡迎的以太坊錢包之一。
以太坊錢包分為三個(gè)部分:
- 以太坊賬戶-可以發(fā)送和接收以太坊的實(shí)體
- 公鑰-用戶可以將以太坊發(fā)送給的地址
- 私鑰—訪問您的以太坊
使用以太坊錢包與以太坊網(wǎng)絡(luò)中的Dapp進(jìn)行交互,假設(shè)您想將以太坊交易為另一種加密貨幣,您可以通過去中心化交易所Uniswap進(jìn)行交易來(lái)做到這一點(diǎn)。
Uniswap由以太坊區(qū)塊鏈提供支持,它基于智能合約所運(yùn)行,而智能合約,它是區(qū)塊鏈上的程序。
智能合約包括三個(gè)主要部分:
- 用戶-使用智能合約的人。
- 代碼-使用智能合約時(shí)會(huì)發(fā)生什么。
- 存儲(chǔ)-智能合約將更改的對(duì)象。
Dapp是用許多智能合約編寫的,例如:Uniswap是由許多智能合約提供支持的Dapp。
Dapps在Web開發(fā)中可與后端或服務(wù)器端相媲美,客戶端將連接到以太坊虛擬機(jī)上的智能合約,而不是連接到集中式服務(wù)器。
那么,我們?nèi)绾螢镈app創(chuàng)建智能合約?
引入Solidity
Solidity是一種用于EVM的高級(jí)編程語(yǔ)言,您可以在Solidity中編寫智能合約。
我們將探索智能合約的一些基本語(yǔ)法和一般結(jié)構(gòu),然后將為自己的令牌編寫一個(gè)簡(jiǎn)單的合同。
如果您熟悉另一種編程語(yǔ)言,您會(huì)發(fā)現(xiàn)一些問題,
- 布爾值—正確或錯(cuò)誤
- Uint —整數(shù)(數(shù)字確定X冪的大小)
- 地址-以太坊地址
- 字符串—文本
這是您將在Solidity中使用的基本數(shù)據(jù)結(jié)構(gòu),
- 數(shù)組-從零開始的項(xiàng)目列表(可以是固定數(shù)字或動(dòng)態(tài)數(shù)字)
- 映射—存儲(chǔ)具有鍵值對(duì)的數(shù)據(jù)
- 結(jié)構(gòu)-用于定義存儲(chǔ)變量的新方法
- 枚舉-創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)
設(shè)置可見性是智能合約開發(fā)的重要組成部分,這樣您的私人地址將不為公開,而這些關(guān)鍵字可以應(yīng)用于變量和函數(shù),
- 公開-任何人都可以調(diào)用此功能
- 私人-只有合同可以調(diào)用此功能
- 查看—此函數(shù)返回?cái)?shù)據(jù)且不修改數(shù)據(jù)
- 純-函數(shù)將不會(huì)修改,甚至不會(huì)讀取合同的數(shù)據(jù)
- 應(yīng)付賬款—功能可以接收以太坊
您將大量使用公共和私人的資源,擁有這些,我們就可以開始編寫一些代碼了。
制作MediumToken
首先,我們使用Pragma關(guān)鍵字聲明solidity的版本,然后將Solidity指定為編譯器以及什么版本。
讓我們來(lái)看一個(gè)例子:
- pragma solidity >=0.4.22 <0.6.0;
這是開發(fā)過程中的重要一步,編寫驚人的智能合約只是為了發(fā)現(xiàn)編譯器不能與您使用的Solidity版本配合使用。
我們將為Medium創(chuàng)建一個(gè)令牌,我們稱它為MediumToken。
接下來(lái),我們需要實(shí)際聲明合同。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- }
這里只需添加令牌的基本結(jié)構(gòu)即可。
智能合約需要具有構(gòu)造函數(shù),當(dāng)我們的代碼部署到區(qū)塊鏈時(shí),該功能將運(yùn)行一次。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- }
- }
在這里,我們聲明的地址變量等于msg.sender,這是調(diào)用該函數(shù)的人員的地址。又是你
在構(gòu)造函數(shù)中,我們需要做的另一件事是鑄造MediumTokens,設(shè)置電源。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- }
此時(shí)您鑄造了420個(gè)MediumToken,該數(shù)字是您想要的任何數(shù)字。構(gòu)造函數(shù)運(yùn)行后,我們需要?jiǎng)?chuàng)建所有余額的映射。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- }
這是一個(gè)公共映射,意味著任何人都可以看到它并與其進(jìn)行交互。
接下來(lái),我們需要編寫一個(gè)函數(shù),該函數(shù)將允許用戶發(fā)送其MediumToken。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- function send(uint amount, address recipient) public {
- require(balances[msg.sender] >= amount);
- require(balances[msg.sender] -amount <= balances[msg.sender]); require(balances[recipient] + amount >= balances[recipient]);
- balances[msg.sender] -= amount; // Always subtract first balances[recipient] += amount; // Add amount to recipient
- }
- }
讓我們分解一下,我們的send函數(shù)將接受uint形式的金額,它還可以接受收件人的地址,而且此功能將是公開的,因此任何人都可以看到它。
此時(shí)我們要做的第一件事是創(chuàng)建一些require語(yǔ)句,這樣我們就可以檢查發(fā)送者的錢包中是否確實(shí)有令牌數(shù)量。
另外2項(xiàng)要求聲明是安全措施,第一個(gè)是確保發(fā)送方在發(fā)送令牌后的余額小于或等于;第二個(gè)是確保收款人的地址大于或等于交易前的地址。
- require(balances [msg.sender] -amount <= balances [msg.sender]);
如上述操作,我們創(chuàng)建了420個(gè)MediumToken,將它們分配給所有者,并創(chuàng)建了將其發(fā)送出去的功能!
如果您想再次查看它,這是完整的代碼。
- pragma solidity >=0.4.22 <0.6.0;
- contract MediumToken {
- constructor() public {
- address owner = msg.sender;
- balance[owner] = 420; }
- mapping (address => uint256) public balances;
- function send(uint amount, address recipient) public {
- require(balances[msg.sender] >= amount);
- require(balances[msg.sender] -amount <= balances[msg.sender]); require(balances[recipient] + amount >= balances[recipient]);
- balances[msg.sender] -= amount; // Always subtract first balances[recipient] += amount; // Add amount to recipient
- }
- }
如果您完成了最終合同,您就可以將其部署到區(qū)塊鏈上。