Tag: blockchain

PoA 共识下的ethereum如何引入出块奖励?

在之前的文章中介绍了通过修改源码的方式来实现PoA共识下的出块奖励,在只有一个节点的情况下,这种方式并不会有什么问题;一旦有新的节点加入网络,那新增的节点就会卡在数据同步的阶段。那为什么会出现这种情况呢?

部署自己的 Ethereum 浏览器

1. Blockscout 简介

Blockscout 允许用户搜索交易、查看账户和余额、验证和与智能合约互动,并查看和与以太坊网络上的应用程序进行交互,包括许多分叉、侧链、L2 和测试网。

PoA 验证者也能获取出块奖励吗?

1. 出块奖励

出块奖励是指在区块链网络中,节点(如矿工或验证者)成功创建和添加一个新的区块到区块链上时所获得的奖励。这种奖励通常以加密货币的形式发放,目的是激励节点参与网络的维护和安全。

Solidity、Geth、EVM 三者之间的关系

在以太坊开发生态系统中,Solidity 版本Geth 版本EVM(Ethereum Virtual Machine)版本 之间有密切的关系。理解它们的关系对于智能合约开发、部署和执行至关重要。以下是对这些版本关系的详细介绍:

多验证者节点PoA私链搭建

多验证者节点部署

注意:本文档仅适用于POA共识的多验证者节点部署。 geth自1.14.x之后不再支持Clique共识,所以编译solidity合约时,evm最高只支持到London

ethereum权威共识机制(PoA)简述

以太坊是一个强大的区块链平台,支持智能合约和去中心化应用(dApps)的开发。为了确保网络的安全性和交易的有效性,以太坊采用了多种共识机制。其中,权威证明(Proof of Authority, PoA)是一种相对较新的共识模型,主要用于提升网络的效率。本文将深入探讨PoA的工作原理、优缺点及其应用场景。

从0开始开发自己的BTC钱包:助记词

前面的几篇文章主要是介绍了一些btc的基础知识,现在我们可以开发自己的btc钱包了。本文是系列文章的第六篇,主要介绍助记词命令,包括创建并保存助记词、导入助记词。

从0开始开发自己的BTC钱包:双花攻击

双花问题(Double-Spending Problem)是指在数字货币系统中,一个用户试图将同一笔资金花费多次的问题。在传统的货币系统中,这种问题通常不容易出现,因为交易是通过中心化的金融机构处理的,它们能够实时更新账户余额,确保同一笔钱不会被多次使用。但在去中心化的数字货币系统中(如比特币),没有中央权威来监督交易,所以解决双花问题是非常关键的。

读写集冲突

在Hyperledger Fabric中,读写集冲突(Read-Write Set Conflict) 是指在多个事务试图同时修改或读取相同的账本状态时,由于版本号不一致导致的事务提交失败。这种冲突机制是Fabric用来保证数据一致性和防止并发事务引发不一致状态的核心部分。

hyperledger fabric读写集简介

在Hyperledger Fabric中,读写集(Read-Write Set, R/W Set) 是智能合约(链码)执行期间生成的一个关键数据结构,包含了事务执行过程中对账本状态的读取和写入操作。理解读写集是理解Fabric事务处理流程的核心之一。以下是对读写集的详细介绍:

从0开始开发自己的BTC钱包:BTC分叉

什么是比特币分叉(BTC Fork)?

比特币分叉是指区块链网络在某些条件下产生分裂,导致出现两个或多个独立的区块链。这些分叉主要分为以下几种类型:

从0开始开发自己的BTC钱包:PoW

1. 什么是PoW?

工作量证明(Proof of Work,简称PoW)是比特币网络中用于确保交易和区块有效性的一种共识机制。它要求矿工通过计算大量的哈希值来解决复杂的数学问题,以获得记账权并奖励比特币。这一过程也称为“挖矿”。

从0开始开发自己的BTC钱包:UTXO

1. 什么是UTXO?

UTXO(Unspent Transaction Output,未花费交易输出)是比特币网络中用于追踪交易的核心概念。简单来说,UTXO代表了每个比特币地址的可用余额。它描述了哪些比特币是“未被花费的”,从而可以用于新的交易。

从0开始开发自己的BTC钱包:BTC地址生成

BTC(比特币)地址是一个由字母和数字组成的字符串,用于接收和发送比特币。每个地址代表着区块链上一个唯一的标识符,与一对公钥和私钥相关联。比特币地址的生成过程涉及复杂的加密算法,确保其安全性和唯一性。

BIP38简介

BIP-38(Bitcoin Improvement Proposal 38)是比特币改进提案之一,旨在对私钥进行加密,以方便安全地存储和传输。通过加密私钥,用户可以使用一个密码对其进行保护。解密加密的私钥需要提供正确的密码,从而增加了私钥的安全性。

从0开始开发自己的BTC钱包:钱包

比特币(BTC)钱包是一个用于管理比特币私钥、公钥和地址的工具,允许用户安全地发送、接收和存储比特币。比特币钱包不仅是一个简单的应用程序或设备,它是用户与比特币区块链互动的接口,负责管理用户的数字资产和交易权限。

估算btc交易费

估算比特币(BTC)交易费用主要取决于以下几个因素:

P2SH地址

P2SH(Pay to Script Hash)地址是比特币中一种功能强大且灵活的地址类型。它允许更复杂的交易脚本,并在比特币网络上广泛使用。下面详细介绍P2SH地址的特点、用途以及优势。

BTC地址类型

比特币(BTC)有几种不同的地址类型,每种类型的地址在格式、特性和使用场景上有所不同。以下是主要的几种比特币地址类型的对比:

BIP-44 简介

BIP-44是一种密码学协议,全称为Bitcoin Improvement Proposal 44,它提出了一种确定性钱包架构,用于生成多个加密货币地址和密钥对。以下是关于BIP-44的详细介绍:

从助记词生成钱包

在加密货币领域,将助记词转换为种子(seed)是一种常见的做法,用于生成HD(Hierarchical Deterministic)钱包的根私钥。这种转换通常依据BIP-39标准,其中助记词被用作人类可读的形式来表示一段熵(entropy),而种子则是用于加密货币钱包的实际密钥生成。

助记词简介

助记词(Mnemonic)是用于生成和管理加密货币钱包的一种便于记忆的词组。助记词可以将一个复杂的种子(Seed)转换为一组易于记忆的单词,这些单词可以用来恢复钱包和生成私钥、公钥等。助记词在区块链和加密货币的世界中被广泛使用,尤其是在使用BIP-39标准的比特币和以太坊钱包中。

Solidity:代理模式升级合约

在Solidity中,通过代理模式来升级智能合约是一种常见且有效的做法,它允许在不中断现有合约功能的情况下进行更新。这种模式的基本思路是将合约的状态和主要逻辑分离,使得可以在一个新的合约中部署更新的逻辑,然后通过一个代理合约来调用新的逻辑,从而达到升级的目的。

MerkleTree 使用

Merkle 树(Merkle Tree)是一种树状数据结构,通常用于验证大量数据的完整性和一致性,特别是在加密货币和分布式存储系统中广泛应用。它的核心思想是通过将数据分成小块,并使用哈希函数构建出树状结构,以快速验证任意一块数据是否包含在整体中。它最重要的特性是可以通过少量的

使用btcd发送交易

btcd 是一个用Go语言(golang)编写的比特币全节点替代实现。btcsuite 是一个Go语言的 btc 库集合,我们可以使用它来构建比特币交易。

btcd 配置项说明

在比特币网络中,btcd 是一个用Go语言(golang)编写的比特币全节点替代实现,提供了丰富的配置选项来定制节点的行为和性能。本文详细介绍了各个配置部分及其作用。

Bitcoin-core 冷钱包

Bitcoin Core 是比特币的官方客户端,由比特币核心开发团队维护。它不仅可以作为全节点运行,验证区块链的每个交易,还可以作为一个钱包来存储和管理比特币。使用 Bitcoin Core 创建冷钱包是一种高度安全的方式,因为冷钱包是离线存储私钥的,可以有效防止黑客攻击。下面详细介绍如何使用 Bitcoin Core 创建和管理冷钱包。

BTC钱包简介

比特币钱包是用来存储、接收和发送比特币的工具,根据其连接网络的方式,可以分为冷热钱包。了解冷热钱包的区别,有助于你根据自身需求选择合适的钱包类型。

BTC 地址

比特币地址(Bitcoin Address)是用于接收和发送比特币的唯一标识符,类似于传统金融系统中的银行账号。一个比特币地址由一串字母和数字组成,通常以1、3或bc1开头,具体长度为26至35个字符。以下是比特币地址的主要类型及其特点:

使用btcd构建BTC交易

使用btcd和相关的btcsuite库来构建比特币交易涉及多个步骤,包括生成密钥对、创建锁定和解锁脚本、构建和签名交易、以及广播交易。

OpenZeppelin

OpenZeppelin 是一个开源框架,提供了一系列经过审计的智能合约库,帮助开发者在以太坊和其他 EVM 兼容区块链上构建安全的去中心化应用(dApps)。OpenZeppelin 的合约库涵盖了代币标准(如 ERC20 和 ERC721)、访问控制、支付、代理等多个方面,极大地简化了智能合约的开发过程。

Solidity:NFT

NFT,全称为非同质化代币(Non-Fungible Token),是一种基于区块链技术的数字资产。与比特币等传统加密货币不同,NFT是唯一的、不可替代的,每一个NFT都有其独特的标识信息。

Solidity:ERC721

ERC-721 是以太坊区块链上的一种智能合约标准,专门用于创建和管理不可替代代币(NFT)。这些代币与ERC-20代币不同,ERC-20代币是同质化代币,每个代币都是相同的,可以互换。而ERC-721代币则是独一无二的,每个代币都具有独特的属性和价值

Solidity:assembly

在Solidity中,assembly是一个内嵌的低级语言,它允许开发者直接编写EVM(以太坊虚拟机)字节码。这种能力使得开发者可以更精细地控制智能合约的行为,并且在某些情况下可以提高性能和减少gas费用。然而,使用assembly也增加了代码的复杂性和出错的可能性,因此应谨慎使用。

MerkleTree in BTC

Merkle 树是一种用于高效且安全地验证大数据结构完整性和一致性的哈希树。它在比特币网络中起到至关重要的作用。Merkle 树是一种二叉树结构,其中每个叶子节点包含数据块的哈希值,每个非叶子节点包含其子节点哈希值的组合哈希。

btcd区块结构

btcd 中,区块结构由区块头(Block Header)和交易列表(Transaction List)组成。区块头包含了一些元数据,而交易列表包含了区块中的所有交易。

btcd地址管理器:addrmgr

概述

为了维护点对点的比特币网络,需要有一个地址来源以便在节点进出时进行连接。比特币协议提供了 getaddraddr 消息,允许节点之间相互传递已知的地址。然而,需要有一个机制来存储这些结果并从中选择节点。同样重要的是,远程节点不能被信任来发送有效的节点,也不能保证不会试图出于恶意目的仅向你提供他们控制的节点。

btcd的交易结构

在比特币和 btcd 中,交易(Transaction)是区块链的基本构建块。每个交易由输入(Inputs)和输出(Outputs)组成。输入引用之前的输出,并提供解锁这些输出的条件。输出包含接收比特币的地址和金额。

BTC交易流程

交易流程

比特币的交易流程涉及多个步骤和参与方,包括发送方、接收方、矿工和比特币网络中的节点。以下是比特币交易的详细流程:

PoW简介

工作量证明(Proof of Work,简称 PoW)是一种用于分布式网络中达成共识的算法。它最早由 Cynthia Dwork 和 Moni Naor 于1993年提出,并由 Satoshi Nakamoto 在比特币白皮书中应用到区块链技术中。在区块链网络里,PoW 用于确保区块链网络的安全性和数据一致性。

RPC连接btcd网络

1. btcd网络部署

btcd 提供了一个轻量级且高效的比特币全节点实现。这里以docker方式部署 btcd 网络,docker-compose.yml 文件如下:

btcd简介

1. btcd简介

btcd是一个用Go语言(golang)编写的比特币全节点替代实现。

Solidity:ERC20

简介

ERC20是以太坊区块链上的一个标准,用于创建和发行智能合约,实现代币化的应用。它定义了一组通用的接口,使得开发者可以创建和使用代币,而不需要了解底层区块链技术的细节。以下是ERC20标准中的主要接口及其含义:

Solidity:chainlink

简介

Chainlink是一个去中心化的Oracle网络,它允许智能合约在链上与链下的数据进行安全和可靠的交互。Chainlink的目标是成为区块链和现实世界之间的桥梁,使得智能合约能够访问现实世界的数据,支付系统,API等,从而扩大其应用范围。

Solidity:多签钱包

什么是多签钱包

多签钱包,也称为多重签名钱包,是一种加密钱包,它需要多个私钥才能签署并发送交易。这种钱包的主要优点是提供了额外的安全层,因为即使一个私钥被盗,也无法进行交易,除非有其他私钥的授权。

Solidity:存钱罐合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract CoinBank {
    // 声明一个变量来存储合约的所有者
    address immutable owner;

    // 在合约创建时,设置合约的所有者为创建者
    constructor() {
        owner = msg.sender;
    }

    // 装饰器函数,用于判断调用者是否是合约所有者
    modifier OnlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    // 创建一个名为deposit的函数,允许任何人向合约发送以太币
    function deposit() public payable {
        // 函数体为空,因为我们不需要做任何事情
        // 任何发送到这个函数的以太币都会自动添加到合约的余额中
    }

    // 创建一个名为withdraw的函数,只允许合约的所有者提取以太币
    function withdraw() external OnlyOwner {
        // require(msg.sender == owner, "caller is not owner");

        // 使用transfer函数将合约的所有余额发送给所有者
        (bool sent, bytes memory data) = address(msg.sender).call{
            value: address(this).balance
        }("");
        require(sent, "Failed to send Ether");
    }

    // 获取当前地址的余额
    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

上面的合约可以说是一个存钱罐合约,它允许任何人存入以太币,但只有合约的所有者才能取出:

Solidity:assembly和unchecked

unchecked

在 Solidity 0.8.0 及以上版本中,引入了一个新的关键字 unchecked。在 unchecked 块中,算术运算将不会进行溢出检查,这意味着如果结果超过了类型的最大值,它将回滚到类型的最小值,反之亦然。

Solidity:库函数

简介

在Solidity中,库(Libraries)是一种特殊类型的合约,它们包含了一些可重用的函数,可以在其他合约中调用。库函数可以帮助我们减少代码冗余,提高代码的可读性和可维护性。

Solidity:Gas 优化

在Solidity中,优化gas使用是非常重要的,因为每一笔交易都需要消耗gas。以下是一些可以帮助你优化gas使用的技巧:

Solidity:在合约中创建其它合约

在Solidity中,new关键字用于创建一个新的智能合约实例。当你使用new关键字创建一个新的合约实例时,Solidity会在区块链上部署一个新的合约,并返回新合约的地址。自0.8.0版本开始,new关键字通过指定salt选项支持create2特性。

Solidity:四种防止重入攻击的方法

在Solidity中,重入攻击是一种常见的安全问题。它发生在一个合约调用另一个合约的函数,然后被调用的合约再次调用原合约的函数,从而在原合约的函数完成之前改变其状态。以下是一些防止重入攻击的方法:

Solidity:合约调用方式

在Solidity中,合约之间的交互是通过调用进行的。以下是一些主要的合约调用方式:

Solidity:call 和 delegatecall

在Solidity中,calldelegatecall是两种用于在合约之间进行交互的低级函数。它们都可以调用合约的函数,但是它们的工作方式和用途有所不同。

Solidity:接收 ETH

payable

在Solidity中,payable是一个函数修饰符,它允许函数接收Ether(以太币)。如果一个函数被标记为payable,那么你可以在调用该函数时附带一定数量的Ether。如果一个函数没有被标记为payable,那么你不能在调用该函数时发送Ether,否则交易将被拒绝。

Solidity:发送 ETH

在Solidity中,transfersendcall是用于发送ETH的三种方法。以下是对这三种方法的详细介绍:

Solidity:接口

在Solidity中,接口是一种定义合约之间如何交互的方式。接口只能包含函数声明,不能包含函数实现。这意味着接口中的函数没有函数体。接口可以被其他合约实现(通过使用is关键字),这样那些合约就必须提供接口中所有函数的实现。

Solidity:合约继承

在Solidity中,继承是一种使一个合约可以获取另一个合约的属性和方法的方式。这是一种代码复用的方法,可以使你的代码更加模块化,更易于理解和维护。

Solidity:constructor函数

什么是 constructor

在Solidity中,constructor是一个特殊的函数,它在合约被部署到区块链时自动执行。这个函数在合约的生命周期中只会被调用一次,就是在合约创建时。

Solidity:修饰器

在Solidity中,修饰器是一种特殊的函数,可以用来修改其他函数的行为。修饰器可以用来检查函数的前置条件,修改函数的输入或输出,或者在函数执行前后执行一些额外的代码。

Solidity:错误

在Solidity中,错误处理是非常重要的一部分。合约中的错误可能会导致严重的安全问题,因此需要谨慎处理。Solidity提供了几种不同的方式来处理错误:

Solidity:事件

在 Solidity 中,事件(Event)是合约与区块链外部的接口。事件可以用来记录合约的状态变化,或者触发合约外部的响应。事件在合约中被触发,然后被区块链记录在交易日志中。

Solidity:函数

在 Solidity 中,函数是执行特定任务的代码块。函数可以接受参数,并且可以返回值。函数在智能合约中起着核心作用,用于实现合约的逻辑。

Solidity:数据存储位置

在 Solidity 中,有三种数据存储位置:storage、memory 和 calldata。这三者的差异主要在于它们的数据保存位置和存储周期。

Solidity:常用数据结构

在 Solidity 中,有各种各样的数据结构可用于组织和处理信息。以下是一些最常用的数据结构。

Solidity:控制语句

1. 条件语句

Solidity 中的条件判断和其他编程语言中的大致相同。它使用 ifelseelse if 语句来执行基于特定条件的代码块。这些语句在智能合约中经常使用,以便在满足某些条件时执行特定的操作。

Solidity:Gas

1. Gas 介绍

在 Solidity 和以太坊中,gas 是一个非常重要的概念。它是衡量在以太坊区块链上执行交易或运行智能合约所需的计算工作量的单位。基本上,每一次在以太坊网络中执行某种操作,如交易或合约调用,都需要消耗一定数量的 gas。

Solidity:变量与常量

1. 变量

在Solidity中,存在三种主要类型的变量:局部(Local)变量、状态(State)变量和全局(Global)变量。它们的作用范围和行为各不相同。需要注意的一点是,状态变量和全局变量的使用可能会耗费更多的gas,因为它们涉及到在区块链上存储和读取数据。因此,应该尽量减少这两种类型变量的使用,特别是在需要大量计算的函数中。

Hello World with solidity

1. Solidity 是什么?

Solidity 是一种面向对象的、静态类型的编程语言,专为在以太坊上编写智能合约而创建。由于以太坊上的智能合约可以处理真实世界的资产(比如加密货币),所以Solidity的设计非常关注安全性。

Web3.js常用API:发送交易

1. 使用本地钱包进行转账

import { Web3 } from 'web3';

const web3 = new Web3('https://sepolia.infura.io/v3/YOUR_INFURA_ID')
// 从私钥导入账户
const account = web3.eth.accounts.wallet.add('YOUR_PRIVATE_KEY')

// 查询当前账户余额
const balance = await web3.eth.getBalance(account[0].address)
const balanceEth = await web3.utils.fromWei(balance,'ether');
console.log('余额:',balanceEth,'ETH')

// 构造交易
const transaction = {
    nonce: await web3.eth.getBlockTransactionCount(account[0].address), // 代表从特定地址发送的交易数量。每次交易被成功地打包进区块后,从该地址发出交易的nonce就会增加。防止同一笔交易因意外导致执行多次。
    from:account[0].address,                                            // 发送地址
    to:'0x668E1d61eB2872D4bF6dd17D32DC5f1FD993A6AD',                    // 接收地址
    value: web3.utils.toWei('0.000045', 'ether'),                       // 转账金额
    gasPrice:gasPrice,                                                  // 当前gas价格
}
// 预估gas
const gas = await web3.eth.estimateGas(transaction)
console.log('预计耗费gas:', gas)
transaction.gas = gas                                                   // 最大gas,交易完成如有剩余会返还,不足会导致交易回滚
web3.eth.sendTransaction(transaction).then(console.log);

2. 发送原始交易

import { Web3 } from 'web3';

const web3 = new Web3('https://ethereum-sepolia.publicnode.com');
// 创建账户
const account = web3.eth.accounts.privateKeyToAccount('0x3afbb985211d17b9cdb5b3e7fd9f1017952d19275b4f6d31ed9f15bffb2e6185')
// 构建原始交易
const rawTransaction = {
    from: account.address,
    to:'0x668E1d61eB2872D4bF6dd17D32DC5f1FD993A6AD',
    nonce: await web3.eth.getTransactionCount(account.address),
    value:10,
    gasPrice:gasPrice,
    data: "0x0" 
}
// 预估gas
const gas = await web3.eth.estimateGas(rawTransaction)
console.log('预计耗费gas:', gas)
rawTransaction.gas = gas 

// 使用私钥对交易进行签名
const signedTransaction = await web3.eth.accounts.signTransaction(rawTransaction, account.privateKey);
// 发送交易
const txReceipt = await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction);
console.log('Transaction Receipt:', txReceipt);

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Web3连接以太网

1. Infura

Infura 是一种托管服务,提供对各种区块链网络的安全可靠访问,消除了管理区块链基础设施的复杂性,使开发者能够专注于构建创新的 Web3 应用程序。

HD钱包和BIP32、BIP44、BIP39

1. 钱包

1.1 数字钱包

数字钱包是一种让用户以数字方式存储、跟踪、转账和接收货币的系统。其货币可以是数字资产如比特币,道格币等等,也可以是数字化的法定货币如美元和欧元等。

web3.eth简介

web3.eth 对象

web3.ethweb3.js 库中用于以太坊区块链交互的主要对象,它提供了一系列的方法来获取区块链数据,发送交易,操作智能合约等。

PoW、PoS、DPoS和PBFT简介

1. 概览

PoW(工作量证明)、PoS(权益证明)、DPoS(委托权益证明)和PBFT(拜占庭容错)是区块链和分布式系统领域中常见的共识算法。下面将详细介绍这些共识算法的原理和特点:

Merkle Tree 简介

Merkle 树(Merkle Tree)是一种树状数据结构,通常用于验证大规模数据集的完整性和一致性。它的名字来源于其发明者 Ralph Merkle。Merkle 树在密码学、分布式系统和区块链等领域得到广泛应用,尤其在区块链中,它用于验证交易和区块的完整性,确保数据不被篡改。

Bitcoin 挖矿难度

挖矿难度

$$H(version,target,nonce,Hash_{pre},MerkleTreeRoot) <= target$$

Bitcoin的实现

比特币系统是一个基于交易的账本,这意味着存储在账本中的是一笔笔交易。那么在用户进行转账交易时,首先就需要确保用户所持有的数量要大于或等于将要交易的。这要做的目的是为了避免双花问题。

Bitcoin 网络

比特币工作在应用层,它的底层是一个P2P网络。比特币的P2P网络是非常简单的,所有节点都是对等的,不会出现某些P2P网络中所谓的超级节点或者中心节点。

Bitcoin中的数据结构

哈希指针(Hash Pointers)

对于一个结构体而言,指向它的指针存储的是它在内存中的首地址;而指向它的哈希指针,不仅保存这它的首地址,还保存着该结构体内容的哈希值。通过哈希指针,不仅可以找到该结构体,还能查验该结构内容是否被篡改过。

Bitcoin引发的思考

Hash指针

指针保存的是本地内存地址,只在本地计算机上才有意义,发送到其它计算机上就没有意义了。所谓的Hash指针只是一种形象的说法,实际系统中用到的时候只有Hash,没有指针。

Bitcoin 分叉

区块链由一条变为两条或者多条,这一过程被称为分叉。导致分叉的原因有很多,按分叉出现的原因可分为两种:

Bitcoin中的协议

双花问题

在比特币系统中,Hash指针有两个用途:指向前一个区块和指向某笔交易。

Bitcoin的匿名性

一般来说,匿名通常跟隐私保护联系在一起。在比特币是基于交易的区块链,系统中没有用户的概念,不要求用户使用真名,可以用公钥产生地址,所以比特币具有一定的匿名性。