中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

以太坊智能合約的DApp怎么實現

發布時間:2021-12-29 14:20:26 來源:億速云 閱讀:153 作者:iii 欄目:互聯網科技

本篇內容介紹了“以太坊智能合約的DApp怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

梳理一下架構關系:

web3.js與以太坊通信是通過rpc的方式實現的。

以太坊節點本來提供了rpc的訪問方式,但是因為以太坊節點的地址不確定,并且DApp需要訪問錢包,所以用web3.js直接訪問以太坊節點的rpc服務是不現實的。

ganache-cli模擬了一個以太坊的測試節點并提供對外的rpc訪問方式(就是例子里經常說的http://localhost:7545或者http://localhost:8545)。同時在其中內置了M個以太坊帳號,用于測試。

MetaMask是一個以太坊的網絡錢包插件,它也提供了web3的訪問方式。而且可以通過這個插件指定后面的以太坊節點是什么。因為MetaMask是個錢包插件,所以解決了DApp中的支付問題。所以現在的DApp都依賴它。

有一個以太坊教程,是在線學習的,大家可以去看看,如果自己本機上搞,開發DApp的基本過程都是一樣的如下:

1、安裝NodeJS

2、安裝truffle:一個開發DApp的開發框架

nmp install -g truffle

3、安裝Ganache(原來用testrpc):在內存中模擬以太坊運行并對外提供rpc服務。

npm install -g ganache-cli

4、運行ganache-cli

ganache-cli

5、生成一個DApp的項目

mkdir project1

truffle init

如果想用truffle中的某個例子,可以用

truffle unbox pet-shop

“pet-shop”是例子名稱

6、編寫智能合約

具體如何用solidity編寫智能合約可參考各種文章,這里不再重復。

編寫好的智能合約的Project1.sol文件放到contracts目錄下

7、編譯和部署智能合約

在migrations目錄下創建文件2_deploy_contracts.js:

var Project1 = artifacts.require("Project1");

module.exports = function(deployer) {
  deployer.deploy(Project1);
};

之后執行:

truffle compile

truffle migrate

如果你的智能合約沒有問題的話,現在你的以太坊智能合約應該已經部署到你用來測試的ganache中去了。

這里可能遇到的問題是:默認的truffle生成的項目,測試用的ganache的地址和端口會被設置成http://localhost:7545,而實際上執行ganache-cli之后的服務端口是http://localhost:8545,需要在truffle.js中修改一下:

module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// for more about customizing your Truffle configuration!
networks: {
development: {
host: “127.0.0.1”,
port: 7545,   //改成8545
network_id: “*” // Match any network id
}
}
};

8、編寫前端的js代碼跟以太坊交互

通常需要如下的輔助js庫:

<!– jQuery (necessary for Bootstrap’s JavaScript plugins) –>
<script src=”js/jquery.min.js”></script>
<!– Include all compiled plugins (below), or include individual files as needed –>
<script src=”js/bootstrap.min.js”></script>
<script src=”js/web3.min.js”></script>
<script src=”js/truffle-contract.js”></script>

在此基礎上,編輯你自己業務邏輯的js,通常命名為app.js,app.js的框架如下:

App = {
web3Provider: null,
contracts: {},

init: function() {

//初始化你自己的頁面、變量等

return App.initWeb3();
},

initWeb3: function() {
/*
* 初始化web3:
*/
if (typeof web3 !== ‘undefined’){

//如果你的瀏覽器安裝了MetaMask的錢包插件,那么插件會賦值web3.currentProvider
App.web3Provider = web3.currentProvider;
}
else
{

//如果沒裝插件,那么創建一個基于Http的provider,這里用到的就是用ganache-cli啟動所提供的rpc服務,因為ganache-cli啟動的時候綁定的是localhost,所以測試所使用的瀏覽器也要在本機。(如何讓ganache-cli綁定其他地址我還沒找到)
App.web3Provider = new Web3.providers.HttpProvider(‘http://localhost:8545’);

}
web3 = new Web3(App.web3Provider);

return App.initContract();
},

initContract: function() {
/*
* 初始化智能合約,實際上就是為你的智能合約創建一個對應的js對象,方便后續調用
*/

//通常的做法是使用你的智能合約編譯之后生成的abi的json文件,該文件在用truffle compile之后,生成在build/contracts/目錄下,因為我用了一個Division.sol,所以用Division.json,你可以根據你的實際情況來寫。
$.getJSON(‘Division.json‘, function(data) {
var DivisionArtifact = data;
App.contracts.Division = TruffleContract(DivisionArtifact);
App.contracts.Division.setProvider(App.web3Provider);
//用智能合約中的信息來更新你的web應用,App.refreshPlots()是我例子中獲取智能合約中信息并更新UI的函數

return App.refreshPlots();
});

return App.bindEvents();
},

bindEvents: function() {

/*
* 事件綁定,這個可以根據你的UI來設置,例子中就是綁定一個button的點擊操作
*/

$(document).on(‘click’, ‘.btn-adopt’, App.handlePlot);
},

refreshPlots: function(plots, account) {
/*
* 這個函數就是上面initContract中調用的用智能合約更新頁面
*/

        //繼續使用division這個智能合約做例子
         var divisionInstance;
         App.contracts.Division.deployed().then(function(instance){
                 divisionInstance = instance;
                 //getGenPlots是Division的這個智能合約的一個查詢函數(不需要gas),需要3個參數
                 return divisionInstance.getGenPlots(0,0,2);
         }).then(function(results){
                 //注意:這個地方有點意思,我原先理解也有問題,后來打印輸出才搞明白
                 //智能合約返回的多個結果變量在這里就是一個results數組
                 //數組的每個成員就是智能合約返回的每個結果變量
                 //以getGenPlots為例,Division.json中定義如下:
                 /*"name": "getGenPlots",
                     "outputs": [
                     {
                         "name": "",
                         "type": "uint64[]"
                     },
                     {
                         "name": "",
                         "type": "address[]"
                     },
                     {
                         "name": "",
                         "type": "uint256[]"
                     },
                     {
                         "name": "",
                         "type": "uint8[]"
                     }
                     ],
                     "payable": false,
                     "stateMutability": "view",
                     "type": "function"
                  */
                  //那么:results[0]是uint64[]
                  //      results[1]是address[]...

                 console.log(results[0].length);
         }).catch(function(err){
                 console.log(err.message);
         });
 },
handlePlot: function(event) {

/*
 * 這個函數就是上面bindEvents中調用的響應函數,演示要花eth的函數調用
 */
    event.preventDefault();
    //從event中獲取參數,這是jquery的東西,跟web3無關
    var plotId = parseInt($(event.target).data('id'));

    var divisionInstance;
     //獲取以太坊帳號信息
     web3.eth.getAccounts(function(error,accounts){
         if(error)
         {
             console.log(error);
         }
         //我隨便取帳號列表里的第3個帳號。
         //因為我們連的是ganache-cli的rpc模擬服務,
         //其中給我們預制了幾個有eth的帳號
         //如果安裝了MetaMask插件,應該獲得的就是MetaMask里的帳號
         var account = accounts[2];
         App.contracts.Division.deployed().then(function(instance){
             divisionInstance = instance;
             //調用智能合約的buyPlot函數,該函數需要2個參數,
             //后面的{}中的內容跟發起以太坊交易的時候所帶的默認值。
             //from: 使用哪個以太坊帳號
             //value: 要使用的eth數量,以wei為單位(1eth=10^18wei)
             //gas: 礦工費,以wei為單位
             return divisionInstance.buyPlot(plotId, 3, {from: account, value: 100000000000000000, gas:6000000});
        }).then(function(result){
            //返回結果后重新更新UI
            return App.refreshPlots();
        }).catch(function(error){
            console.log(error.message);
        });
     });
 }

};

測試你的基于Web的DApp是否正常,可以使用nodejs里面提供的lite-server模塊來當簡單的webserver來用。

安裝lite-server,在你的truffle項目目錄下,執行:

npm install lite-server

安裝完之后會在項目目錄下聲稱node_modules目錄,lite-server以及依賴的模塊都在該目錄下了。

要運行lite-server,還需要編寫項目目錄下的package.json文件:

{
     "name": "項目名稱",
     "version": "1.0.0",
     "description": "",
     "main": "truffle.js",
     "directories": {
         "test": "test"
     },
     "scripts": {
         "dev": "lite-server",
         "test": "echo \"Error: no test specified\" && exit 1"
     },
     "author": "",
     "license": "ISC",
     "devDependencies": {
         "lite-server": "^2.3.0"
     },
     "dependencies": {
         "liteserver": "^0.3.0"
     }
}

還需要編寫bs-config.json來配置一下lite-server

{
 "server": {
 "baseDir": ["./src", "./build/contracts"]
 }
}

baseDir是用來設置lite-server所提供的web服務的文件路徑的。這個設置表明你可以把你上面寫的app.js,依賴的各種js放到./src目錄下,然后寫index.html,把app.js等集成進去,就大功告成了。

啟動lite-server,執行:

npm run dev

不僅啟動了lite-server,而且會啟動一個瀏覽器去打開頁面。

“以太坊智能合約的DApp怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹巴县| 荆州市| 防城港市| 上林县| 南宁市| 公主岭市| 聊城市| 平定县| 牡丹江市| 松江区| 朝阳市| 噶尔县| 青铜峡市| 泸州市| 太仓市| 武安市| 九江县| 吉木萨尔县| 宁河县| 托克托县| 衡东县| 新化县| 铜川市| 江津市| 米脂县| 府谷县| 金川县| 拉萨市| 宜君县| 大埔县| 余姚市| 车险| 同德县| 四会市| 财经| 浦北县| 土默特左旗| 清徐县| 沙坪坝区| 清涧县| 介休市|