
零知识证明:从入门到入土
文章共8000字,预计阅读时间30-35分钟。这篇博客的灵感来源于我的好朋友Kokii(Joey),感谢他通俗、详尽且充满趣味的介绍! 在谈论「零知识证明」之前,首先需要明确其定义:证明者(Prover)向验证者(Verifier)证明一个命题成立,同时「不泄露其他任何知识」,这种就被称为「零知识证明」。鉴于「零知识证明」这个词太长,简称「zk」。文章是个人对于zk的理解,欢迎讨论。为什么要zk隐私一个用户如果用过加密货币,就会发现,它并不像传说中的那么「保密」。「不保密」的原因显然,加密货币的信息都在区块链上,任何人都查询的到。虽然比特币等一部分加密货币出于隐私考虑,会给用户分配一个随机的地址,但这更像是「假名」,而不是号称的「匿名」,一旦用户到交易所将加密货币换成了法币,「假名」就和现实中的人对应上了。「假名」就像「风清扬」,初看无意义,但如果某次偶然,你发现「风清扬」对应着马云,之后再看到署名「风清扬」的邮件你就能想到那张大脸。「匿名」像大专院校的「校园墙」,墙上所有消息都是不署名的,对隐私的保护也更强。如果我们需要证明自己在「校园墙」上发过消息,但不想透露发的是什么消息,...

开发智能合约的极简主义配置:vscode+remix+github
⌈工欲善其事,必先利其器⌋,本文将介绍一套极简的智能合约开发配置,只需要vscode、remix和github就能够进行以太坊合约的开发、部署、测试和代码保存,欢迎交流。vscode编辑器下载智能合约开发主要使用solidity语言,本文选用插件丰富的vscode作为编辑器,点击下载vscode。选择合适的下载版本安装插件vscode下载安装后,点击左侧扩展,在上方依次搜索并安装⌈Chinese(Simplified)⌋、⌈Ethereum Remix⌋和⌈solidity⌋三个插件,之后重启vscode。vscode安装插件指定workspace新建一个文件夹作为workspace,vscode重启如下所示,依次⌈打开文件夹⌋-⌈选择新建的文件夹⌋-⌈新建文件⌋-⌈命名XXX.sol⌋,之后就可以正常编写sol文件,⌈solidity⌋插件会提供语法高亮等支持。新建workspace和.sol文件remix合约编写完成后需要remix进行编译、部署和测试。开启本地remix⌈Ethereum Remix⌋-⌈Start remixed client⌋-⌈Start⌋开启本地连接...

纳瓦尔宝典是不是成功学?
我们生活在一个成功学遍地开花的时代,形形色色的人在向我们兜售着成功的秘诀,但其中的大部分人都是靠教人如何成功来攫取财富的,而他们在书中刻意忽略了这一点,这才是他们「成功」的真正秘诀。那么《纳瓦尔宝典》是一本成功学书籍吗?有人认为是,有人认为不是,在这里个人更愿意把它称为「职业生涯指北」。 纳瓦尔宝典中最有价值的部分应该是职业发展,他将职业发展分成三个阶段。第一阶段:以领取月薪的打工者为起点,志存高远;第二阶段:积累杠杆,包括资本杠杆(能够低成本获取资金的人脉等)、劳动力杠杆(熟悉外包)、技术杠杆(代码等零边际成本产品)和影响力杠杆(编织的社群网络);第三阶段:承担责任,提升判断力,充分利用杠杆。 这解释了很多问题,例如有的朋友厌恶重复劳动,选择开一家精品咖啡店,这在纳瓦尔看来就不是一个好生意,因为它并没有利用杠杆。第一没有资本杠杆,因为咖啡店的初始投资一般是来源于创始人的个人积蓄;第二没有劳动力杠杆,很少有咖啡店在一开始就选择雇人,主要是店主提供服务,是自我雇佣;第三没有技术杠杆,这并不是说手冲咖啡没有技术,而是说技术不能够零成本复制,如果咖啡店需要扩张,那么技术将会成为瓶颈;第...
人一生中90%是废话,这里是另外的10% https://linktr.ee/choovybi



零知识证明:从入门到入土
文章共8000字,预计阅读时间30-35分钟。这篇博客的灵感来源于我的好朋友Kokii(Joey),感谢他通俗、详尽且充满趣味的介绍! 在谈论「零知识证明」之前,首先需要明确其定义:证明者(Prover)向验证者(Verifier)证明一个命题成立,同时「不泄露其他任何知识」,这种就被称为「零知识证明」。鉴于「零知识证明」这个词太长,简称「zk」。文章是个人对于zk的理解,欢迎讨论。为什么要zk隐私一个用户如果用过加密货币,就会发现,它并不像传说中的那么「保密」。「不保密」的原因显然,加密货币的信息都在区块链上,任何人都查询的到。虽然比特币等一部分加密货币出于隐私考虑,会给用户分配一个随机的地址,但这更像是「假名」,而不是号称的「匿名」,一旦用户到交易所将加密货币换成了法币,「假名」就和现实中的人对应上了。「假名」就像「风清扬」,初看无意义,但如果某次偶然,你发现「风清扬」对应着马云,之后再看到署名「风清扬」的邮件你就能想到那张大脸。「匿名」像大专院校的「校园墙」,墙上所有消息都是不署名的,对隐私的保护也更强。如果我们需要证明自己在「校园墙」上发过消息,但不想透露发的是什么消息,...

开发智能合约的极简主义配置:vscode+remix+github
⌈工欲善其事,必先利其器⌋,本文将介绍一套极简的智能合约开发配置,只需要vscode、remix和github就能够进行以太坊合约的开发、部署、测试和代码保存,欢迎交流。vscode编辑器下载智能合约开发主要使用solidity语言,本文选用插件丰富的vscode作为编辑器,点击下载vscode。选择合适的下载版本安装插件vscode下载安装后,点击左侧扩展,在上方依次搜索并安装⌈Chinese(Simplified)⌋、⌈Ethereum Remix⌋和⌈solidity⌋三个插件,之后重启vscode。vscode安装插件指定workspace新建一个文件夹作为workspace,vscode重启如下所示,依次⌈打开文件夹⌋-⌈选择新建的文件夹⌋-⌈新建文件⌋-⌈命名XXX.sol⌋,之后就可以正常编写sol文件,⌈solidity⌋插件会提供语法高亮等支持。新建workspace和.sol文件remix合约编写完成后需要remix进行编译、部署和测试。开启本地remix⌈Ethereum Remix⌋-⌈Start remixed client⌋-⌈Start⌋开启本地连接...

纳瓦尔宝典是不是成功学?
我们生活在一个成功学遍地开花的时代,形形色色的人在向我们兜售着成功的秘诀,但其中的大部分人都是靠教人如何成功来攫取财富的,而他们在书中刻意忽略了这一点,这才是他们「成功」的真正秘诀。那么《纳瓦尔宝典》是一本成功学书籍吗?有人认为是,有人认为不是,在这里个人更愿意把它称为「职业生涯指北」。 纳瓦尔宝典中最有价值的部分应该是职业发展,他将职业发展分成三个阶段。第一阶段:以领取月薪的打工者为起点,志存高远;第二阶段:积累杠杆,包括资本杠杆(能够低成本获取资金的人脉等)、劳动力杠杆(熟悉外包)、技术杠杆(代码等零边际成本产品)和影响力杠杆(编织的社群网络);第三阶段:承担责任,提升判断力,充分利用杠杆。 这解释了很多问题,例如有的朋友厌恶重复劳动,选择开一家精品咖啡店,这在纳瓦尔看来就不是一个好生意,因为它并没有利用杠杆。第一没有资本杠杆,因为咖啡店的初始投资一般是来源于创始人的个人积蓄;第二没有劳动力杠杆,很少有咖啡店在一开始就选择雇人,主要是店主提供服务,是自我雇佣;第三没有技术杠杆,这并不是说手冲咖啡没有技术,而是说技术不能够零成本复制,如果咖啡店需要扩张,那么技术将会成为瓶颈;第...
人一生中90%是废话,这里是另外的10% https://linktr.ee/choovybi

Subscribe to choovybi

Subscribe to choovybi
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
文章共2000字,预计阅读时间10分钟。
Web3是个令人眼花缭乱的地方,里面充斥着新颖的词汇:币、代币、NFT、跨链桥、Defi、Cefi,这些都让入门者感到非常困惑。
新手可能花好几天时间,看了好几个项目的白皮书,最终都不明白什么是代币,什么是NFT。有人好不容易清楚了代币的含义,依然会疑惑,以太坊不是已经有了主币ETH,为什么还有个代币wETH?
本文试图从代码角度帮助弄清以太坊上的各种代币,他们有什么功能,以及通常是如何实现这些功能的,欢迎交流。
「ERC」全称「Ethereum Request for Comment」,中文名为「以太坊意见征求稿」,目前经常使用的有ERC-20和ERC-721两个标准,前者用于发行同质化代币,后者用于发行非同质化代币(即NFT,non-fungible token)。
满足标准的合约所记录的数据就被称为代币,代币和NFT只是被记录在合约中的数据,铸造、转账、销毁操作也只是在合约中修改记录的数值。
ERC标准规定了合约的接口,其他应用(例如OpenSea)可以通过合约的接口来操作代币。
容易误解的是,ERC标准仅仅规定了合约的接口格式,至于合约具体怎样实现这些接口,ERC标准是不做规定的,所以能有各式各样的NFT。
ERC-20标准规定了以下6个函数和2个事件
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
6个函数的含义分别是
totalSupply():获取代币的总发行量
balanceOf(address account):获取account地址代币的余额
transfer(address to, uint256 amount):函数的调用者直接向to地址发送amount数量代币
allowance(address owner, address spender):获取owner向spender地址批准了多少消费额度
approve(address spender, uint256 amount):函数的调用者向spender地址批准amount数量消费额度
transferFrom(address from, address to, uint256 amount):函数的调用者使用from地址给的消费额度向to地址发送amount数量代币
2个事件的含义分别是
Transfer:转账时发出,记录from地址向to地址发送了amount数量代币
Approval:批准消费额度时发出,记录owner地址向spender地址批准了value消费额度
其中approve、transferFrom和allowance可能比较难理解,一个简单的例子就是父母给零花钱,花钱的虽然是子女,但钱是从父母钱包里面扣除的。
如果合约实现了以上6个函数和2个事件,我们就可以说满足ERC-20标准。通常项目方还会在合约中添加mint函数和burn函数,用来增发代币和销毁代币,这里是ERC-20合约的一种实现方式。
满足ERC-20标准的合约所铸造出来的代币,就可以上线uniswap等去中心化交易所,用来交换别的虚拟货币了。因为去中心化交易所需要调用transferFrom 方法,而以太坊的主币ETH并没有这个接口,所以查看ETH在uniswap中具体的交易情况,能发现ETH总是先被存入wETH合约转换成同等数量的wETH代币,之后uniswap再调用transferFrom 进行各种代币间的交换。
ERC-721标准规定了以下10个函数和3个事件
interface IERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
interface IERC721 is IERC165 {
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId)
external
view
returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
}
ERC-721标准是继承了ERC-165标准的,其中ERC-165标准规定了函数supportsInterface(bytes4 interfaceID) 用于发布并检测合约实现了什么接口。
ERC-165标准使得外部可以查询合约是否支持接口,如果支持,查询接口的版本,以便用户可以调整与合约交互的方式。
剩下9个函数的含义分别是
balanceOf(address owner):获取owner地址代币的余额
ownerOf(uint256 tokenId):获取tokenId号代币的owner地址
safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) :安全地将tokenId号代币从from地址发送到to地址并附加data信息(data信息在token发送到合约账户时会用到,可以用data来操作接收的合约,安全发送指的是合约会检查to地址是不是合法的token接收者)
safeTransferFrom(address from, address to, uint256 tokenId):同上,data信息为空
transferFrom(address from, address to, uint256 tokenId):将tokenId号代币从from地址发送到to地址,一般用于发送给他人账户,如果to地址是合约账户则可能出错
approve(address to, uint256 tokenId):函数调用者将tokenId号代币批准给
3个事件的含义分别是
Transfer:转账时发出,记录from地址向to地址发送了tokenId 号代币
Approval:批准时发出,记录owner地址向approved批准了tokenId号代币
ApprovalForAll: 管理第三方权限时发出,记录owner地址将第三方operator地址的管理权限设置为approved
由于合约中含有tokenId ,所以每个代币都是不尽相同的,这正是「非同质化」的含义。ERC-721和ERC-20在设计思路上没有太大差别,只不过由于ERC-721的代币是非同质化的,所以既可以通过tokenId 进行单个批准,也可以将owner地址的代币全部进行批准,而ERC-20只能批准固定数量。
在实际使用中,不一定需要把九个函数全部实现,这里是ERC-721合约的一种实现方式。
知道了ERC-20和ERC-721有什么用呢?
知道了标准,我们就可以通过ERC标准提供的接口直接操作各类代币和NFT,例如,无聊猿是NFT,那么他的合约肯定也符合ERC-721标准。
可以通过以太坊浏览器,直接调用ownerOf接口查看2022号无聊猿的拥有者(当然使用代码调用接口也可以,只是以太坊浏览器比较直观)

我们再在最大的NFT交易市场OpenSea上查看一下2022号无聊猿,发现其拥有者确实是这个B44618开头的账户

事实上,OpenSea这类应用,正是通过调用ERC标准提供的各种接口来实现交易的,当我们完全了解ERC标准之后,完全可以自己编写应用来进行代币的交易。
今天就到这里,再见。
参考文章
https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
https://ethereum.org/zh/developers/docs/standards/tokens/erc-721/
文章共2000字,预计阅读时间10分钟。
Web3是个令人眼花缭乱的地方,里面充斥着新颖的词汇:币、代币、NFT、跨链桥、Defi、Cefi,这些都让入门者感到非常困惑。
新手可能花好几天时间,看了好几个项目的白皮书,最终都不明白什么是代币,什么是NFT。有人好不容易清楚了代币的含义,依然会疑惑,以太坊不是已经有了主币ETH,为什么还有个代币wETH?
本文试图从代码角度帮助弄清以太坊上的各种代币,他们有什么功能,以及通常是如何实现这些功能的,欢迎交流。
「ERC」全称「Ethereum Request for Comment」,中文名为「以太坊意见征求稿」,目前经常使用的有ERC-20和ERC-721两个标准,前者用于发行同质化代币,后者用于发行非同质化代币(即NFT,non-fungible token)。
满足标准的合约所记录的数据就被称为代币,代币和NFT只是被记录在合约中的数据,铸造、转账、销毁操作也只是在合约中修改记录的数值。
ERC标准规定了合约的接口,其他应用(例如OpenSea)可以通过合约的接口来操作代币。
容易误解的是,ERC标准仅仅规定了合约的接口格式,至于合约具体怎样实现这些接口,ERC标准是不做规定的,所以能有各式各样的NFT。
ERC-20标准规定了以下6个函数和2个事件
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
6个函数的含义分别是
totalSupply():获取代币的总发行量
balanceOf(address account):获取account地址代币的余额
transfer(address to, uint256 amount):函数的调用者直接向to地址发送amount数量代币
allowance(address owner, address spender):获取owner向spender地址批准了多少消费额度
approve(address spender, uint256 amount):函数的调用者向spender地址批准amount数量消费额度
transferFrom(address from, address to, uint256 amount):函数的调用者使用from地址给的消费额度向to地址发送amount数量代币
2个事件的含义分别是
Transfer:转账时发出,记录from地址向to地址发送了amount数量代币
Approval:批准消费额度时发出,记录owner地址向spender地址批准了value消费额度
其中approve、transferFrom和allowance可能比较难理解,一个简单的例子就是父母给零花钱,花钱的虽然是子女,但钱是从父母钱包里面扣除的。
如果合约实现了以上6个函数和2个事件,我们就可以说满足ERC-20标准。通常项目方还会在合约中添加mint函数和burn函数,用来增发代币和销毁代币,这里是ERC-20合约的一种实现方式。
满足ERC-20标准的合约所铸造出来的代币,就可以上线uniswap等去中心化交易所,用来交换别的虚拟货币了。因为去中心化交易所需要调用transferFrom 方法,而以太坊的主币ETH并没有这个接口,所以查看ETH在uniswap中具体的交易情况,能发现ETH总是先被存入wETH合约转换成同等数量的wETH代币,之后uniswap再调用transferFrom 进行各种代币间的交换。
ERC-721标准规定了以下10个函数和3个事件
interface IERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
interface IERC721 is IERC165 {
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId)
external
view
returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
}
ERC-721标准是继承了ERC-165标准的,其中ERC-165标准规定了函数supportsInterface(bytes4 interfaceID) 用于发布并检测合约实现了什么接口。
ERC-165标准使得外部可以查询合约是否支持接口,如果支持,查询接口的版本,以便用户可以调整与合约交互的方式。
剩下9个函数的含义分别是
balanceOf(address owner):获取owner地址代币的余额
ownerOf(uint256 tokenId):获取tokenId号代币的owner地址
safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) :安全地将tokenId号代币从from地址发送到to地址并附加data信息(data信息在token发送到合约账户时会用到,可以用data来操作接收的合约,安全发送指的是合约会检查to地址是不是合法的token接收者)
safeTransferFrom(address from, address to, uint256 tokenId):同上,data信息为空
transferFrom(address from, address to, uint256 tokenId):将tokenId号代币从from地址发送到to地址,一般用于发送给他人账户,如果to地址是合约账户则可能出错
approve(address to, uint256 tokenId):函数调用者将tokenId号代币批准给
3个事件的含义分别是
Transfer:转账时发出,记录from地址向to地址发送了tokenId 号代币
Approval:批准时发出,记录owner地址向approved批准了tokenId号代币
ApprovalForAll: 管理第三方权限时发出,记录owner地址将第三方operator地址的管理权限设置为approved
由于合约中含有tokenId ,所以每个代币都是不尽相同的,这正是「非同质化」的含义。ERC-721和ERC-20在设计思路上没有太大差别,只不过由于ERC-721的代币是非同质化的,所以既可以通过tokenId 进行单个批准,也可以将owner地址的代币全部进行批准,而ERC-20只能批准固定数量。
在实际使用中,不一定需要把九个函数全部实现,这里是ERC-721合约的一种实现方式。
知道了ERC-20和ERC-721有什么用呢?
知道了标准,我们就可以通过ERC标准提供的接口直接操作各类代币和NFT,例如,无聊猿是NFT,那么他的合约肯定也符合ERC-721标准。
可以通过以太坊浏览器,直接调用ownerOf接口查看2022号无聊猿的拥有者(当然使用代码调用接口也可以,只是以太坊浏览器比较直观)

我们再在最大的NFT交易市场OpenSea上查看一下2022号无聊猿,发现其拥有者确实是这个B44618开头的账户

事实上,OpenSea这类应用,正是通过调用ERC标准提供的各种接口来实现交易的,当我们完全了解ERC标准之后,完全可以自己编写应用来进行代币的交易。
今天就到这里,再见。
参考文章
https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
https://ethereum.org/zh/developers/docs/standards/tokens/erc-721/
getApproved(uint256 tokenId):获取tokenId号代币被批准给了哪个地址
setApprovalForAll(address operator, bool _approved):函数调用者管理第三方operator地址的权限,_approved表示是否给第三方批准
isApprovedForAll(address owner, address operator):获取owner地址是否批准第三方operator地址操作自己所有的代币
getApproved(uint256 tokenId):获取tokenId号代币被批准给了哪个地址
setApprovalForAll(address operator, bool _approved):函数调用者管理第三方operator地址的权限,_approved表示是否给第三方批准
isApprovedForAll(address owner, address operator):获取owner地址是否批准第三方operator地址操作自己所有的代币
No activity yet