# 2 - 用 Go 来做以太坊开发

这里可能有读者会问,为什么用 Go 语言做以太坊开发?当然以太坊开发,有其自己的语言 Solidity,那为什么不用其自己的语言呢?
笔者这里一开始也确实打算以 Solidity 语言去学习以太坊开发,那为什么又改用 Go 语言了呢?
很简单的原因,就是项目需要,后面的开发项目中,有要求是需要用 Go 语言,基于学习成本实施成本的考虑。

# 那么这里可能还有不甘心的小伙伴儿会问 Solidity 和 Go 有什么不同呢?

它们分别用于以太坊的智能合约和底层开发。下面我会详细解释它们的不同以及如何选择。

# Solidity:

Solidity 是一种专门为以太坊平台设计的智能合约编程语言。智能合约是在区块链上执行的自动化程序,可以实现各种功能,如数字资产交换、投票系统、去中心化应用(DApp)等。Solidity 具有以下特点:

  • 目标: Solidity 旨在实现智能合约的编写,使开发人员能够在以太坊平台上构建去中心化应用。

  • 语法: Solidity 的语法与类似的编程语言(如 JavaScript)相似,使开发者相对容易上手。

  • 合约: Solidity 用于编写智能合约,合约中包含状态变量、函数、事件等,用于实现业务逻辑。

  • 特点: Solidity 具备丰富的特性,如状态变量、修饰器、事件、继承等,用于支持复杂的智能合约开发。

示例: 下面是一个简单的 Solidity 智能合约,实现一个简单的数字投票系统。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleVoting {
    uint256 public yesVotes;
    uint256 public noVotes;
    function voteYes() public {
        yesVotes++;
    }
    function voteNo() public {
        noVotes++;
    }
}

# Go:

Go 是一种通用编程语言,用于开发各种类型的应用程序,包括底层开发、Web 开发、后端开发等。在区块链领域,Go 通常用于开发区块链节点和工具,如以太坊客户端(Geth)、Hyperledger Fabric 等。

  • 目标: Go 用于通用软件开发,区块链领域中主要用于开发区块链节点、工具和底层功能。

  • 语法: Go 具有简洁而现代的语法,强调可读性和高效性。

  • 应用: Go 在区块链领域广泛应用于开发底层区块链网络、节点、钱包、工具等。

示例: 下面是一个使用 Go 编写的简单命令行工具,用于生成区块链账户地址。

package main
import (
	"fmt"
	"log"
	"github.com/ethereum/go-ethereum/accounts/keystore"
)
func main() {
	ks := keystore.NewKeyStore("./keystore", keystore.StandardScryptN, keystore.StandardScryptP)
	account, err := ks.NewAccount("passphrase")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Account address: %s\n", account.Address.Hex())
}

# 如何选择:

  • Solidity: 选择 Solidity,如果你想在以太坊平台上开发智能合约,构建去中心化应用程序(DApp),并与以太坊网络进行交互。Solidity 是专门为这些用例设计的。

  • Go: 选择 Go,如果你想参与底层区块链开发,如开发节点、客户端、工具,以及与区块链网络进行交互。Go 在这些领域有着广泛的应用。

最终,选择取决于你的项目需求和兴趣领域。如果你对智能合约和去中心化应用感兴趣,那么学习 Solidity 是一个不错的选择。如果你对底层区块链开发和工具有兴趣,那么学习 Go 会更有帮助。