基于区块链的数字身份应用开发(中)
任务二:项目构建
(1)通过智能合约文件生成Go文件
桌面新建web文件夹,并在web中新建contract文件夹并进入到contract文件夹
mkdir web
cd web
mkdir contract
cd contract
将导出的合约文件移动到当前contract文件夹下并解压
mv /root/Downloads/contracts.zip ./
unzip contracts.zip
使用wget命令下载solc程序
wget http://res.zhonghui.vip/blockchain/DID/resource/solc
为 solc 二进制程序添加执行权限
chmod +x solc
重新编译DIDHub 合约和 WorkClaim 合约
./solc --bin --abi ./DIDHub.sol ./WorkClaim.sol --overwrite -o ./
下载 Go SDK
wget http://res.zhonghui.vip/blockchain/DID/resource/go-sdk.zip
解压 go-sdk 压缩包
unzip go-sdk.zip
使用cd命令进入go-sdk-0.11.0文件夹并同步依赖
cd go-sdk-0.11.0
go mod tidy
编译 abigen 工具
go build ./cmd/abigen
返回上级文件夹,将abigen移动到当前目录下
cd ..
mv go-sdk-0.11.0/abigen ./
使用abigen程序生成DID.go、DIDHub.go、WorkClaim.go文件,–abi指定abi文件,- -bin指定bin文件,–pkg指定生成的go代码package,–out指定生成的代码文件
./abigen --bin ./DID.bin --abi ./DID.abi --pkg DID --out ./DID.go
./abigen --bin ./DIDHub.bin --abi ./DIDHub.abi --pkg DIDHub --out ./DIDHub.go
./abigen --bin ./WorkClaim.bin --abi ./WorkClaim.abi --pkg
WorkClaim --out ./WorkClaim.go
(2)创建beego项目
返回上级文件夹,安装bee工具
cd ../
go install github.com/beego/bee/v2@develop
构建 DIDApplication 程序项目
bee new DIDApplication
进入到项目目录,并同步项目依赖
cd DIDApplication
go mod tidy
输入如下命令,启动程序项目
bee run
浏览器访问localhost:8080,若出现下图标识即为运行成功
测试成功后,切换到终端界面,同时按下“ctrl”“c”键停止服务
(3)前端工程准备
使用vscode打开/Desktop/web/DIDApplication项目
下载静态文件 切换到终端窗口,使用“cd”命令进入到static/img文件夹下
使用“wget”命令下载图片资源
wget http://res.zhonghui.vip/blockchain/DID/img/img.zip
使用“unzip”命令解压缩图片资源文件,解压之后删除img.zip压缩包
unzip img.zip
rm img.zip
使用“wget”命令下载样式文件
wget http://res.zhonghui.vip/blockchain/DID/css/index.css
使用“cd”命令进入views文件夹,删除其中的index.tpl文件
cd ../../views
rm index.tpl
使用“wget”命令下载模板资源
wget http://res.zhonghui.vip/blockchain/DID/resource/template.zip
使用“unzip”命令解压缩模板资源文件,解压后删除template.zip压缩包
unzip template.zip
rm template.zip
(4)引入go合约文件
在DIDApplication中新建contracts文件夹,并在其中新建DID、DIDHub、WorkClaim 文件夹
在终端输入如下命令,将生成的 go 合约文件移动到对应的文件夹下
mv ../contract/DID.go contracts/DID
mv ../contract/DIDHub.go contracts/DIDHub
mv ../contract/WorkClaim.go contracts/WorkClaim
使用 ”go get“ 命令引入 ”go-sdk“ 依赖,并同步依赖
go get github.com/FISCO-BCOS/[email protected]
go mod tidy
(5)配置 GO SDK
使用cp命令复制sdk配置文件
cp -r /root/Desktop/nodes/127.0.0.1/sdk conf/
进入到conf目录下,下载get_account.sh工具
cd conf
wget http://res.zhonghui.vip/blockchain-5/tools/get_account.sh
调用get_account.sh工具,创建新用户
bash get_account.sh
注:每次生成的地址和密钥都是随机的 在 conf 目录下创建 “config.toml” 文件
[Network]
Type="channel" # 使用channel类型与区块链交互
CAFile="./conf/sdk/ca.crt" # ca文件路径
Cert="./conf/sdk/sdk.crt" # cert文件路径
Key="./conf/sdk/sdk.key" # key文件路径
[[Network.Connection]]
NodeURL="127.0.0.1:20200" # channel运行端口
GroupID=1 # 分组id
[Account]
# sdk操作账户密钥路径 注意:实验时此处应填写上文使用get_account.sh工具生成的
账户密钥路径,不要照抄以下路径
KeyFile="./conf/accounts/0x9e57448f46c2d7af0920efb2ef8a0e98bc94652c
.pem"
[Chain]
ChainID=1 # chainid
SMCrypto=false # 是否使用国密算法
[log]
Path="./" # 日志路径.pem"
需要注意的是,配置项 keyFIle 应填写上一步中使用 get_account.sh 创建的私钥文 件。
(6)后端工程准备
代码一
代码文件路径:/root/Desktop/web/DIDApplication/contracts/bcos.go
创建 “bcos.go” 文件,代码如下
package contracts
var (
configPath = "./conf/config.toml"
bcosClient *client.Client
)
func ConnectBcos() error {
configs, err := conf.ParseConfigFile(configPath)
if err != nil {
return errors.New("解析配置文件错误!")
}
client, err := client.Dial(&configs[0])
if err != nil {
return errors.New("连接节点错误!")
}
bcosClient = client
return nil
}
func recorContractdAddress(fileName string, contractAddress string)
error {
err := ioutil.WriteFile(fileName, []byte(contractAddress),
0644)
if err != nil {
return err
}
return nil
}
func LoadContractAddress(fileName string) string {
address, _ := ioutil.ReadFile(fileName)
return string(address)
}
func HexToInt(hexNumber string) int {
b, _ := new(big.Int).SetString(hexNumber, 0)
return int(b.Int64())
}
func NewPrivKey() (privateKeyECDSA *ecdsa.PrivateKey,
publicKeyECDSA *ecdsa.PublicKey, account common.Address, err error)
{
privateKeyECDSA, err = crypto.GenerateKey()
if err != nil {
return nil, nil, account, err
}
publicKey := privateKeyECDSA.Public()
publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
return privateKeyECDSA, nil, account, errors.New("cannot
assert type: publicKey is not of type *ecdsa.PublicKey")
}
account = crypto.PubkeyToAddress(*publicKeyECDSA)
crypto.SaveECDSA(account.Hex()+".txt", privateKeyECDSA)
return privateKeyECDSA, publicKeyECDSA, account, nil
}
func LoadECPrivateKeyFromtxt(fileName string) (*ecdsa.PrivateKey,
error) {
priveKey, err := crypto.LoadECDSA(fileName)
if err != nil {
return nil, err
}
return priveKey, nil
}
func ECDSASign(privKeyECDSA *ecdsa.PrivateKey, data []byte)
(signature []byte, err error) {
hash := crypto.Keccak256Hash(data)
signature, err = crypto.Sign(hash.Bytes(), privKeyECDSA)
if err != nil {
return
}
return
}
func ECDSAVerify(publicKeyECDSA *ecdsa.PublicKey, hash common.Hash,
signature []byte) bo
标签:基于,return,nil,err,--,go,区块,身份,sdk
From: https://blog.csdn.net/2401_84837659/article/details/141128969