go与solidity交互---注册--邮箱验证

287 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、封装注册方法和邮箱验证功能


//封装注册方法
func RegisterMethod(client *ethclient.Client, contract *Agreement.User, Address common.Address, name string, email string, password string) (*types.Transaction, error) {
   opts := Getopts()
   opts.Value = big.NewInt(1000000000000000000)
   res, err := contract.Register(opts, name, Address, email, password)
   fmt.Println("register:", res)
   opts.GasLimit = 3000000
   opts.GasPrice, err = GetgasPrice(client)
   if err != nil {
      log.Fatal(err)
   }
   return res, nil
}

//发送邮箱验证码方法
func EmailSend(userEmail string) string {
   // 简单设置 log 参数
   log.SetFlags(log.Lshortfile | log.LstdFlags)

   em := email.NewEmail()
   // 设置 sender 发送方 的邮箱 , 此处可以填写自己的邮箱
   em.From = "1784420499@qq.com"

   // 设置 receiver 接收方 的邮箱  此处也可以填写自己的邮箱, 就是自己发邮件给自己
   em.To = []string{userEmail}

   // 设置主题
   em.Subject = "ShareFish注册账户"

   code := EncodeToString(6)
   // 简单设置文件发送的内容,暂时设置成纯文本
   em.Text = []byte("[ShareFish],您正在验证邮箱,您的验证码是:" + code + ",请尽快验证。请勿泄露您的验证码。如非本人操作请忽略。")

   //设置服务器相关的配置
   err := em.Send("smtp.qq.com:25", smtp.PlainAuth("", "**********@qq.com", "qydemwctecedfceb", "smtp.qq.com"))
   if err != nil {
      log.Fatal(err)
   }
   log.Println("发送成功 ")
   return code
}

var table = [...]byte{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}

func EncodeToString(max int) string {
   b := make([]byte, max)
   n, err := io.ReadAtLeast(rand.Reader, b, max)
   if n != max {
      panic(err)
   }
   for i := 0; i < len(b); i++ {
      b[i] = table[int(b[i])%len(table)]
   }
   return string(b)
}

//发送邮箱附件方法
func EmailSend1(userEmail string,name string,key string)  error {
   // 简单设置 log 参数
   log.SetFlags(log.Lshortfile | log.LstdFlags)

   em := email.NewEmail()
   // 设置 sender 发送方 的邮箱 , 此处可以填写自己的邮箱
   em.From = "***********@qq.com"

   // 设置 receiver 接收方 的邮箱  此处也可以填写自己的邮箱, 就是自己发邮件给自己
   em.To = []string{userEmail}

   // 设置主题
   em.Subject = "ShareFish注册账户"

   // 简单设置文件发送的内容,暂时设置成纯文本
   em.Text = []byte("[ShareFish],您已成功注册,您的私钥是:"+key+",您的账户文件如下,请不要泄露个人信息。")
   em.AttachFile("./keystore/"+name)

   //设置服务器相关的配置
   err1 := em.Send("smtp.qq.com:25", smtp.PlainAuth("", "**********@qq.com", "qydemwctecedfceb", "smtp.qq.com"))
   if err1 != nil {
      log.Fatal(err1)
   }
   log.Println("发送成功 ")
   return err1
}

2、调用注册方法【邮箱验证】

package handler

import (
   config "Sharing/Config"
   "encoding/hex"
   "fmt"
   "github.com/ethereum/go-ethereum/accounts/keystore"
   "github.com/ethereum/go-ethereum/crypto"
   "github.com/gin-gonic/gin"
   "io/ioutil"
   "log"
)

//邮箱验证
func sendEmail(c *gin.Context) {
   email := c.PostForm("use_email")
   var code = config.EmailSend(email)
   respOK(c, code)
}

//注册
var names string
func register(c *gin.Context) {
   //初始化client
   client, err := config.GetClient()
   if err != nil {
      respError(c, err)
      fmt.Println(err)
      return
   }
   //初始化合约地址
   contract, err := config.GetAddress(client)
   if err != nil {
      respError(c, err)
      return
   }

   name := c.PostForm("use_name")
   email := c.PostForm("use_email")
   password := c.PostForm("use_password")
   fmt.Println("pass", password)

   ks := keystore.NewKeyStore("./keystore", keystore.StandardScryptN, keystore.StandardScryptP)
   account, _ := ks.NewAccount(password)
   data, err := config.RegisterMethod(client, contract, account.Address, name, email, password)

   fileInfoList,err :=ioutil.ReadDir("./keystore")
   if err!=nil {
      log.Fatal(err)
   }
   fmt.Println("len(fileInfoList):",len(fileInfoList))
   for i:=range fileInfoList{
      if i ==len(fileInfoList)-1 {
         names =fileInfoList[i].Name()
         fmt.Println(names)
      }
   }

   keyjson, errs := ioutil.ReadFile("./keystore/" + names)
   fmt.Println("keyjson:", string(keyjson))
   if errs != nil {
      respError(c, err)
      return
   }
   unlockedKey, errors := keystore.DecryptKey(keyjson, password)
   fmt.Println("unlock:", unlockedKey)
   if errors != nil {
      respError(c, err)
      fmt.Println(errors)
      return
   }
   privKey = unlockedKey.PrivateKey
   fmt.Println("pri", privKey)
   key :=crypto.FromECDSA(privKey)
   fmt.Println(key)
   keybase := hex.EncodeToString(key)
   fmt.Println(keybase)
   err1 :=config.EmailSend1(email,names,keybase)
   if err1 !=nil {
      fmt.Println(err1)
   }
   respOK(c, data)
   fmt.Println("data", data)
}

3、与前端交互一下就好了 4、智能合约代码很简单,就不写了