千家信息网

dashboard创建密钥时前端的数据怎么传到后端

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,这篇文章主要介绍"dashboard创建密钥时前端的数据怎么传到后端",在日常操作中,相信很多人在dashboard创建密钥时前端的数据怎么传到后端问题上存在疑惑,小编查阅了各式资料,整理出简单好用的
千家信息网最后更新 2024年11月27日dashboard创建密钥时前端的数据怎么传到后端

这篇文章主要介绍"dashboard创建密钥时前端的数据怎么传到后端",在日常操作中,相信很多人在dashboard创建密钥时前端的数据怎么传到后端问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"dashboard创建密钥时前端的数据怎么传到后端"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们创建一个密钥和相应的帐户,就是下面这张图所对应的:

当我们点击了"Register"按钮以后,我们在前端页面上填写的参数,到底是如何一步步的传到比原的后端的。

跟之前一样,我们将对这个问题进行细分,然后各个击破:

  1. 前端:当我们填完表单,点了提交以后,比原在前端是如何发送数据的?

  2. 后端:比原的后端是如何接收到数据的?

前端:当我们填完表单,点了提交以后,数据会发送到后端的哪个接口?

当我们点击了"Register"按钮,在前端页面中,一定会在某个地方触发一个向比原节点webapi接口发出请求的操作。究竟是访问的哪个web api?提交的数据又是什么样的呢?让我们先从前端代码中寻找一下。

注意,比原的前端代码位于另一个项目仓库bytom/dashboard中。为了能与我们在本系列文章中使用的比原v1.0.1的代码相匹配,我找到了dashboard中的v1.0.0的代码,并且提交到了一个单独的项目中:freewind/bytom-dashboard-v1.0.0。注意该项目代码未做任何修改,其master分支对应于官方代码仓库的v1.0.0分支。之所以要弄一个单独的出来,这是因为我们在文章中,每次引用一段代码的时候,都会给出相应的github上的链接,方便读者跳过去查看全貌,使用一个独立项目,会让这个过程更简便一些。

由于比原的前端页面是使用React为主的,所以我猜想在代码中,也该会有一个名为Register的组件,或者某个表单中有一个名为Register的按钮。经过搜索,我们幸运的发现了Register.jsx 这个组件文件,它正好是我们需要的。

经过高度简化后的代码如下:

src/features/app/components/Register/Register.jsx#L9-L148

class Register extends React.Component {  // ...  // 4.   submitWithErrors(data) {    return new Promise((resolve, reject) => {      // 5.       this.props.registerKey(data)        .catch((err) => reject({_error: err.message}))    })  }  // ...  render() {    // ...    return (      // ...      // 3.      
// 1. // 2. // .... // ... ) }}

上面的代码,共有5个地方需要注意,被我用数字标示出来了。注意这5个数字并不是从上到下标注,而是按照我们关注的顺序来的:

  1. 表单上的各个输入框,就是我们填写别名和密码的地方。这里需要关注的是每个TextFieldfieldProps属性,它对应我们提交到后台的数据的name

  2. 就是那个"Register"按钮了。需要注意的是,它的typesubmit,也就是说,点击它以后,将会触发所在formonSubmit方法

  3. 回到了form的开头。注意它的onSubmit里面,调用的是handleSubmit(this.submitWithErrors)。其中的handleSubmit是从该表单所使用的第三方redux-form中传入的,用来处理表单提交,我们在这里不关注它,只需要知道我们需要把自己的处理函数this.submitWithErrors传给它。而在后者中,我们将会调用比原节点提供的web api

  4. 第3步中的this.submitWithErrors最终将走到这里定义的submitWithErrors函数

  5. submitWithErrors将会发起一个异步请求,最终调用由外部传进来的registerKey函数

从这里我们还看不到调用的是哪个api,所以我们必须继续去寻找registerKey。很快就在同文件中找到了registerKey

src/features/app/components/Register/Register.jsx#L176-L180

(dispatch) => ({    registerKey: (token) => dispatch(actions.core.registerKey(token)),    // ...  })

它又将会调用actions.core.registerKey这个函数:

src/features/core/actions.js#L44-L87

const registerKey = (data) => {  return (dispatch) => {    // ...    // 1.1    const keyData = {      'alias': data.keyAlias,      'password': data.password    }    // 1.2    return chainClient().mockHsm.keys.create(keyData)      .then((resp) => {        // ...        // 2.1        const accountData = {          'root_xpubs':[resp.data.xpub],          'quorum':1,          'alias': data.accountAlias}        // 2.2        dispatch({type: 'CREATE_REGISTER_KEY', data})        // 2.3        chainClient().accounts.create(accountData)          .then((resp) => {            // ...            // 2.4            if(resp.status === 'success') {              dispatch({type: 'CREATE_REGISTER_ACCOUNT', resp})            }          })    // ...      })    // ...  }}

可以看到,在这个函数中,做的事情还是很多的。而且并不是我一开始预料的调用一次后台接口就行了,而是调用了两次(分别是创建密钥和创建帐户)。下面进行分析:

  1. 1.1是为了让后台创建密钥而需要准备的参数,一个是alias,一个是password,它们都是用户填写的

  2. 1.2是调用后台用于创建密钥的接口,把keyData传过去,并且拿到返回的resp后,进行后续的处理

  3. 2.1是为了让后台创建帐户而需要准备的参数,分别是root_xpubs, quorumalias,其中root_xpubs是创建密钥后返回的公钥,quorum目前不知道(TODO),alias是用户填写的帐户别名

  4. 2.2这一句没有作用(经过官方确认了),因为我在代码中没有找到处理CREATE_REGISTER_KEY的代码。可以看这个issue#28

  5. 2.3调用后台创建帐户,把accountData传过去,可以拿到返回的resp

  6. 2.4调用成功后,再使用redux的dispatch函数分发一个CREATE_REGISTER_ACCOUNT信息。不过这个信息好像也没有太大用处。

关于CREATE_REGISTER_ACCOUNT,我在代码中找到了两处相关:

  1. src/features/core/reducers.js#L229-L234

const accountInit = (state = false, action) => {  if (action.type == 'CREATE_REGISTER_ACCOUNT') {    return true  }  return state}
  1. src/features/app/reducers.js#L10-L115

export const flashMessages = (state = {}, action) => {  switch (action.type) {    // ...    case 'CREATE_REGISTER_ACCOUNT': {      return newSuccess(state, 'CREATE_REGISTER_ACCOUNT')    }    // ...  }}

第一个看起来没什么用,第二个应该是用来在操作完成后,显示相关的错误信息。

那就让我们把关注点放在1.22.3这两个后台调用的地方吧。

  1. chainClient().mockHsm.keys.create(keyData)对应的是:

src/sdk/api/mockHsmKeys.js#L3-L31

const mockHsmKeysAPI = (client) => {  return {    create: (params, cb) => {      let body = Object.assign({}, params)      const uri = body.xprv ? '/import-private-key' : '/create-key'      return shared.tryCallback(        client.request(uri, body).then(data => data),        cb      )    },    // ...  }}

可以看到在create方法中,如果找不到body.xprv(就是本文对应的情况),则会调用后台的/create-key接口。经过一长串的跟踪,我们终于找到了一个。

  1. chainClient().accounts.create(accountData)对应的是:

src/sdk/api/accounts.js#L3-L30

const accountsAPI = (client) => {  return {    create: (params, cb) => shared.create(client, '/create-account', params, {cb, skipArray: true}),    // ...  }}

很快我们在这边,也找到了创建帐户时调用的接口为/create-account

前端这边,我们终于分析完了。下一步,将进入比原的节点(也就是后端)。

后端:比原的后端是如何接收到数据的?

如果我们对前一篇文章还有印象的话,会记得比原在启动之后,会在Node.initAndstartApiServer方法中启动web api对应的http服务,并且在API.buildHandler()方法中会配置很多的功能点,其中一定会有我们这里调用的接口。

让我们看看API.buildHandler方法:

api/api.go#L164-L244

func (a *API) buildHandler() {    walletEnable := false    m := http.NewServeMux()    if a.wallet != nil {        walletEnable = true        // ...        m.Handle("/create-account", jsonHandler(a.createAccount))        // ...        m.Handle("/create-key", jsonHandler(a.pseudohsmCreateKey))        // ...

很快,我们就发现了:

  1. /create-account: 对应a.createAccount

  2. /create-key: 对应a.pseudohsmCreateKey

让我们先看一下a.pseudohsmCreateKey

api/hsm.go#L23-L32

func (a *API) pseudohsmCreateKey(ctx context.Context, in struct {    Alias    string `json:"alias"`    Password string `json:"password"`}) Response {    // ...}

可以看到,pseudohsmCreateKey的第二个参数,是一个struct,它有两个字段,分别是AliasPassword,这正好和前面从前端传过来的参数keyData对应。那么这个参数的值是怎么由提交的JSON数据转换过来的呢?上次我们说到,主要是由a.pseudohsmCreateKey外面套着的那个jsonHandler进行的,它会处理与http协议相关的操作,以及把JSON数据转换成这里需要的Go类型的参数,pseudohsmCreateKey就可以直接用了。

由于在这个小问题中,我们问题的边界是比原后台是如何拿到数据的,所以我们到这里就可以停止对这个方法的分析了。它具体是怎么创建密钥的,这在以后的文章中将详细讨论。

再看a.createAccount

api/accounts.go#L15-L30

// POST /create-accountfunc (a *API) createAccount(ctx context.Context, ins struct {    RootXPubs []chainkd.XPub `json:"root_xpubs"`    Quorum    int            `json:"quorum"`    Alias     string         `json:"alias"`}) Response {    // ...}

与前面一样,这个方法的参数RootXPubsQuorumAlias也是由前端提交,并且由jsonHandler自动转换好的。

到此,关于"dashboard创建密钥时前端的数据怎么传到后端"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

前端 数据 代码 密钥 后台 参数 方法 接口 函数 帐户 表单 处理 地方 就是 按钮 文章 问题 项目 学习 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全宣传原创 为什么数据库没有维普 软件开发速成需要多长时间 嘉兴嵌入式软件开发总结 汕尾通信软件开发供应商家 软件开发阶段资本化支出报告 吃鸡怎么看自己在哪个服务器 天耀棋牌软件开发商 怎么将多行变成一行数据库 互联网金融专业换成金融科技 中国网络安全法治建设之路 我的世界国际版怎么进别人服务器 为什么觉得自己适合软件开发 数据库技术经历了哪3个阶段 东营客户服务crm软件开发 杭州友朋网络技术有限公司 网络安全保障体系和能力建设 网络安全宣传走进大学校园 维护网络安全的手段之一 重庆异响顺互联网科技 智慧交通网络安全防火墙 哈尔滨市网络安全倡议书 视频监控 网络安全 图像数据库怎样构建 光明大陆 不同服务器 合并视频软件开发 网络技术包括哪一些 网络安全科技利大于弊 舆情搜索软件开发 服务器报错下载word文件失败
0