开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:github.com/weopenproje…
上一章我们已经摸清了长安链 Golang 智能合约的开发套路,这一章,我们模仿的来写一个智能合约。
提到区块链的应用,反复强调的就是两个字——“信任”。当今社会,以人为主体的信任机制屡屡遭受冲击。那些编造弥天大谎的人获取了丰厚的收益,而坚守底线良知的人则籍籍无名。
无数事实证明,人类社会需要一种中立的、客观的、无法被他人左右的信任机制。区块链技术生逢其时,可以预见的,这项技术未来会服务社会的方方面面,让人类摆脱尔虞我诈,共建人类命运共同体。
爱情,一直是人类历史永恒的话题。《诗经》中“窈窕淑女,君子好逑”、“执子之手,与子偕老”、“今夕何夕,见此良人”,古朴简短的词句表达了祖先对爱情的美好向往;牛郎织女,鹊桥相会,年轻男女在七夕这一天因歌颂祈盼爱情走到一起。中华民族作为他们爱情的结晶,绵延至今,生生不息。
但是,随着社会快速发展,传统的爱情观面临诸多挑战。无法杜绝的情感欺诈、背叛不断摧毁人们对于爱情的向往。爱情已经变成一块遮羞布,遮得是人性的贪婪丑恶。打着爱情的幌子,行得是交易,是欺骗,是虚荣,是私欲。
在这样的环境下,真正的爱情信徒伤痕累累,小心翼翼,蜷缩在自己的小世界疗伤而无法相遇。如此土壤,结不出圣洁的爱情之花。
有什么办法可以净化这土壤,让这些“纯爱战士”们相遇呢?
我们可以用区块链技术搭建一个可信社区。在这个社区内,关键数据会被区块链存储,支持随时查询。面对这种不可抹消的记录,感情双方都会权衡利弊得失,从而做出更理智的选择。相信社区的人,同样能得到社区的保护,不会因感情上当受骗。同时,坚持原则的人,也会得到社区的奖励,匹配到同样相信爱情的人。
基于以上分析,开发一个“爱情锁”智能合约,用于“爱情”上链和查找。上代码:
type LoveContract struct { // 爱情合约
}
func main() {
err := sandbox.Start(new(LoveContract))
if err != nil {
sdk.Instance.Errorf(err.Error())
}
}
定义两个方法 lock 和 find(上锁和查找):
func (f *LoveContract) InvokeContract(method string) protogo.Response {
switch method {
case "lock":
return f.lock()
case "find":
return f.find()
default:
return sdk.Error("invalid method")
}
}
“爱情”结构体,“女孩”和“男孩”以及“上锁”的时间:
// Love object to store
type Love struct {
Girl string `json:"girl"`
Boy string `json:"boy"`
Time int32 `json:"time"`
}
lock 和 find 的具体实现:
func NewLove(girl string, boy string, time int32) *Love {
love := &Love{
Girl: girl,
Boy: boy,
Time: time,
}
return love
}
func (f *LoveContract) lock() protogo.Response {
params := sdk.Instance.GetArgs()
// 获取参数
girl := string(params["girl"])
boy := string(params["boy"])
timeStr := string(params["time"])
time, err := strconv.ParseInt(timeStr, 10, 0)
if err != nil {
msg := "time is [" + timeStr + "] not int"
sdk.Instance.Errorf(msg)
return sdk.Error(msg)
}
// 构建结构体
love := NewLove(girl, boy, int32(time))
// 序列化
loveBytes, err := json.Marshal(love)
if err != nil {
return sdk.Error(fmt.Sprintf("marshal love failed, err: %s", err))
}
// 发送事件
sdk.Instance.EmitEvent("topic_vx", []string{love.Girl, love.Boy})
// 存储数据
err = sdk.Instance.PutStateByte("love_bytes", love.Girl + love.Boy, loveBytes)
if err != nil {
return sdk.Error("fail to lock love bytes")
}
// 记录日志
sdk.Instance.Infof("[lock] girl=%s boy=%s", love.Girl, love.Boy)
// 返回结果
return sdk.Success([]byte(love.Boy + love.Girl))
}
func (f *LoveContract) find() protogo.Response {
// 获取参数
params := sdk.Instance.GetArgs()
girl := string(params["girl"])
boy := string(params["boy"])
// 查询结果
result, err := sdk.Instance.GetStateByte("love_bytes", girl + boy)
if err != nil {
return sdk.Error("failed to call get_state")
}
// 反序列化
var love Love
if err = json.Unmarshal(result, &love); err != nil {
return sdk.Error(fmt.Sprintf("unmarshal love failed, err: %s", err))
}
// 记录日志
sdk.Instance.Infof("[lock] girl=%s boy=%s", love.Girl, love.Boy)
// 返回结果
return sdk.Success(result)
}
ok,代码完成,下一章我们部署并测试 love 智能合约~