工作日志-2019-01-08

版权声明:忠于祖国,忠于人民 https://blog.csdn.net/boss2967/article/details/86095694

工作日志 2019-01-08

1. 工作计划

  1. 多合约部署(部署成功)
  2. js 调用(测试方法调用成功)
  3. 数据校验(结合项目代码还需整理)
  4. post请求代码编写

2. 遇到问题

  1. post 路由设置
  2. 思路错误

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. 明日计划

  1. 整理治哥讲解思路
  2. 合约代币的实例化(要实例化一个代币才能去调用)
  3. 调用方式的转变,一定要转化成二进制的写法,这样以后扩展性也好
  4. 数据校验,和之前的校验不一样这个要准备好
  5. 一定要看web3英文的文档,之前一直看中文的,但是还是要看英文的

5. 备注

  1. 今天听了治哥的讲解,发现个人很多问题,个人思路确实有错误,简单的调用,会是那么复杂,总结几点,一年后的今天看。
  2. 请求方式-凡是发起交易的,写上链的操作,要用那个编译后的去请求,虽然常规也可以实现,但是更好
  3. 数据校验 有一个序列化的过程,对参数的处理
  4. 最后一个串要拼接 函数名+参数+其他
  5. 每笔交易数量限制170笔
  6. gas 低级 中 高级
  7. 预估消耗gas的数量
  8. 对于一笔请求的状态处理
  9. 对于账户解锁的封装
  10. 批量交易的业务处理
  11. 签名并发送请求

猜你喜欢

转载自blog.csdn.net/boss2967/article/details/86095694