Truffle通过truffle.js指定的以太坊网络来部署,部署命令为truffle deploy,如果truffle.js有多个网络,可以使用networkc参数来指定。
配置文件是truffle.js。位于项目的根目录下。这个文件是Javascript文件,支持执行代码来创建配置:
Truffle配置文件示例:
module.export = {
networks:{
development:{
host:"localhost",
port:8545,
network_id:"*" //匹配任何network id
}
}
};
Truffle deployer部署参数示例:
var Hello = artifacts.require("./Hello.sol");
var Multi = artifacts.require("./Multi.sol");
module.exports = function(deployer){
//部署单个合约,不带任何构造参数
deployer.deploy(Hello);
//部署单个合约带有构造参数
deployer.deploy(Multi,11);
//部署多个合约,一些有参数,一些没有参数
/*
deployer.deploy([
[A,arg1,arg2,...],
B,
[C,arg1]
]);
*/
}
以太坊支持通过各种方式与节点进行交互:
假设我们要调用客户端命令eth.getBalance(),查询地址为0x407的账号的余额,命令如下:
curl --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407","latest"],"id":1}' localhost:8123
其中,jsonrpc字段指定JSON-RPC版本号,method字段指定需要调用的api方法名,params字段为传送的参数,id为消息标识字段;
假设目前有部署的智能合约,地址为0x6ff93,我们要调用的合约方法签名multiply(uint256),传入的参数值为6,那么调用命令的格式如下:
curl --data
{
"jsonrpc":"2.0",
"method":"eth_sendtransaction",
"param":[{
"from":"0xeb85a5",
"to":"0x6ff93",
"data":"0xcddddd"
}],
"id":8
}
localhost:8123
其中,from为扣除GAS账户地址,to为智能合约部署的地址,data为调用方法的签名和传入参数,编码方式为“0x”+sha3(“multiply(uint256)”).substring(0,8)+to_32bit_Hex_str(6)
直接使用RPC对智能合约的调用需要进行复杂的编码。具体规则可以参考Ethereum Contract ABI文档。实际编程中,基本都使用web3等方式,对RPC进行了友好封装。
版本文档以此为准:
https://web3.js.readthedocs.io/en/1.0/web3-eth.html
// 引入web3
// in node.js use: var Web3=require('web3');
//如果浏览器按照了MetaMask,则会提供一个默认的web3.currentProvider
//如果为空,则连接远程/本地节点
var web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
web3.setProvider,设置Provider
web3.toWei
web3.eth.account,以太坊账号
web3.eth.contract, 创建一个Solidity的合约对象,用来在某个地址上初始化合约。
合约对象的方法
合约调用方法代码示例:
//合约实例
var contract = new web3.eth.Contract(abi,address);
//callback
contract.methods.helloWorld().call(function(error,result){
colsole.log(result);
});
//promise
contract.methods.helloWorld().call().then(
function(result)(
console.log(result);
)
);
合约对象的事件
合约对象的事件,回调返回值:
var Web3 = require('web3');
console.log(Web3.version);
//设置web3对象
var web3 = new Web3('http://localhost:8545');
var json = require("../build/contracts/Hello.json");
var abi = json["abi"];
var address = "0x91ab99f3983y798cenu9eh49erjj88q3u4rjeqd903q4uytr04";
//合约实例
var contract = new web3.eth.Contract(abi,address);
//callback
contract.methods.helloWorld().call(function(error,result){
console.log(result);
});
// 1.引用编辑好的合约文件结果
var json = require("./build/contracts/MyContract.json");
// 2.将合约转为合约抽象层实例
var contract = require("truffle-contract");
var MyContract = contract(json);
// 3. 设置合约抽象层实例的web3 provider
MyContract.setProvider(new Web3.providers.HttpProvider("http://localhost:8545"));
// 4. 开始使用
MyContract.deployed().then(function(deployed){
return deployed.someFunction();
});