版权声明:忠于祖国,忠于人民 https://blog.csdn.net/boss2967/article/details/86095694
工作日志 2019-01-08
1. 工作计划
- 多合约部署(部署成功)
- js 调用(测试方法调用成功)
- 数据校验(结合项目代码还需整理)
- post请求代码编写
2. 遇到问题
- post 路由设置
- 思路错误
3. 编写代码
/* @ Introduction of configuration packages and files
*/
const Web3 = require("web3");
const solc = require('solc');
const fs = require("fs");
const Koa = require('koa');
const router = require('koa-router')();
const bodyParser = require('koa-bodyparser');
const render = require('koa-art-template');
const path = require('path');
const views = require('koa-views');
/* @ Initialization parameter configuration
*/
const app = new Koa();
//配置 template
render(app, {
root: path.join(__dirname, '../views'), // 视图的位置
extname: '.html', // 后缀名
debug: process.env.NODE_ENV !== 'production' //是否开启调试模式
});
//配置 ejs
app.use(views('../views', {
extension: 'ejs'
}))
app.use(bodyParser());
var instance; //合约对象(通过此去调用合约上的方法)
const locpath = "http://127.0.0.1:7545";
const abiPath = '../build/contracts/';
//合约编译后的地址
const contract_json = {
TutorialToken_json: "TutorialToken.json"
};
const Act_func = {
1: "setToken",
2: "add",
3: "myself",
4: "multiSendandself",
5: "multiSend",
6: "multiSend2",
7: "multiself",
8: "settrustOwner",
9: "seterctypeName",
10: "deltrustOwner"
}
let DRCToken_Contrat_cat;
//声明web3对象
let web3 = new Web3(new Web3.providers.HttpProvider(locpath));
//声明 Koa对象
//读取智能合约
let compiledCode = JSON.parse(fs.readFileSync(abiPath + contract_json.TutorialToken_json));
//合约 abi
var abiDefinition = compiledCode.abi;
//合约地址0x17b7165ee462f25bd8e508c57406c70e7fa3ca15
var constantaddress = "0x17b7165ee462f25bd8e508c57406c70e7fa3ca15";
//实例化 合约(abi)
let DRCToken_Contract = web3.eth.contract(abiDefinition);
instance = DRCToken_Contract.at(constantaddress);
//获取所有的账户
var accounts = web3.eth.accounts;
console.log("地址:=>", accounts);
console.log("instance=>", instance);
/*@ router configure
*/
// multiSendandself 代币空投,(给合约带币) post
router.post('/multiSendandself', (ctx, next) => {
/**/
});
// multiSend 代币空投 post
router.get('/multiSend', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// multiself 指定地址投放代币 post
router.post('/multiself', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// settrustOwner 将被授权的人存白名单 post
router.post('/settrustOwner', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// seterctypeName 将空投过代币地址存入合约记录map中 post
router.post('/seterctypeName1', async (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
console.log("post的数据是=>", ctx.request.body);
ctx.body = ctx.request.body; //获取表单提交的数据
});
router.get('/seterctypeName', (ctx, next) => {
// let list = {
//
// name: 'Drc',
// h: '<h2>这是一个h2</h2>',
// num: 20,
// data: ['11111111', '2222222222', '33333333333']
// }
// ctx.render('gettest', {
// list: list
// });
});
// sethistoricalOwner 将空投过的地址存入历史纪录
router.post('/sethistoricalOwner', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// deltrustOwner 从白名单中删除指定地址 post
router.post('/deltrustOwner', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// multiSend 代币空投 post
router.post('/multiSendandself', (ctx, next) => {
// ctx.body = tc_address;
// console.log(ctx.params);
});
// setToken 实例化指定代币 post
router.get('/setToken', async (ctx, next) => {
await ctx.render('index');
// ctx.render('index', {这样get传参
// list: list
// });
});
router.get('/add1', (ctx, next) => {
console.log('/add1=>', ctx.params);
//查询方法
result = Actions.add({
data: "gaofei",
ctx: "123"
});
ctx.body = "合约的加减函数的结果=>" + result;
});
//测试 add函数
router.get('/add', (ctx, next) => {
let b = testAsync1(4, 5);
ctx.body = "合约的加减函数的结果是" + b;
console.log(ctx.params);
console.log("计算的结果是:", b);
});
//测试 my函数
router.get('/myself', (ctx, next) => {
let request = ctx.request;
console.log("/myself =>", ctx.query);
// TODO: verification
result = Actions.myself({
data: "myself",
ctx: [1, 2, 3]
});
console.log("调用函数===>", result);
//
ctx.body = "myself函数调用的结果=>" + result;
});
//get 获取参数 测试
router.get('/newDrc', (ctx, next) => {
let url = ctx.url;
let request = ctx.request;
let req_querty = request.querystirng;
let req_query = request.query;
//上下文获取
let ctx_query = ctx.query;
let ctx_querying = ctx.querystirng;
ctx.body = {
url,
req_query,
req_querty,
ctx_query,
ctx_querying
}
});
/*@ contract Call Send
*/
var Actions = {
// multiSendandself
multiSendandself: (data) => {
let dataObject = data;
let parms = dataObject.data;
console.log("Action multiSendandself=>", parms);
/**获取数据**/
let destAddrs = parms.destAddrs;
let values = parms.values;
let valuesmyself = parms.valuesmyself;
let msg = parms.self; //
//校验地址是否合法
let {
arr,
brr
} = CommonMethod.public_checkAddress(parms);
// TODO: log日志
// TODO: 验证签名
//地址校验结束,判断是否有有效数据,有则调用数据,没有则立即返回错误
if (length(brr) != 0) {
//func
let result;
instance.multiSendandself(brr, values, valuesmyself, {
from: accounts[5] // TODO: 调用者地址,测试用 写死地址
},
(err, data) => {
if (!err) {
result = data;
// TODO:
} else {
// TODO:
result = "err";
}
);
return result;
//
}
//func
let result = instance.multiSendandself(arr_user, arr_num, one_owner, {
from: accounts[5]
});
return result;
},
// multiSend
multiSend: (data) => {
let dataObject = data;
let parms = dataObject.data;
console.log(Act_func .5 + ":" + parms);
// TODO: 验正签名
// TODO: log日志
// TODO: 校验数据合法性
let {
ok_arr,
err_brr
} = CommonMethod.public_checkAddress(parmas);
/****/
let address = parms.address;
let values = parms.values;
let msg = parms.self; //调用人地址
// TODO:
let result; //结果集
instance.multiSend(ok_arr, values, {
from: msg
}, (err, data) {
if (!err) {
result = data;
} else {
result = err;
}
// TODO:
return result;
},
// multiSend
multiSend2: (data) => {
//
let dataObject = data;
let parms = dataObject.data;
console.log("multiSend2" + ":" + parms);
// TODO: 验正签名
// TODO: log日志
let arr_address = parms.address;
let arr_value = parms.value;
let msg = parms.self; //调用人地址
// TODO: 校验数据合法性
let {
arr,
brr
} = CommonMethod.public_checkAddress(parms);
// TODO:
let result; //结果集
instance.multiSend2(arr, arr_value, {
from: msg
}, (err, data) {
if (!err) {
result = data;
} else {
result = err;
}
// TODO:要返回一个对象
return result;
},
multiself: (data) => {
//
let dataObject = data;
let parms = dataObject.data;
console.log("multiself" + ":" + parms);
// TODO: 验正签名
// TODO: log日志
let address = parms.address;
let value = parms.value;
let msg = parms.self; //调用人地址
// TODO: 校验数据合法性
if (web3.utils.isAddress(address)) {
//如果地址合法,加入通过校验数组
return
}
//地址合法,调用合约
// TODO:
let result; //结果集
instance.multiself(address, value, {
from: msg
}, (err, data) {
if (!err) {
result = data;
} else {
result = err;
}
// TODO:
return result;
},
// multiSend2
settrustOwner: (data) => {
let dataObject = data;
let parms = dataObject.data;
let address = parms.address;
let text = parms.text;
let msg = parms.msg;
// TODO: 校验数据合法性
if (web3.utils.isAddress(address)) {
//如果地址合法,加入通过校验数组
return
}
let result;
instance.settrustOwner(
address,
text, {
from: msg
}, (err, data) => {
if (!err) {
result = data;
} else {
result = err;
}
}
);
//
return result;
},
// seterctypeName 把合约地址+合约信息存入合约记录中
seterctypeName: (data) => {
//
let dataObject = data;
let address = parms.address;
let tokenName = parms.tokenName;
let msg = parms.msg; //调用者地址
// TODO: 校验数据合法性
if (web3.utils.isAddress(address)) {
//如果地址合法,加入通过校验数组
return
}
let result;
instance.seterctypeName(
address,
tokenName, {
from: msg
}, (err, data) => {
if (!err) {
result = data;
} else {
result = err;
}
}
);
//
return result;
},
// sethistoricalOwner 调用者存入历史记录
sethistoricalOwner: (data) => {
//
let dataObject = data;
let address = parms.address;
let histext = parms.histext;
let msg = parms.msg; //调用者地址
// TODO: 校验数据合法性
if (web3.utils.isAddress(address)) {
//如果地址合法,加入通过校验数组
return
}
let result;
instance.sethistoricalOwner(
address,
histext, {
from: msg
}, (err, data) => {
if (!err) {
result = data;
} else {
result = err;
}
}
);
//
return result;
},
setToken: function(data) {
let dataObject = data;
let address = parms.address;
let msg = parms.msg; //调用者地址
// TODO: 校验数据合法性
if (web3.utils.isAddress(address)) {
//如果地址合法,加入通过校验数组
return
}
/**Calling**/
var text = instance.setToken(address, {
from: msg
});
// console.log("num ===>",text.toString);
return text;
},
add: (data) => {
let dataObject = data;
console.log("路由参数=>", dataObject);
console.log("====>", dataObject.data);
console.log("====>", dataObject.ctx);
/******调用**/
// let test_dde = instance.say.send().tostring()
var nums = instance.add(5, 23, {
from: web3.eth.accounts[0]
});
console.log("num ===>", nums);
return nums;
},
myself: function(data) {
let dataObject = data;
console.log("dataObject =>", dataObject);
/****/
let text = "drctest11";
let msg = accounts[2];
// let arr_user = data.address;
// let arr_num = data.values;
// let msg = data.Object.self; //
//func TO
let result = instance.myself(
text, {
from: msg
},
(err, data) => {
if (!err) {
console.log("myself成功调用 =>", data);
} else {
console.log("myself调用失败", err);
}
}
);
console.log("myself.result=>", result);
return result;
}
};
var CommonMethod = {
//数组地址校验地址是否合法 public
public_checkAddress: (parms) => {
//
console.log("public_checkAddress parms=> ", parms);
/**获取数据**/
let arr_address = parms.arr_address;
let arr_values = parms.arr_values;
//
let arr = []; //通过地址验证数组
let brr = []; //未通过地址验证数组
// TODO: 开始校验
for (let i = 0; i < arr_address.length; i++) {
//校验地址是否为空
if (!arr_address) {
if (!web3.utils.isAddress(arr_address[i])) {
//如果地址合法,加入通过校验数组
arr.push(arr_address[i]);
} else {
//如果地址不合法,加入校验失败数组
brr.push(arr_address[i]);
}
}
}
return {
arr,
brr
}
};
/*@ Registration centre
*/
app.use(router.routes());
app.use(router.allowedMethods());
app.use(bodyParser());
app.listen(3003, () => {
console.log("start at port 3003");
});
4. 明日计划
- 整理治哥讲解思路
- 合约代币的实例化(要实例化一个代币才能去调用)
- 调用方式的转变,一定要转化成二进制的写法,这样以后扩展性也好
- 数据校验,和之前的校验不一样这个要准备好
- 一定要看web3英文的文档,之前一直看中文的,但是还是要看英文的
5. 备注
- 今天听了治哥的讲解,发现个人很多问题,个人思路确实有错误,简单的调用,会是那么复杂,总结几点,一年后的今天看。
- 请求方式-凡是发起交易的,写上链的操作,要用那个编译后的去请求,虽然常规也可以实现,但是更好
- 数据校验 有一个序列化的过程,对参数的处理
- 最后一个串要拼接 函数名+参数+其他
- 每笔交易数量限制170笔
- gas 低级 中 高级
- 预估消耗gas的数量
- 对于一笔请求的状态处理
- 对于账户解锁的封装
- 批量交易的业务处理
- 签名并发送请求