本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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、智能合约代码很简单,就不写了