🧩 以 Truffle & Ganache 为例的 DApp 入门指南
读完只需 10 分钟,你就能亲手部署一套「可转账、可查余额」的测试代币,为后续 DApp 开发打下地基。
开始之前:本地测试链环境
全局安装
ganache-clinpm install -g ganache-cli开新终端启动
ganache-cli另开终端初始化 Truffle 项目
mkdir SimpleToken && cd SimpleToken truffle init
ganache-cli 会预生成 10 个地址,每位拥有 100 ETH,后续反复转账也不怕手续费。
代币合约核心概念
| 类比维度 | 现实银行 | 代币合约 |
|---|---|---|
| 账户体系 | 银行卡号 | 以太坊地址 |
| 基本操作 | 查余额、转账 | balanceOf()、transfer() |
| 安全保障 | 经期审计 | 代码即规则,全公开 |
正因为部署在 以太坊区块链上,所有 区块链转账记录 永久不可篡改。
创建 SimpleToken.sol
在 contracts/ 文件夹新建 SimpleToken.sol,代码如下:
pragma solidity ^0.4.19;
contract SimpleToken {
uint public constant INITIAL_SUPPLY = 10000;
mapping(address => uint) public balances;
function SimpleToken() public {
balances[msg.sender] = INITIAL_SUPPLY;
}
function transfer(address _to, uint _amount) public {
require(balances[msg.sender] > _amount);
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
function balanceOf(address _owner) public constant returns (uint) {
return balances[_owner];
}
}逐块拆解
uint等价uint256:可容纳 2²⁵⁶ 等大数字,避免溢出。mapping类似 JS 对象,映射地址 → 余额。- 构造函数只在合约部署时执行一次,
msg.sender就是部署钱包地址。 require做基础检查:余额足够时放行,否则回滚交易。
👉 想让代币弹窗钱包自动识别?先把 ERC-20 标准加进来。
编译与部署
新建迁移文件
migrations/3_deploy_simple_token.jsvar SimpleToken = artifacts.require("SimpleToken"); module.exports = function(deployer) { deployer.deploy(SimpleToken); };编译
truffle compile部署至 Ganache
truffle migrate终端应出现 交易哈希 与 合约地址,说明已经成功落地测试链。
快速验证:Truffle Console 实战
truffle console
> let token
> SimpleToken.deployed().then(i => token = i)
# 查看部署者初始余额
> token.balanceOf(web3.eth.coinbase).then(b => b.toString())
'10000'
# 查询第二个账户
> token.balanceOf(web3.eth.accounts[1]).then(b => b.toString())
'0'
# 执行转账
> token.transfer(web3.eth.accounts[1], 123, {from: web3.eth.coinbase})
# 注意这里会返回交易详情,成功后 Gas 已消耗
# 再次验证
> token.balanceOf(web3.eth.coinbase).then(b => b.toString())
'9877'
> token.balanceOf(web3.eth.accounts[1]).then(b => b.toString())
'123'整个流程即代币从 0 到 1 的全过程。
👉 一键查看更多区块链开发干货与工具合集。
FAQ:常见疑问一次说清
| # | 问题 | 简明回答 |
|---|---|---|
| 1 | 真实主网能直接上线 SimpleToken 吗? | 不建议!示例仅供学习,缺少安全审计与 ERC-20 标准实现。 |
| 2 | gasPrice、gasLimit 怎么调? | 在 truffle.js 或 truffle-config.js 中的 networks 字段自定义。 |
| 3 | 地址填错怎么办? | 交易已上链就无法撤销,转错即永久丢失,务必先小额测试。 |
| 4 | 能让 MetaMask 直接显示新代币吗? | 下一步需把合约改为符合 ERC-20 标准 并填妥代币信息,再行添加。 |
| 5 | 部署后发现 bug 能升级吗? | Solidity 合约一旦部署即不可变;务必用 代理模式 或提前写好升级逻辑。 |
安全警钟:这段代码只配当小白鼠
虽然 30 行代码就能跑通,但真正项目需规避的雷区极多:
- 没校验
_amount为正数,可输入负数洗钱; - 没验证
_to是否为零地址,轻易造成代幣黑洞; uint存在溢出风险,早期黑客就靠整型溢出横扫链圈。
请熟读 ConsenSys 官方安全指南(文末参考 4、5),再谈生产级部署。
下一步预告
下一篇会带你:
- 引入 battle-tested 的 OpenZeppelin ERC-20 库;
- 完成可添加新代币的 Web3 DApp 页面;
- 一口气把代币收入 主流钱包,实现真正的去中心化体验。
参考资料(开源精华)
- ganache-cli GitHub
- Solidity 全局变量手册
- OpenZeppelin 智能合约安全最佳实践
- ConsenSys 合约安全技巧与案例