Truffle Suite框架
Truffle Suite是一个用于构建、测试和部署以太坊智能合约的开发框架。它提供了一系列工具,使得以太坊开发更加容易和高效。本文将介绍如何使用Truffle Suite框架来开发一个简单的智能合约,并且展示一些基本的代码示例。
安装Truffle Suite
在开始之前,你需要先安装Truffle Suite。你可以通过npm来安装它,只需要在终端中输入以下命令:
npm install -g truffle
这个命令将会全局安装Truffle Suite。
创建智能合约
在Truffle Suite中,你可以使用Solidity语言来编写智能合约。我们将创建一个简单的智能合约,它可以存储和检索一个字符串。首先,我们需要在终端中创建一个新的Truffle项目。在终端中输入以下命令:
mkdir myproject cd myproject truffle init
这个命令将会创建一个新的Truffle项目,并且初始化一些默认文件和文件夹。
接下来,我们需要创建一个新的合约文件。在
contracts
文件夹中创建一个名为MyContract.sol
的文件,并且在其中编写以下代码:pragma solidity ^0.8.0; contract MyContract { string myString; function setString(string memory _string) public { myString = _string; } function getString() public view returns (string memory) { return myString; } }
这个合约定义了一个名为
MyContract
的合约,并且在其中定义了两个函数:setString
和getString
。setString
函数用于设置一个字符串变量myString
的值;getString
函数用于获取myString
的值。现在我们已经有了一个简单的智能合约。编写测试脚本
接下来,我们需要编写一个测试脚本来测试我们的合约。在
test
文件夹中创建一个名为mycontract.js
的文件,并且编写以下代码:const MyContract = artifacts.require("MyContract"); contract("MyContract", () => { it("should set the string correctly", async () => { const myContract = await MyContract.deployed(); await myContract.setString("Hello, world!"); const result = await myContract.getString(); assert(result === "Hello, world!"); }); });
这个测试脚本使用了
assert
库来测试我们的合约。它首先部署了我们的合约,然后调用setString
函数来设置myString
的值。最后,它调用getString
函数来获取myString
的值,并且使用assert
来检查它是否等于我们设置的值。运行测试脚本
现在我们已经编写了一个简单的智能合约和测试脚本,接下来我们需要运行测试脚本来测试我们的合约。在终端中输入以下命令:
truffle test
这个命令将会运行我们的测试脚本,并且输出测试结果。如果一切正常,你应该会看到以下输出:
Contract: MyContract √ should set the string correctly (104ms) 1 passing (139ms)
这个输出告诉我们,我们的测试通过了。
部署智能合约
现在我们已经完成了合约的开发和测试,接下来我们需要部署我们的合约。在Truffle Suite中,你可以使用
truffle migrate
命令来部署智能合约。在终端中输入以下命令:truffle migrate
这个命令将会编译和部署我们的合约,并且输出部署结果。如果一切正常,你应该会看到以下输出:
Starting migration... ====================== > Network name: 'development' > Network id: 5777 > Block gas limit: 6721975 1_initial_migration.js ====================== Deploying 'Migrations' ---------------------- > transaction hash: 0x9de7a3f6e0a2c84b6f8f7c7a0d1e2b2d9e9d7a7b659ef1b3f3b3be8d295c3a49 > Blocks: 0 Seconds: 0 > contract address: 0x5FbDB2315678afecb367f032d93F642f64180aa3 > block number: 2 > block timestamp: 1627652324 > account: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 > balance: 99.99999958 > gas used: 261494 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.00522988 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.00522988 ETH 2_deploy_contracts.js ===================== Deploying 'MyContract' ---------------------- > transaction hash: 0x0b8c1d0d5c6f4e4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e > Blocks: 0 Seconds: 0 > contract address: 0x692a70D2e424a56D2C6C27aA97D1a86395877b3C > block number: 4 > block timestamp: 1627652324 > account: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 > balance: 99.99891672 > gas used: 146281 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.00292562 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.00292562 ETH Summary ======= > Total deployments: 2 > Final cost: 0.0081555 ETH
这个输出告诉我们,我们的合约已经成功部署到了以太坊网络上。
总结
在本文中,我们介绍了如何使用Truffle Suite框架来开发、测试和部署一个简单的智能合约。Truffle Suite提供了一系列工具,使得以太坊开发更加容易和高效。我们希望这篇文章能够帮助你入门Truffle Suite,并且能够在你的以太坊开发中发挥作用
去中心化应用(DApp)
简单的去中心化应用(DApp),并且展示一些基本的代码示例。
安装Truffle Suite
在开始之前,你需要先安装Truffle Suite。你可以通过npm来安装它,只需要在终端中输入以下命令:
npm install -g truffle
这个命令将会全局安装Truffle Suite。
创建DApp
在Truffle Suite中,你可以使用Solidity语言来编写智能合约,并且使用web3.js来与智能合约交互。我们将创建一个简单的DApp,它可以存储和检索一个数字。首先,我们需要在终端中创建一个新的Truffle项目。在终端中输入以下命令:
mkdir mydapp cd mydapp truffle init
这个命令将会创建一个新的Truffle项目,并且初始化一些默认文件和文件夹。
接下来,我们需要创建一个新的合约文件。在
contracts
文件夹中创建一个名为MyContract.sol
的文件,并且在其中编写以下代码:pragma solidity ^0.8.0; contract MyContract { uint256 myNumber; function setNumber(uint256 _number) public { myNumber = _number; } function getNumber() public view returns (uint256) { return myNumber; } }
这个合约定义了一个名为
MyContract
的合约,并且在其中定义了两个函数:setNumber
和getNumber
。setNumber
函数用于设置一个数字变量myNumber
的值;getNumber
函数用于获取myNumber
的值。现在我们已经有了一个简单的智能合约。接下来,我们需要编写一个简单的前端界面来与智能合约交互。在根目录中创建一个名为
index.html
的文件,并且编写以下代码:<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>My DApp</title> </head> <body> <h1>My DApp</h1> <form> <label for="number">Number:</label> <input type="number" id="number" /><br /> <button type="submit">Set Number</button> </form> <p>Current Number: <span id="current-number"></span></p> <script src="./js/web3.min.js"></script> <script src="./js/app.js"></script> </body> </html>
这个前端界面包含了一个表单,它可以让用户输入一个数字并且调用
setNumber
函数来设置智能合约中的数字。它还包含了一个<p>
标签,它可以显示当前智能合约中的数字。接下来,我们需要编写一个JavaScript文件来与智能合约交互。在
js
文件夹中创建一个名为app.js
的文件,并且编写以下代码:window.addEventListener("load", async () => { if (typeof web3 !== "undefined") { web3 = new Web3(web3.currentProvider); } else { web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); } const contractAddress = "0x692a70D2e424a56D2C6C27aA97D1a86395877b3C"; const myContract = new web3.eth.Contract( [ { constant: false, inputs: [ { name: "_number", type: "uint256", }, ], name: "setNumber", outputs: [], payable: false, stateMutability: "nonpayable", type: "function", }, { constant: true, inputs: [], name: "getNumber", outputs: [ { name: "", type: "uint256", }, ], payable: false, stateMutability: "view", type: "function", }, ], contractAddress ); const currentNumber = await myContract.methods.getNumber().call(); document.getElementById("current-number").textContent = currentNumber; const form = document.querySelector("form"); form.addEventListener("submit", async (event) => { event.preventDefault(); const number = document.getElementById("number").value; await myContract.methods.setNumber(number).send({ from: web3.eth.defaultAccount }); const newNumber = await myContract.methods.getNumber().call(); document.getElementById("current-number").textContent = newNumber; }); });
这个JavaScript文件使用了web3.js库来与智能合约交互。它首先检查web3对象是否已经存在,如果不存在则创建一个新的web3对象,并且连接到本地的以太坊节点。然后它创建了一个新的智能合约对象,并且调用
getNumber
函数来获取当前的数字。最后,它监听表单的提交事件,并且调用setNumber
函数来设置智能合约中的数字。运行DApp
现在我们已经编写了一个简单的DApp,接下来我们需要运行它。在终端中输入以下命令:
truffle develop
这个命令将会启动一个本地的以太坊节点,并且输出一些信息。接下来,在Truffle项目根目录中输入以下命令:
truffle migrate
这个命令将会编译和部署我们的合约,并且输出部署结果。如果一切正常,你应该会看到以下输出:
Starting migration... ====================== > Network name: 'development' > Network id: 5777 > Block gas limit: 6721975 1_initial_migration.js ====================== Deploying 'Migrations' ---------------------- > transaction hash: 0x9de7a3f6e0a2c84b6f8f7c7a0d1e2b2d9e9d7a7b659ef1b3f3b3be8d295c3a49 > Blocks: 0 Seconds: 0 > contract address: 0x5FbDB2315678afecb367f032d93F642f64180aa3 > block number: 2 > block timestamp: 1627652324 > account: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 > balance: 99.99999958 > gas used: 261494 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.00522988 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.00522988 ETH 2_deploy_contracts.js ===================== Deploying 'MyContract' ---------------------- > transaction hash: 0x0b8c1d0d5c6f4e4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e4d4e > Blocks: 0 Seconds: 0 > contract address: 0x692a70D2e424a56D2C6C27aA97D1a86395877b3C > block number: 4 > block timestamp: 1627652324 > account: 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1 > balance: 99.99891672 > gas used: 146281 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.00292562 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.00292562 ETH Summary ======= > Total deployments: 2 > Final cost: 0.0081555 ETH
这个输出告诉我们,我们的合约已经成功部署到了本地的以太坊节点上。
接下来,在Truffle项目根目录中输入以下命令:
npm run dev
这个命令将会启动一个本地的web服务器,并且打开我们的DApp。如果一切正常,你应该会看到一个包含表单和数字的网页。你可以在表单中输入一个数字并且点击“Set Number”按钮来设置智能合约中的数字,同时网页中的数字也会更新