市值: $2.812T -5.85%
成交额(24h): $186.0816B 66.46%
恐惧与贪婪指数:

38 - 恐惧

  • 市值: $2.812T -5.85%
  • 成交额(24h): $186.0816B 66.46%
  • 恐惧与贪婪指数:
  • 市值: $2.812T -5.85%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

如何用 Solidity 编写你的第一个智能合约? (分步教程)

Set up Node.js, Truffle, and Ganache; write an ERC-20 token using OpenZeppelin; compile, deploy locally, and test via Truffle console and JavaScript.

2026/01/17 00:00

设置开发环境

1. 安装 Node.js 和 npm 以管理 Solidity 工具所需的依赖项。

2. 使用npm在全球范围内安装Truffle——一种广泛采用的基于以太坊的智能合约开发框架。

3、安装Ganache作为个人区块链进行本地测试;它为私人账户提供预先充值的 ETH。

4. 使用truffle init配置一个新的 Truffle 项目以生成基本目录,例如contracts/migrations/test/

5. 通过运行truffle 版本并确认与 Solidity 编译器 v0.8.x 或更高版本的兼容性来验证安装完整性。

编写基本的代币合约

1. 在contracts/文件夹中创建一个名为MyToken.sol的新文件。

2.声明Solidity版本编译指示:编译指示solidity ^0.8.20;以确保确定性的编译行为。

3.导入OpenZeppelin的ERC-20实现: import '@openzeppelin/contracts/token/ERC-20/ERC-20.sol';

4. 定义合约继承:合约MyToken为ERC20 { ... }并在构造函数中初始化名称、符号和总供应量。

5. 使用 OpenZeppelin 的 AccessControl 库中的onlyOwner修饰符添加仅限所有者的 mint 函数。

编译和部署合约

1. 在migrations/2_deploy_contracts.js中编写迁移脚本,实例化并部署100万个代币的MyToken

2.运行trufflecompile生成ABI和字节码;确认没有出现语法或版本不匹配错误。

3. 启动 Ganache 并将其 RPC 服务器 URL(例如,http://127.0.0.1:7545)复制到开发网络下的truffle-config.js中。

4. 执行truffle migrate --networkdevelopment部署合约并记录交易哈希值和合约地址。

5. 通过检查 Ganache 的事务日志并验证控制台输出中出现的合约地址来确认部署成功。

通过 Truffle 控制台进行交互

1. 启动连接到 Ganache 的 Truffle 控制台: truffle console --networkdevelopment

2. 获取已部署的实例: let instance = wait MyToken.deployed();

3. 使用(await instance.totalSupply()).toString()查询总供应量 — 期望输出与初始薄荷值匹配。

4. 账户间转账: await instance.transfer('0xAb8483F64d9C6d1EcF9b849Ae677dC320f55a1B5', '1000')

5. 使用(await instance.balanceOf('0xAb8483F64d9C6d1EcF9b849Ae677dC320f55a1B5')).toString()验证余额更改。

使用 JavaScript 进行测试

1. 创建test/mytoken.js ,其中包含核心功能的 Mocha 风格测试用例。

2. 使用contract()定义测试上下文,并使用it()块来断言铸造、传输和事件发射等行为。

3. 调用transfer 后,使用assert.equal(receipt.logs[0].event, 'Transfer')断言正确的事件日志。

4. 测试恢复条件:尝试传输超过余额的内容,并使用ExpectRevert实用程序验证是否引发恢复

5. 使用truffle test运行测试,并确认所有断言都通过,没有超时或运行时异常。

常见问题解答

问:我可以在不使用 Truffle 的情况下部署 Solidity 合约吗?答:是的。替代方案包括 Hardhat、Remix IDE 或使用编译的字节码和 ABI 直接调用 web3.js。

问:如果我忘记了接收 ETH 的函数中的payable关键字,会发生什么情况?答:该函数将恢复任何尝试发送 ETH 的交易,从而导致执行失败和 Gas 消耗。

问:使用tx.origin进行访问控制安全吗?答:不行。 tx.origin可以通过网络钓鱼合约进行操纵,并且绝不能在权限检查中替换msg.sender

问:如何在 Etherscan 上验证我的合约源代码?答:通过 Etherscan 的验证表单提交准确的 Solidity 源代码、编译器版本、优化设置和构造函数参数。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

查看所有文章

User not found or password invalid

Your input is correct