1. 什么是以太坊?

以太坊(Ethereum)是一个开源的区块链平台,旨在支持去中心化应用(dApps)和智能合约。与比特币不同,以太坊不仅仅是一个去中心化的账本,更是一个全球计算平台,通过智能合约来实现各种自动化逻辑和规则。

**     以太坊的核心组成部分:**

  • 以太坊虚拟机(EVM):以太坊的执行环境,负责运行智能合约代码。

  • 账户模型:包括两种账户类型:

    • 外部账户(EOA):由用户持有,通过私钥控制。

    • 合约账户(Contract Account):由智能合约控制,部署后无法更改代码。

  • Gas机制:每次交易或合约执行都会消耗 Gas,Gas 的费用由用户支付,防止资源滥用。

     合约账户 VS 普通账户:

合约账户和普通账户的对比

这样理解:合约就是一个“带有功能和逻辑的账户”,它的功能类似于自动执行某些任务的“机器人”,不同的是,它的行为完全由部署时写入的智能合约代码决定,且无法随意更改。

智能合约 = 具备逻辑功能的账户。

它不仅能持有资产,还能根据调用者的请求执行代码逻辑。通过这种方式,区块链不仅是一个账本,更是一个去中心化的全球计算平台。

2. 智能合约的概念

     什么是智能合约?     

     **智能合约(Smart Contract)**是存储在区块链上的一种“自执行代码”,当满足特定条件时会自动执行。它由代码和数据组成,具有以下特点:

  • 不可篡改:一旦部署,代码和逻辑无法更改。

  • 自动执行:触发条件满足时自动运行。

  • 透明可信:所有人都可以查看合约代码,执行过程公开透明。

      智能合约与账户:

     可以将智能合约理解为一种特殊的区块链账户

  • 拥有自己的地址:其他用户或合约可以向其发送交易。

  • 可以持有资产:合约账户可以持有和管理以太币或代币。

  • 自动执行逻辑:根据预定义的规则处理交易和数据。

3. 智能合约执行过程

1. 部署合约

  • 用户通过一笔交易将合约代码部署到区块链。

  • 合约会获得一个唯一的地址,其他用户或合约可以与之交互。

2. 触发执行

  • 用户或其他合约通过交易调用合约函数。

  • 输入参数会被传递到合约,执行对应的逻辑。

3. 状态更新

  • 合约的执行结果会更新区块链上的状态,例如修改存储变量、发送代币等。

4. Gas消耗

  • 执行合约需要计算资源,消耗 Gas。Gas 的费用由调用者支付,按执行的指令数量计算。

4. 以太坊区块结构与合约状态存储

在以太坊中,区块只记录交易和状态变化的摘要,不直接存储合约状态。合约状态存储在一个全球的状态树中。每个区块包含以下内容:

  • 交易列表:包括用户发起的交易和合约调用。

  • 状态根:状态树的哈希值,用于记录链上所有账户和合约的状态。

  • 区块头:包括时间戳、前一个区块哈希、区块高度等信息。

5. Go语言实现简单的以太坊模型

package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 定义区块结构体
type Block struct {
	Timestamp    int64
	PreviousHash string
	Hash         string
	Data         string
	GasUsed      int
	Signer       string
}

// 定义区块链结构体
type Blockchain struct {
	blocks        []*Block
	Validators    map[string]int
	TotalSupply   int
	BlockRewards  int
	ContractState map[string]map[string]string // 合约地址 -> 状态存储
}

// 创建新的区块
func NewBlock(data string, previousHash string, signer string, gasUsed int) *Block {
	return &Block{
		Timestamp:    time.Now().Unix(),
		PreviousHash: previousHash,
		Hash:         fmt.Sprintf("%x", rand.Int63()), // 简化的哈希
		Data:         data,
		GasUsed:      gasUsed,
		Signer:       signer,
	}
}

// 初始化区块链
func NewBlockchain() *Blockchain {
	genesisBlock := NewBlock("Genesis Block", "", "", 0)
	return &Blockchain{
		blocks:        []*Block{genesisBlock},
		Validators:    make(map[string]int),
		TotalSupply:   1000000,
		BlockRewards:  100,
		ContractState: make(map[string]map[string]string),
	}
}

// 执行智能合约
func (bc *Blockchain) ExecuteContract(contractAddress string, function string, params []string, gasLimit int) {
	contract, exists := bc.ContractState[contractAddress]
	if !exists {
		fmt.Println("合约不存在")
		return
	}

	// 模拟执行逻辑并消耗 Gas
	gasConsumed := rand.Intn(gasLimit) + 1
	if gasConsumed > gasLimit {
		fmt.Println("Gas 不足,执行失败")
		return
	}

	contract["lastFunction"] = function
	fmt.Printf("合约 %s 执行成功,消耗 Gas: %d\n", contractAddress, gasConsumed)
	bc.TotalSupply -= gasConsumed
}

func main() {
	// 初始化区块链
	blockchain := NewBlockchain()

	// 部署合约
	contractAddress := "contract1"
	blockchain.ContractState[contractAddress] = make(map[string]string)

	// 执行合约
	blockchain.ExecuteContract(contractAddress, "setBalance", []string{"100"}, 50)
}

代码解读:

1. 合约部署

• 使用 DeployContract 方法,部署者提供字节码,区块链会为合约生成一个地址,并初始化存储。

2. 合约执行

• 通过 ExecuteContract 方法,检查执行权限、消耗 Gas,并模拟状态更新。

3. 状态存储

• 每个合约都有独立的 State,存储执行后的变量和数据。

注意:在真实的以太坊中,合约的存储结构和状态管理依赖于复杂的数据结构(如默克尔树)和 EVM。

6. 总结

以太坊是一个支持智能合约的去中心化计算平台,它将代码和数据存储在区块链上,允许开发者构建和运行去中心化应用。通过 Gas 机制和 PoS 等共识算法,确保了系统的安全性和资源分配。智能合约作为一种特殊账户,结合逻辑执行和状态管理,使以太坊成为区块链领域的重要技术基础。

Mirror文章信息

Mirror原文:查看原文

作者地址:0xc994Df6BD78b5e78D4E820A57d65b4EFd33bf936

内容类型:application/json

应用名称:MirrorXYZ

内容摘要:VO2rJYNVIR10a_qQ3IyigczhvRF0aXeKo-fjWuBULI4

原始内容摘要:ZE6NGyWdJPEf2j3H22kvpIRNpdXOivGhE_DY3uvDoiM

区块高度:1561677

发布时间:2024-12-05 06:53:28