区块链与以太坊智能合约开发详解

·

区块链技术诞生于十年前,当时化名中本聪的个人或团队发布了比特币的首个参考实现。比特币不仅引入了数字货币的概念,更让一项过去十年最重要的发明——区块链技术——的理论得以普及。

什么是区块链?

区块链本质上是一个运行在对等网络(P2P)中的分布式交易账本,所有交易一旦确认便无法删除或修改。交易按区块分组,并通过逻辑指针串联成链,形成不可篡改的记录。

与传统的P2P文件共享网络类似,区块链没有中央权威机构或服务器,所有网络参与者共同维护账本副本。参与网络提交交易或读取账本数据的节点称为“节点”。大多数区块链是公开的,任何人都可以按需访问其中的信息,使其成为唯一的真相来源。

交易与区块

交易和区块是区块链的基本构成单元。交易是修改账本状态的原子操作,任何用户或应用都可以加入网络并提交交易,这些交易随后会被广播给其他节点进行验证和执行。

不同区块链的交易执行方式各异。比特币主要支持账户间的资金转移,虽然支持脚本但功能有限;而以太坊不仅支持转账,还能运行程序。

公钥加密与地址

所有区块链实现都有一个共同点:公钥加密(PKI)。通过私钥和公钥对,用户可以在区块链网络中发送和接收交易。私钥用于在提交交易前进行签名,公钥则可从私钥派生并共享给他人以接收交易。由于公钥是字节序列,不便直接分享,因此区块链使用各种编码技术将其转换为用户友好的字符串,即“地址”。

交易成本与代币

改变区块链状态需要支付成本,发送交易的一方必须拥有相应的代币来支付费用。不同的区块链使用不同的原生代币(如以太坊的ETH、比特币的BTC、Cardano的ADA等)。没有代币,就无法随意发送交易。

矿工与代币发行

区块链依靠特定节点——矿工——进行代币发行,这一过程称为“挖矿”。矿工通过验证交易、将其打包成区块并添加到账本来获得手续费和网络奖励(以小额代币形式支付)。矿工在添加区块前会先添加一笔名为“Coinbase”的交易,指向自己的公钥地址,以此索取报酬。

区块链网络启动初期,代币尚未流通时,矿工通过Coinbase交易获得网络奖励,随后将这些代币转移给其他用户,从而启动代币流动。

共识协议

矿工之间需要协调才能向账本中添加区块。区块链通过分布式协议——共识协议——来管理矿工并确定添加区块的规则。比特币使用的是“工作量证明”(Proof of Work),而以太坊最初也采用相同机制,但正逐步转向“权益证明”(Proof of Stake),即以太坊2.0。

工作量证明(PoW)

PoW依赖计算能力解决复杂数学问题。矿工生成包含交易、随机数和前一个区块哈希的区块,并通过不断调整随机数计算符合特定模式的哈希值。第一个成功计算出正确哈希的矿工有权将区块提交到账本,其他矿工验证无误后,该矿工获得报酬。

权益证明(PoS)

PoW的主要问题是能耗过高,因此社区开始寻求更低成本的替代方案,PoS应运而生。该协议要求矿工(称为验证者)质押一定数量的代币才能参与区块生产。在以太坊2.0中,最低质押额为32个ETH,门槛较高。未达到要求的用户可通过质押池参与。验证者根据质押代币数量和声誉排名获得出块权,不良行为(如离线)会导致质押代币被罚没。

钱包

钱包是区块链中常见的应用,用于生成和保存私钥,并派生公钥或地址。它并不直接存储资金,而是保存指向区块链中代币的私钥。私钥一旦丢失或泄露,代币也将无法找回。

钱包分为确定性钱包和非确定性钱包。确定性钱包可通过种子短语(一组单词)恢复私钥,而非确定性钱包则无法恢复。选择钱包时还需考虑其运行平台(如网页、移动端或硬件)以及私钥存储和保护方式。

托管型钱包(如交易所提供的钱包)不直接向用户提供私钥,因此有“不是你的私钥,就不是你的币”的说法。

以太坊简介

以太坊由Vitalik Butarin、Martin Wood等人于2013年提出,2015年正式发布,旨在解决比特币的局限性,特别是在区块链中运行短程序的能力。比特币专注于去中心化支付,而以太坊则致力于构建去中心化金融系统及应用。

智能合约

智能合约是部署在区块链上的短程序,能够响应交易执行代码,并保存状态和资金(如ETH)。它可以看作是在区块链中运行的状态机,具有公开地址,可推送或拉取状态。交易既可传递资金,也可传递数据。

智能合约主要有两个用途:

例如,一个用于体育博彩的智能合约可以存储特定比赛的投注资金,并在确定获胜者后自动分配奖金。

以太坊虚拟机(EVM)

Vitalik团队设计了用于在区块链中运行字节码的虚拟机——EVM。网络中的每个节点都运行EVM,随时准备执行任意代码。

在区块链中创建新合约需要将字节码形式的程序作为交易数据负载发送。EVM执行交易且区块被添加到账本后,合约的公开地址即生成,随后便可与该地址的合约交互。

执行上下文

智能合约在隔离环境中运行,只能访问区块链上的数据或调用其他智能合约,无法查询外部服务或数据。有些合约充当“预言机”(Oracle),由外部用户或应用喂入数据供其他合约消费。

Gas费用

在EVM中运行代码需要支付成本,计算资源和存储并非免费。使用这些服务的成本以Gas为单位计算,Gas是以太坊的小额单位(WEI,10⁻¹⁸ ETH)。每笔交易都必须支付Gas费用,用于支付代码执行和存储空间分配。如果交易耗尽Gas,将被取消且费用不退。

Gas是单位而非价格,交易创建时可设置Gas价格。价格越高,交易在执行队列中的优先级越高,验证者更愿意执行高报酬交易。此外,还可以设置Gas限制,表示愿意为执行支付的最大费用。如果实际费用超出限制,交易取消;否则剩余资金退回。

不可变性

智能合约一旦部署便不可更改。若要修改现有合约,必须在新地址部署新版本。因此,必须特别关注代码质量和测试,避免引入无法修复的错误。

去中心化应用(DApp)

如果将智能合约视为运行在区块链中的后端API,那么DApp就是连接用户与智能合约的前端或用户体验层。任何连接到区块链的以太坊节点都通过HTTPS或WebSocket暴露JSON-RPC接口,DApp可使用客户端库与此接口通信。

实现DApp无需自行运行节点,可使用云端的私有服务(如Infura)访问现有节点。Infura甚至为前三个DApp提供免费访问。

👉 探索更多区块链开发工具

以太坊智能合约剖析

智能合约以字节码形式部署,但开发者无需直接编写字节码。社区提供了多种高级语言(最流行的是Solidity)可将代码编译为EVM字节码。

Solidity是一种受C++和JavaScript影响的面向对象静态语言。以下是一个用Solidity编写的简单代币合约示例:

pragma solidity >=0.8.4;
contract MyCoin {
    mapping (address => uint) balances;
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    constructor() {
        balances[tx.origin] = 10000;
    }
    function sendCoin(address receiver, uint amount) public returns(bool success) {
        if (balances[msg.sender] < amount) return false;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Transfer(msg.sender, receiver, amount);
        return true;
    }
    function getBalance(address addr) public view returns(uint) {
        return balances[addr];
    }
}

编译智能合约

Solidity编译器是开源的,有多种绑定版本。可通过NPM安装JavaScript版本:

npm install -g solc

编译合约时,生成二进制文件(用于部署)和ABI(用于DApp调用):

solcjs --bin --abi ./MyCoin.sol

ABI是描述合约可用方法、参数和返回值的JSON文档,类似于SOAP服务的WSDL或Web API的OpenAPI。

部署智能合约

可将合约部署到任何以太坊网络(主网或测试网)或开发者模拟器。测试网(如Ropsten、Rinkeby)提供水龙头(Faucet)获取测试代币,而开发时使用模拟器(如Ganache)更为便捷。

Ganache是知名的本地模拟器,暴露标准JSON-RPC接口。安装后运行:

npm install -g ganache-cli
ganache-cli

随后可使用Web3.js库部署合约到Ganache。

调用智能合约

部署后,可通过DApp或脚本调用合约方法。以下示例脚本向其他账户发送代币并查询余额:

const Web3 = require('web3');
const fs = require('fs');
// 初始化Web3、加载合约ABI、发送交易等

调用只读方法(如getBalance)不会产生交易费用,而状态修改方法(如sendCoin)需要支付Gas。

常见问题

什么是Gas?
Gas是以太坊中计算和存储资源的计价单位,用于支付交易费用。用户可设置Gas价格和限制,以控制交易成本和优先级。

智能合约可以修改吗?
不可以。智能合约一旦部署便不可更改,只能通过部署新版本来更新。因此部署前必须充分测试。

如何获取测试网代币?
测试网提供水龙头服务,用户可通过特定DApp申请少量测试代币,通常需要等待一段时间才能到账。

公钥和地址有什么区别?
公钥是加密生成的字节序列,地址则是公钥经过编码后得到的用户友好字符串,用于接收交易。

什么是共识协议?
共识协议是区块链中协调节点行为、确保数据一致性的机制,常见的有工作量证明(PoW)和权益证明(PoS)。

DApp必须自己运行节点吗?
不一定。开发者可使用Infura等服务访问远程节点,无需维护本地节点。

结语

比特币和区块链技术为构建去中心化、不可篡改的交易账本应用带来了颠覆性创新,而以太坊通过智能合约进一步拓展了可能性。虽然该技术仍需发展才能广泛应用于生产环境,但它无疑为应用开发领域展现了光明的前景。