智能合约也是一个以太坊帐户,我们称之为合约帐户。 这意味着它们有余额,可以成为交易的对象。 但是,他们无法被人操控,他们是被部署在网络上作为程序运行着。 个人用户可以通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像常规合约一样定义规则,并通过代码自动强制执行。 默认情况下,您无法删除智能合约,与它们的交互是不可逆的。
配置文件
配置文件位于项目根目录下,文件名为 truffle-config.js。
配置文件内容如下:
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
}
},
compilers: {
solc: {
version: "0.8.13", // Fetch exact version from solc-bin
}
}
};
这个配置文件中,development 是我们要部署的区块链配置,这里指我们本地的 Ganache 区块链节点。如果需要部署到其它区块链节点,请修改此配置文件。
智能合约
合约源码
我们来看一下合约的源码,文件名是 MetaCoin.sol。
pragma solidity ^0.8.13;
import "./ConvertLib.sol";
contract MetaCoin {
mapping (address => uint) balances;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
constructor() {
balances[tx.origin] = 10000;
}
function sendCoin(address receiver, uint amount) public returns(bool sufficient) {
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
emit Transfer(msg.sender, receiver, amount);
return true;
}
function getBalanceInEth(address addr) public view returns(uint){
return ConvertLib.convert(getBalance(addr),2);
}
function getBalance(address addr) public view returns(uint) {
return balances[addr];
}
}
这个合约包含一个构造函数、还定义了一个事件和三个函数。
constructor():合约的构造函数,在合约部署时自动存入一些 token 到发起者的账户。
event Transfer(...):事件。转账交易时触发。
sendCoin(...):将 token 从一个账户转账到另一个账户。
getBalanceInEth(...):取经转换后的账户余额(账户余额*2)。
getBalance(...):取账户余额(单位:1wei)。
测试合约
这个示例定义了两个测试文件,保存在 test 目录下:
metacoin.js 用 JavaScript 编写的测试脚本
TestMetaCoin.sol:用 Solidity 编写的测试脚本
Truffle 自带一个自动化测试框架,可以轻松测试合约,而不需要我们事先部署合约。