您当前的位置:首页 > 互联网百科 > 区块链

如何使用 Solidity 构建 CRUD 应用程序

时间:2022-09-24 11:14:02  来源:  作者:还不是你

你有没有想过如何创建你的区块链应用程序?谈到以太坊,它从智能合约[1]开始。

在本文中,我们将学习如何在以太坊上构建一个简单的智能合约,并使用 Truffle 框架对其进行测试。我们的智能合约将执行必要的创建、读取、更新和删除 (CRUD) 操作。

我们将专注于用 Solidity 语言编写的智能合约。我们将使用 Truffle Suite 部署以太坊区块链的本地版本,并使用以太坊虚拟机 (EVM) 编译智能合约。

先决条件

对于本教程,需要以下软件和软件包:

? Node 及其包管理器npm. 我们运行命令node -v&&npm -v来验证我们已经安装了它们,或者从这里[2]安装它们。

? 或者,我们可以使用另一个包管理器Yarn[3]

? 以太坊区块链,智能合约编译器

? 用于通信的 JAVAScript 库,Web3.js[4]

什么是智能合约?

简而言之,智能合约是一段控制某些数字资产的代码。它定义了转移资产和罚款的规则,就像传统合同一样。最好的是,它会根据预先编码的条件自动执行这些转移和惩罚,而无需中介。

什么是Solidity ?

Solidity 是在以太坊上编写智能合约的最著名的语言之一。它专为智能合约编程设计。它在语法上类似于 JavaScript

什么是Truffle Suite?

以太坊是一个允许应用程序在其上运行的区块链。代码以智能合约的形式用 Solidity 语言编写。为了编译这些合约,我们需要一个以太坊编译器,它将智能合约转换为机器可读的代码。

Truffle Suite 是一组专门为以太坊上的区块链开发而设计的工具。该套件包括三个软件:

? Truffle[5],一个智能合约开发框架

? Ganache[6],它使您能够在本地网络上设置个人以太坊区块链以进行测试和开发

? Drizzle[7],用于创建 DApp 用户界面,包括一系列现成的组件

安装Ganache

智能合约在以太坊区块链上运行,因此我们需要一个用于部署和测试。我们也可以在实时链上部署,但这会花费我们以太币作为汽油费。所以让我们建立一个本地链并在那里进行测试。当您确定代码并准备好分发您的应用程序时,您可以将其部署在实时链上。

Ganache 是安装在我们计算机上并在 localhost 上运行的本地链。从Truffle Suite 网站[8]下载 Ganache 。

我们可以看到 Ganache 提供了十个账户,每个账户都有 100 ETH。这些是假以太币,所以不要太兴奋。此外,该链在 7545 端口的 127.0.0.1 上运行。我们将使用这些账户在这条链上部署我们的智能合约。以太币将帮助我们支付汽油费。

安装Truffle

Truffle 为智能合约提供编译器。我们需要它来将 Solidity 代码转换为可以部署在 Ganache 区块链上的机器可读代码。

使用以下命令安装 Truffle:

$ npm install truffle -g

或者

$ yarn add truffle

创建智能合约

要创建智能合约,我们首先需要创建一个项目目录,我们将在其中保存所有 Solidity 文件。让我们创建一个crud-app文件夹并使用cd crud-app命令 进入到目录。

现在,我们的项目是空的。要使用它,我们需要一些样板代码。例如,如果我们希望在 React 中创建 UI,我们需要安装 React。

Truffle 已经提供了一些名为box[9]的包。这些包是不同框架的捆绑包,例如Truffle、Ganache、React、Web3和Redux,其中有一个供 Vue.js 开发人员使用。他们共同完成了从客户端 UI 到区块链智能合约的端到端应用程序开发。

本文将使用Truffle 提供的 React box[10]。

安装 React box

要安装 React box,请运行以下命令:

yarn truffle unbox react

这将安装 Web3.js、React、Ganache CLI、Truffle 和 Ethereum。

对于本教程,我们不会关注 React 或基于浏览器的 UI。相反,我们将创建智能合约并仅使用终端处理它们。

我们项目的目录结构将如下所示:

这里client是一个 React 项目文件夹,我们可以在其中创建应用程序的 UI。其中的一个文件夹client/src/contracts以 JSON 格式保存已编译的智能合约。这些文件是在我们编译智能合约时生成的。它们包含ABI、bytecode和其他信息。

{"contractName": "Migrations","abi": [{"inputs": [],"name": "last_completed_migration","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function","constant": true},{"inputs": [],"name": "owner","outputs": [{"internalType": "address","name": "","type": "address"}],"stateMutability": "view","type": "function","constant": true},{"inputs": [{"internalType": "uint256","name": "completed","type": "uint256"}],"name": "setCompleted","outputs": [],"stateMutability": "nonpayable","type": "function"}],"metadata": "{"compiler":{"version":"0.8.11+commit.d7f03943"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"last_completed_migration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"completed","type":"uint256"}],"name":"setCompleted","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"project:/contracts/Migrations.sol":"Migrations"},"evmVersion":"london","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"project:/contracts/Migrations.sol":{"keccak256":"0x7eaedbb1a3e4e0f585d9063393872f88ded247ca3c3c3c8492ea18e7629a6411","license":"MIT","urls":["bzz-raw://4a3eb571cee910095df65a06a1c1d3f89187c72a3c184ef87a7538d9aa39ad07","dweb:/ipfs/QmdqR3vrSSGR49qFGZr49Mb39z7dgD6tSzEDoaqtM31o61"]}},"version":1}","bytecode": "0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b50610327806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd57614610082575b600080fd5b61004e61009e565b60405161005b9190610179565b60405180910390f35b61006c6100a4565b60405161007991906101d5565b60405180910390f35b61009c60048036038101906100979190610221565b6100c8565b005b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014d906102d1565b60405180910390fd5b8060018190555050565b6000819050919050565b61017381610160565b82525050565b600060208201905061018e600083018461016a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bf82610194565b9050919050565b6101cf816101b4565b82525050565b60006020820190506101ea60008301846101c6565b92915050565b600080fd5b6101fe81610160565b811461020957600080fd5b50565b60008135905061021b816101f5565b92915050565b600060208284031215610237576102366101f0565b5b60006102458482850161020c565b91505092915050565b600082825260208201905092915050565b7f546869732066756e6374696f6e206973207265737472696374656420746f207460008201527f686520636f6e74726163742773206f776e657200000000000000000000000000602082015250565b60006102bb60338361024e565b91506102c68261025f565b604082019050919050565b600060208201905081810360008301526102ea816102ae565b905091905056fea2646970667358221220353cb1298ecaaf65fe00ddfd9e11ec1e26a6b97a78dc65de1604cb8b8a399ab364736f6c634300080b0033","deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd57614610082575b600080fd5b61004e61009e565b60405161005b9190610179565b60405180910390f35b61006c6100a4565b60405161007991906101d5565b60405180910390f35b61009c60048036038101906100979190610221565b6100c8565b005b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161014d906102d1565b60405180910390fd5b8060018190555050565b6000819050919050565b61017381610160565b82525050565b600060208201905061018e600083018461016a565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006101bf82610194565b9050919050565b6101cf816101b4565b82525050565b60006020820190506101ea60008301846101c6565b92915050565b600080fd5b6101fe81610160565b811461020957600080fd5b50565b60008135905061021b816101f5565b92915050565b600060208284031215610237576102366101f0565b5b60006102458482850161020c565b91505092915050565b600082825260208201905092915050565b7f546869732066756e6374696f6e206973207265737472696374656420746f207460008201527f686520636f6e74726163742773206f776e657200000000000000000000000000602082015250565b60006102bb60338361024e565b91506102c68261025f565b604082019050919050565b600060208201905081810360008301526102ea816102ae565b905091905056fea2646970667358221220353cb1298ecaaf65fe00ddfd9e11ec1e26a6b97a78dc65de1604cb8b8a399ab364736f6c634300080b0033","immutableReferences": {},"generatedSources": [],"deployedGeneratedSources": [{"ast": {"nodeType": "YulBlock","src": "0:3176:2","statements": [{"body": {"nodeType": "YulBlock","src": "52:32:2","statements": [{"nodeType": "YulAssignment","src": "62:16:2","value": {"name": "value","nodeType": "YulIdentifier","src": "73:5:2"}

如上所示,client/src/contracts设置为保存已编译的代码。开发网络设置在端口 8545。这是这个盒子运行 Ganache 的端口。

如果您查看我们安装 Ganache 的顶部,您可以看到它在 7545 端口上运行,但是这个在 8545 上运行,因为我们安装的 Ganache 已经使用了 7545。如果您愿意,您可以将此端口更改为 7545,Truffle 将使用 Ganache 和我们安装的帐户,而不是框提供的帐户。我保持在8545。

使用 CRUD 操作构建智能合约

现在是时候编写一些代码了。我们将进行 CRUD 操作并管理技术列表。

我们的应用程序将显示不同技术的列表。您可以添加、更新和删除技术。

如果您以前开发过应用程序,我们将遵循您无疑熟悉的程序:

? 创建一个数组来保存技术的名称

? 创建一个将新值推送到数组的函数

? 创建一个函数以更改给定索引处的值

? 创建一个函数来删除一个值

? 创建一个返回数组的函数

现在让我们用 Solidity 编写代码。

在目录中创建一个新文件contracts并调用它Techs.sol。我们将通过指明我们支持的许可证和solidity 版本来开始文件:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

接下来,声明我们要编写所有代码的合约范围:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

创建一个数组来保存技术堆栈:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

这是一个带有 private 修饰符的字符串数组,这意味着它不能在合约之外访问;因此,我们不能直接更改该值。

接下来,创建一个函数来添加一个新值:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

在上面的代码片段中,我们创建了一个名为 addTech的函数,它接受一个字符串techName作为参数。函数是public的,因此 UI 或终端可以调用它。在函数体中,我们简单地将值推送到数组中。

更新值:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

techIndex){myTechs[techIndex] = newTechName;return true;}return false;}}

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

techIndex){myTechs[techIndex] = newTechName;return true;}return false;}}

updateTech接受两个参数,techIndex和newTechName,并返回一个布尔值。它的工作原理是这样的:如果索引超出数组的范围,则返回 false。否则,它会在提供的索引处使用新提供的水果名称更改数组的值并返回true。

下一步是创建删除函数:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

techIndex){myTechs[techIndex] = newTechName;return true;}return false;}function deleteTech(uint techIndex) public returns (bool) {if(myTechs.length > techIndex){for(uint i=techIndex; i

techIndex){for(uint i=techIndex; i

在这里,我们检查索引超出范围的条件,然后通过将值替换为提供的索引中的下一个值来更新数组。这样,提供的索引的值就会丢失。最终,我们弹出最后一个值并返回true。

最后一步是返回数组。读取数组的所有值:

// SPDX-License-Identifier: MITpragma solidity >=0.4.22

=0.4.22

techIndex){myTechs[techIndex] = newTechName;return true;}return false;}function deleteTech(uint techIndex) public returns (bool) {if(myTechs.length > techIndex){for(uint i=techIndex; i

techIndex){for(uint i=techIndex; i

使用 Truffle 编译智能合约

现在我们已经完成了智能合约的编码,是时候使用 Truffle 编译它了。但首先,我们需要创建一个迁移文件以向 Truffle 指示我们要将其迁移到链上。

如果我们检查migration文件夹,我们会找到一个 JavaScript 文件:

该文件以数字开头,因此我们的第二个文件将以 2 开头,依此类推。代码几乎是标准的。因为1_initial_migrations是:

const Migrations = artifacts.require("Migrations");module.exports = function (deployer) {deployer.deploy(Migrations);};

让我们添加我们的迁移文件2_techs_contracts:

const TechStack = artifacts.require("./Techs.sol");module.exports = function (deployer) {deployer.deploy(TechStack);};

我们已准备好编译和迁移我们的技术合同。移动到终端并运行以下命令:

truffle develop

此命令将启动 truffle 控制台。还会显示链网、账户、助记词等信息。

Ganache 默认提供十个账户。它们对你来说会有所不同。请不要在实时链上使用任何这些私钥,因为它们对本文的所有访问者都是可见的,这意味着任何人都可以访问这些帐户。

现在,让我们使用以下命令编译合约:

compile

我们可以检查构建/合同是否创建了Techs.json文件。

我们可以使用以下命令将编译后的文件迁移到链中:

migrate

这会将所有三个智能合约迁移到链上。

最后,我们的应用程序在以太坊链上。我们花费了 0.001778438 ETH 的汽油费,交易发生在第一个账户。默认情况下,它始终采用第一个帐户。我们现在可以执行各种操作。

获取技术列表

我们可以使用 Web3.js 来响应和写入各种值。让我们首先将合约的实例存储在一个变量中:

let instance = awAIt Techs.deployed()

我们使用await是因为区块链中的所有内容都是异步的并返回一个承诺。

现在使用这个实例来获取数组:

let techs = instance.getTechs()undefined> techs[]

techs[]

这将返回一个空数组,因为我们的techs数组当前没有值。

将技术添加到列表中

让我们添加一些技术:

let result = await instance.addTech("JavaScript")undefined

result将持有交易信息。此操作将值添加到数组并因此更改数据。因此,它被记录为交易。请记住,所有读取操作都是免费的,但任何导致区块链变化的操作都需要支付 gas 费。

现在我们可以再次读取数组来检查内容:

让我们在列表中添加更多技术:

await instance.addTech("React");await instance.addTech("Nextjs");await instance.addTech("Web3.js");await instance.addTech("Solidity");

请记住,所有这些操作都会花费你以太币。您可以通过在合同中创建一个函数来一次接受多个水果值来节省费用。

现在读取数组:

更新技术名称

我们可以在上图中看到“React.js”被写成“React”。updateTech()让我们使用函数来纠正它。它将接受索引和新值。指数为 1。

await instance.updateTech(1, "React.js")

现在让我们读取数组:

拼写已成功修复。

删除技术名称

最后一个操作是删除一个值:

await instance.deleteTech(5)

读取值:

“Svelte”项目已从列表中删除。

结论

创建智能合约并在区块链上进行部署既有趣又强大。它提供了传统编程的新视角。您可以使用这些技术创建各种应用程序,例如在线投票、数字银行、钱包、拍卖等。

在本教程中,我们演示了如何构建一个可靠的 CRUD 应用程序并将其部署在本地链上。

引用链接

[1] 智能合约: https://web3.hashnode.com/glossary/what-are-smart-contracts[2] 这里: https://nodejs.org/en/[3] Yarn: https://yarnpkg.com/[4] Web3.js: https://web3js.readthedocs.io/en/v1.5.2/getting-started.html#adding-web3[5] Truffle: https://trufflesuite.com/truffle/[6] Ganache: https://trufflesuite.com/ganache/[7] Drizzle: https://trufflesuite.com/drizzle/[8] Truffle Suite 网站: https://trufflesuite.com/ganache/[9] box: https://www.trufflesuite.com/boxes[10] Truffle 提供的 React box: https://trufflesuite.com/boxes/react/



Tags:Solidity   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何使用 Solidity 构建 CRUD 应用程序
你有没有想过如何创建你的区块链应用程序?谈到以太坊,它从智能合约[1]开始。在本文中,我们将学习如何在以太坊上构建一个简单的智能合约,并使用 Truffle 框架对其进行测试。我们...【详细内容】
2022-09-24  Search: Solidity  点击:(296)  评论:(0)  加入收藏
▌简易百科推荐
区块链在网络安全领域的十大应用案例
在网络安全的动态格局中,威胁与防御一样快速发展,区块链作为坚定的守护者出现,彻底改变了数字安全的范式。除了加密货币的起源之外,区块链技术还因其对加强网络防御的变革性影响...【详细内容】
2023-12-12    千家网  Tags:区块链   点击:(43)  评论:(0)  加入收藏
区块链dapp开发模式
区块链Dapp开发的模式有三种:1.点对点交易模式:这种模式是指两个用户之间直接进行交易,无需通过中间方进行撮合。在Dapp系统中,点对点交易模式可以大大降低交易成本和时间,同时也...【详细内容】
2023-12-06  天晟区块链开发    Tags:区块链   点击:(53)  评论:(0)  加入收藏
2024年最热门的区块链趋势
在快速发展的区块链技术世界中,每年都会带来重塑行业的新创新和趋势。步入 2024 年,我们正处于一些令人兴奋的发展的风口浪尖,这些发展将彻底改变区块链格局。本文将作为您了解...【详细内容】
2023-12-06  李留白  微信公众号  Tags:区块链   点击:(83)  评论:(0)  加入收藏
每个人都应该做好准备的 2024 年区块链十大趋势
作为一名未来学家,我认为展望未来是我的工作,因此今年我想介绍将在未来 12 个月内塑造数字世界的新兴区块链趋势。哪些技术最受关注?企业领导者需要做好准备的最大趋势是什么?本...【详细内容】
2023-11-27  李留白  微信公众号  Tags:区块链   点击:(81)  评论:(0)  加入收藏
区块链你接触了么?
最近什么概念最火?毫无疑问是“区块链”。吃个饭,五桌有四桌都在跟你聊区块链。然而大部分人对“区块链”好奇,甚至眼馋,大都处于不求甚解的懵逼阶段。小编最近集中进行了研究,了...【详细内容】
2023-11-13  叮当天使    Tags:区块链   点击:(47)  评论:(0)  加入收藏
DAPP 区块链去中心化应用
DAPP是基于P2P对等网络而运行在智能合约之上的分布式应用程序,区块链则为其提供可信的数据记录。DAPP必须是开源、自治的。可以由用户自由打包生成,签名标记所属权,它的发布不...【详细内容】
2023-10-28  软件开发阿辉    Tags:DAPP   点击:(64)  评论:(0)  加入收藏
花旗、摩根大通纷纷入局 区块链将如何改变金融服务?
金色财经 作者:Stephen Gandel前摩根大通高管、华尔街最著名的金融家之一Blythe Masters于2015年被任命为区块链公司Digital Asset Holdings的首席执行官,许多人认为这是一种...【详细内容】
2023-10-26    金色财经  Tags:区块链   点击:(62)  评论:(0)  加入收藏
供应链NFT及其工作原理指南
编辑丨lee@Web3CN.Pro供应链是商业中的一股隐藏力量,负责将食物运送到杂货店、将 T 恤运送到服装店、将汽车运送到经销商。这些人员和企业网络旨在尽可能快速、廉价地生产并...【详细内容】
2023-10-24    市场资讯  Tags:NFT   点击:(78)  评论:(0)  加入收藏
“过气”的区块链,行业寒冬中的矿工
作者|陈默编辑|江岳炒币和挖矿已经过时了,至少在中国是如此。“现在没人提什么区块链了,玩的是AI。”当10月初比特大陆有关欠薪风波的消息传出后,有网友在weibo上表示。在社交...【详细内容】
2023-10-23  首席人物观    Tags:区块链   点击:(55)  评论:(0)  加入收藏
数字酒证是什么,高端白酒收藏投资价值如何?
随着经济的不断发展,高端白酒市场也在不断的增长。高端白酒收藏投资价值逐渐受到关注,吸引了大部分投资者的目光。并且随着数字时代的到来,白酒行业作为一个传统的行业正在朝着...【详细内容】
2023-10-10  执棋参禅    Tags:   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条