长安链 Golang 智能合约开发实战02

372 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 智能合约~