用 Solidity 写第一条加密代币智能合约

·

🧩 以 Truffle & Ganache 为例的 DApp 入门指南

读完只需 10 分钟,你就能亲手部署一套「可转账、可查余额」的测试代币,为后续 DApp 开发打下地基。

开始之前:本地测试链环境

  1. 全局安装 ganache-cli

    npm install -g ganache-cli
  2. 开新终端启动

    ganache-cli
  3. 另开终端初始化 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];
    }
}

逐块拆解

👉 想让代币弹窗钱包自动识别?先把 ERC-20 标准加进来。


编译与部署

  1. 新建迁移文件 migrations/3_deploy_simple_token.js

    var SimpleToken = artifacts.require("SimpleToken");
    module.exports = function(deployer) {
        deployer.deploy(SimpleToken);
    };
  2. 编译

    truffle compile
  3. 部署至 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 标准实现。
2gasPrice、gasLimit 怎么调?truffle.jstruffle-config.js 中的 networks 字段自定义。
3地址填错怎么办?交易已上链就无法撤销,转错即永久丢失,务必先小额测试。
4能让 MetaMask 直接显示新代币吗?下一步需把合约改为符合 ERC-20 标准 并填妥代币信息,再行添加。
5部署后发现 bug 能升级吗?Solidity 合约一旦部署即不可变;务必用 代理模式 或提前写好升级逻辑。

安全警钟:这段代码只配当小白鼠

虽然 30 行代码就能跑通,但真正项目需规避的雷区极多:

请熟读 ConsenSys 官方安全指南(文末参考 4、5),再谈生产级部署。


下一步预告

下一篇会带你:

  1. 引入 battle-tested 的 OpenZeppelin ERC-20 库;
  2. 完成可添加新代币的 Web3 DApp 页面
  3. 一口气把代币收入 主流钱包,实现真正的去中心化体验。

参考资料(开源精华)