Skip to content

Instantly share code, notes, and snippets.

@itherunder
Last active May 13, 2022 16:08
Show Gist options
  • Save itherunder/e712ee30d320b91cdff4c3d688bb2052 to your computer and use it in GitHub Desktop.
Save itherunder/e712ee30d320b91cdff4c3d688bb2052 to your computer and use it in GitHub Desktop.
一种轻后端的 dApp 架构| Awesome FaaS 0x01

0x01 dApp

Tai-Shang-Meeting前端程序的实现

  1. forkscaffold-eth项目,用于钱包的连接、签名、交易发送
  2. 使用react作为前端开发框架,antd作为组件库
  3. 实现细节:包括两个页面,即两个组件的实现

a. 获取会议信息页面

image

  • 实现一个根据会议key搜索的组件
  • 利用请求get_unsigned_msg(无参数)从后端获取未签名的消息
  • 使用metamask对获取的消息进行签名
  • 会议key签名地址签名结果作为参数调用请求get_meeting从后端获取会议信息,如该地址不在白名单中:返回一个邮件信息,可申请白名单;如会议key不存在或签名结果错误:返回错误信息
  • 关键代码分析

后端请求获得未签名消息并进行签名:

// 请求的设置如下,需POST,且body中含有一个params的数组
// 同时api url中的参数name指faas后端的模块名,func_name则为该模块中的函数名,
// 对应的参数放在body中的`params`数组中,后面的api调用均为此规则
var response = await fetch('https://faasbyleeduckgo.gigalixirapp.com/api/v1/run?name=Meeting&func_name=get_unsigned_msg', {
  method: 'POST', // 必须是POST请求
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ // body中必须是JSON字符串,且参数必须作为一个数组放在"params"这个key中
    params: [],
  }),
});
var res = await response.json();
if (!res?.result) { // 如果返回null,退出
  return;
}
var msg = res?.result;
var sig = await signer.signMessage(msg);

后端请求根据会议key获取会议信息:

response = await fetch('https://faasbyleeduckgo.gigalixirapp.com/api/v1/run?name=Meeting&func_name=get_meeting', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    params: [
      key,
      address,
      sig,
    ],
  }),
});
res = await response.json();
if (res?.result?.status === "ok") { // 正确返回时
  setIsWhiteListed(true);
  setData(JSON.parse(res?.result?.payload));
} else { // 错误返回时
  Modal.error({
    title: "错误",
    content: "您不是白名单用户,无法查询,请点击下面的链接申请白名单",
  })
  setIsWhiteListed(false);
}

b. 新建会议信息页面

image

  • 实现一个会议信息表格组件
  • 将表格中的会议信息JSON化后使用metamask对会议信息进行签名(删除其中的会议key一项,避免重复存储
  • 会议key签名地址会议信息的JSON字符串签名结果作为参数调用请求put_meeting,如该地址不是admin,返回错误信息;如成功新建会议信息,返回会议key
  • 关键代码分析

签名表格信息:

// 获取表格信息,随后删除key以避免`key-value`中重复存储会议的key
let values = form.getFieldsValue();
delete values.key; // delete values.key
// 将表格信息JSON字符串化用于作为签名消息
var meeting_info = JSON.stringify(values)
// 使用`scaffold-eth`提供的signer对象对meeting_info进行签名
var sig = await signer.signMessage(meeting_info);

调用后端api

// 直接使用fetch函数调用后端api即可
var response = await fetch('https://faasbyleeduckgo.gigalixirapp.com/api/v1/run?name=Meeting&func_name=put_meeting', {
  method: 'POST', // 必须是POST请求
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "params": [ // body中必须是JSON字符串,且参数必须作为一个数组放在"params"这个key中
      key,
      address,
      meeting_info,
      sig,
    ]
  })
});
var res = await response.json(); // 等待回复
if (res?.result?.status === "ok") { // 如果请求成功做相应处理
  // success
} else { // 请求失败
  // failed
 }

c. 操作流程

  • 新建会议:填写会议信息 => 提交 => 签名 => ok

image image image

  • 获取会议:输入会议key => 查询 => 签名 => ok

image image image image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment