Taproot升级
什么是Taproot升级 比特币每隔段时间就会更新一次(网络软分叉),主要通过比特币改进提案(BIPs)的形式为比特币引入新功能。 与以往不同,本次的Taproot升级,并非是比特币网络某种单一功能的提升,而是用三个在技术上的结合为网络升级,它包含了三个改进提案(BIP340、BIP341和BIP342)。 Greg Maxwell在 2018 年首次提出升级改进。 此后,Pieter Wuille、Tim Ruffing、AJ Townes 和 Jonas Nick 对编入 Taproot 的三个比特币改进提案 (BIP) 进行了编写,并于 2020 年 10 月合并到 Bitcoin Core。 Taproot升级,旨在提高比特币网络的交易隐私以及效率。 提案的内容 BIP340 增加了Schnorr 多重签名的方式,也兼容以往的椭圆曲线数字签名。 BIP341 结合了聚合签名的特点,提出了名为「Pay-to-Taproot」(P2TR)这样一个新的网络支付方式,采用了MAST(默克尔树)的数据结构。 BIP342 则是对比特币网络的脚本语言进行了改进,它增加了Tapscri...
Taproot升级
什么是Taproot升级 比特币每隔段时间就会更新一次(网络软分叉),主要通过比特币改进提案(BIPs)的形式为比特币引入新功能。 与以往不同,本次的Taproot升级,并非是比特币网络某种单一功能的提升,而是用三个在技术上的结合为网络升级,它包含了三个改进提案(BIP340、BIP341和BIP342)。 Greg Maxwell在 2018 年首次提出升级改进。 此后,Pieter Wuille、Tim Ruffing、AJ Townes 和 Jonas Nick 对编入 Taproot 的三个比特币改进提案 (BIP) 进行了编写,并于 2020 年 10 月合并到 Bitcoin Core。 Taproot升级,旨在提高比特币网络的交易隐私以及效率。 提案的内容 BIP340 增加了Schnorr 多重签名的方式,也兼容以往的椭圆曲线数字签名。 BIP341 结合了聚合签名的特点,提出了名为「Pay-to-Taproot」(P2TR)这样一个新的网络支付方式,采用了MAST(默克尔树)的数据结构。 BIP342 则是对比特币网络的脚本语言进行了改进,它增加了Tapscri...
Solidity理论
一、重构通用逻辑不管谁调用我们的 attack 函数 —— 我们想确保用户的确拥有他们用来攻击的僵尸。如果你能用其他人的僵尸来攻击将是一个很大的安全问题。 你能想一下我们如何添加一个检查步骤来看看调用这个函数的人就是他们传入的 _zombieId 的拥有者么? 想一想,看看你能不能自己找到一些答案。 花点时间…… 参考我们前面课程的代码来获得灵感。答案我们在前面的课程里面已经做过很多次这样的检查了。 在 changeName(), changeDna(), 和 feedAndMultiply()里,我们做过这样的检查:require(msg.sender == zombieToOwner[_zombieId]); 这和我们 attack 函数将要用到的检查逻辑是相同的。 正因我们要多次调用这个检查逻辑,让我们把它移到它自己的 modifier 中来清理代码并避免重复编码。实战演练我们回到了 zombiefeeding.sol, 因为这是我们第一次调用检查逻辑的地方。让我们把它重构进它自己的 modifier。1、创建一个 modifier, 命名为 ownerOf。它将传入一个参...
Solidity理论
一、重构通用逻辑不管谁调用我们的 attack 函数 —— 我们想确保用户的确拥有他们用来攻击的僵尸。如果你能用其他人的僵尸来攻击将是一个很大的安全问题。 你能想一下我们如何添加一个检查步骤来看看调用这个函数的人就是他们传入的 _zombieId 的拥有者么? 想一想,看看你能不能自己找到一些答案。 花点时间…… 参考我们前面课程的代码来获得灵感。答案我们在前面的课程里面已经做过很多次这样的检查了。 在 changeName(), changeDna(), 和 feedAndMultiply()里,我们做过这样的检查:require(msg.sender == zombieToOwner[_zombieId]); 这和我们 attack 函数将要用到的检查逻辑是相同的。 正因我们要多次调用这个检查逻辑,让我们把它移到它自己的 modifier 中来清理代码并避免重复编码。实战演练我们回到了 zombiefeeding.sol, 因为这是我们第一次调用检查逻辑的地方。让我们把它重构进它自己的 modifier。1、创建一个 modifier, 命名为 ownerOf。它将传入一个参...
ERC721标准
一、代币代币让我们来聊聊以太坊上的代币。 如果你对以太坊的世界有一些了解,你很可能听过人们聊到代币——尤其是 ERC20 代币。 一个 代币 在以太坊基本上就是一个遵循一些共同规则的智能合约——即它实现了所有其他代币合约共享的一组标准函数,例如 transfer(address _to, uint256 _value) 和 balanceOf(address _owner). 在智能合约内部,通常有一个映射, mapping(address => uint256) balances,用于追踪每个地址还有多少余额。 所以基本上一个代币只是一个追踪谁拥有多少该代币的合约,和一些可以让那些用户将他们的代币转移到其他地址的函数。它为什么重要呢?由于所有 ERC20 代币共享具有相同名称的同一组函数,它们都可以以相同的方式进行交互。 这意味着如果你构建的应用程序能够与一个 ERC20 代币进行交互,那么它就也能够与任何 ERC20 代币进行交互。 这样一来,将来你就可以轻松地将更多的代币添加到你的应用中,而无需进行自定义编码。 你可以简单地插入新的代币合约地址,然后哗啦,你的应用程序有另一...
ERC721标准
一、代币代币让我们来聊聊以太坊上的代币。 如果你对以太坊的世界有一些了解,你很可能听过人们聊到代币——尤其是 ERC20 代币。 一个 代币 在以太坊基本上就是一个遵循一些共同规则的智能合约——即它实现了所有其他代币合约共享的一组标准函数,例如 transfer(address _to, uint256 _value) 和 balanceOf(address _owner). 在智能合约内部,通常有一个映射, mapping(address => uint256) balances,用于追踪每个地址还有多少余额。 所以基本上一个代币只是一个追踪谁拥有多少该代币的合约,和一些可以让那些用户将他们的代币转移到其他地址的函数。它为什么重要呢?由于所有 ERC20 代币共享具有相同名称的同一组函数,它们都可以以相同的方式进行交互。 这意味着如果你构建的应用程序能够与一个 ERC20 代币进行交互,那么它就也能够与任何 ERC20 代币进行交互。 这样一来,将来你就可以轻松地将更多的代币添加到你的应用中,而无需进行自定义编码。 你可以简单地插入新的代币合约地址,然后哗啦,你的应用程序有另一...

Web3.js学习
一、发送事务这下我们的界面能检测用户的 MetaMask 账户,并自动在首页显示它们的僵尸大军了,有没有很棒? 现在我们来看看用 send 函数来修改我们智能合约里面的数据。 相对 call 函数,send 函数有如下主要区别:1、send 一个事务需要一个 from 地址来表明谁在调用这个函数(也就是你 Solidity 代码里的 msg.sender )。 我们需要这是我们 DApp 的用户,这样一来 MetaMask 才会弹出提示让他们对事务签名。2、send 一个事务将花费 gas3、在用户 send 一个事务到该事务对区块链产生实际影响之间有一个不可忽略的延迟。这是因为我们必须等待事务被包含进一个区块里,以太坊上一个区块的时间平均下来是15秒左右。如果当前在以太坊上有大量挂起事务或者用户发送了过低的 gas 价格,我们的事务可能需要等待数个区块才能被包含进去,往往可能花费数分钟。所以在我们的代码中我们需要编写逻辑来处理这部分异步特性。生成一个僵尸我们来看一个合约中一个新用户将要调用的第一个函数: createRandomZombie. 作为复习,这里是合约中的 Soli...

Web3.js学习
一、发送事务这下我们的界面能检测用户的 MetaMask 账户,并自动在首页显示它们的僵尸大军了,有没有很棒? 现在我们来看看用 send 函数来修改我们智能合约里面的数据。 相对 call 函数,send 函数有如下主要区别:1、send 一个事务需要一个 from 地址来表明谁在调用这个函数(也就是你 Solidity 代码里的 msg.sender )。 我们需要这是我们 DApp 的用户,这样一来 MetaMask 才会弹出提示让他们对事务签名。2、send 一个事务将花费 gas3、在用户 send 一个事务到该事务对区块链产生实际影响之间有一个不可忽略的延迟。这是因为我们必须等待事务被包含进一个区块里,以太坊上一个区块的时间平均下来是15秒左右。如果当前在以太坊上有大量挂起事务或者用户发送了过低的 gas 价格,我们的事务可能需要等待数个区块才能被包含进去,往往可能花费数分钟。所以在我们的代码中我们需要编写逻辑来处理这部分异步特性。生成一个僵尸我们来看一个合约中一个新用户将要调用的第一个函数: createRandomZombie. 作为复习,这里是合约中的 Soli...
以太坊Solidity编程语言开发框架
Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下: 内置的智能合约编译,链接,部署和二进制文件的管理。 快速开发下的自动合约测试。 脚本化的,可扩展的部署与发布框架。 部署到不管多少的公网或私网的网络环境管理功能 使用EthPM&NPM提供的包管理,使用ERC190标准。 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。 可配的构建流程,支持紧密集成。 在Truffle环境里支持执行外部的脚本。 Truffle是最流行的开发框架,使命是让开发更容易 安装方式: $ npm install -g truffle 环境要求 NodeJS 5.0+ Windows,Linux,或Mac OS X Truffle需要以太坊客户端,需要支持标准的JSON RPC API。Truffle客户端 原文地址:http://truffleframework.com/docs/getting_started/client有许多的以太坊客户端可以选择。我们推荐在开发和部署时使用不同客户端。 适用开发的客户端 Et...
以太坊Solidity编程语言开发框架
Truffle是一个世界级的开发环境,测试框架,以太坊的资源管理通道,致力于让以太坊上的开发变得简单,Truffle有以下: 内置的智能合约编译,链接,部署和二进制文件的管理。 快速开发下的自动合约测试。 脚本化的,可扩展的部署与发布框架。 部署到不管多少的公网或私网的网络环境管理功能 使用EthPM&NPM提供的包管理,使用ERC190标准。 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。 可配的构建流程,支持紧密集成。 在Truffle环境里支持执行外部的脚本。 Truffle是最流行的开发框架,使命是让开发更容易 安装方式: $ npm install -g truffle 环境要求 NodeJS 5.0+ Windows,Linux,或Mac OS X Truffle需要以太坊客户端,需要支持标准的JSON RPC API。Truffle客户端 原文地址:http://truffleframework.com/docs/getting_started/client有许多的以太坊客户端可以选择。我们推荐在开发和部署时使用不同客户端。 适用开发的客户端 Et...