我在币安智能链的日子-区块链基础

分享
我在币安智能链的日子-区块链基础

区块和链

无论是比特币还是以太坊,都是具有一个个区块(称之为Block)的链式结构,学过<数据结构>的肯定明白链表,区块链就像一个链表,每个区块都存储上一个区块哈希。
链(称之为Chain),有非常多的链,他们的协议不同,技术也不尽相同,比特币网络是一个链,以太坊网络是另一个链,每个链都有自己的目标(甚至目标只是为了圈钱),每个链也都有自己的代币,比特币网络的代币是比特币,每次交易都需要比特币作为手续费,以太坊网络代币是以太币,每次在以太坊网络的交易都需要以太币作为手续费。所以,链实际上作为基础设施,非常多的团队喜欢创建新的,但是一个链光有网络光有代币不行,没有生态,很难成功。

币安智能链(Binance Smart Chain:BSC)

我的主要操作都是在BSC上,没有其它原因,只因为一个字。在BTC网络交易,需要BTC用作手续费,这个我可用不起,在以太坊(Ethereum)网络交易,需要以太币(ETH)作为用作手续费,按照以太币目前(2022-01-01)的价格,单次交易大概要40刀左右(取决于具体操作),因此称为富人链,而BSC网络的代币币安币(BNB)价格要便宜很多,目前单次交易手续费在3刀(取决于具体操作)左右。因此,我实际上没有频繁在BTC与以太坊网络交易,实际经验来自于BSC。

前面说过,每个Chain的技术不尽相同,BSC是从以太坊拓展而来,它兼容以太坊虚拟机(EVM),因此完全兼容以太坊,甚至同一个钱包地址在以太坊与BSC完全一致,你拥有的BSC钱包即是你的以太坊钱包,以太坊钱包地址也可以是你的BSC钱包地址。BSC采用共识机制来降低交易费用和提升交易速度,这个咱不用管,重点是完全兼容以太坊,这有个很大的好处是可以吃一部分以太坊的生态,以前那些在以太坊圈钱的项目现在可以轻松跨链到BSC继续圈一波钱,本来圈不到以太坊大佬钱的项目现在可以上BSC圈一波韭菜的钱,BSC手续费低准入门槛就低,我这种韭菜就喜欢这种链,另外一个好处就是支持智能合约,以太坊的(EVM)能够执行图灵完备的智能合约代码,BSC当然也能。

智能合约(Smart Contract)

智能合约是以太坊的一项重大创新,它允许开发人员自己编写合约并部署到网络上,由以太坊虚拟机EVM来执行,合约代码是图灵完备的并且它一旦部署就不允许修改,且只能被动的被调用不可以主动,它也像个人账户一样可以存储各种代币的余额。

同质化代币与非同质化代币(NFT)

ERC20协议 同质化代币

简单来说如果你想在以太坊或BSC上发行新的代币(称为Token),必须通过部署合约来操作,部署一个合约,合约指定了发行代币的数量,同时也存储每个地址所持有代币的数量,代币的转移,从一个账户到另一个账户的转移(交易),都需要的调用代币对应的合约来执行,合约内部将某个地址持有的代币数量转移到另一个地址。
这套标准的东西既是ERC20,实现ERC20标准的合约必须具有某些特定的方法(例如必须实现代币转移的方法transferFrom等)。因为每个代币都是完全相等可等同置换的,因此是同质化代币。

ERC721协议 非同质化代币(NFT)

与ERC720一样,它也是一套标准,实现ERC721协议的合约必须实现某些方法,唯一的区别在于,它的每个代币都有独一无二的ID,例如你要发行一个鞋子NFT,每双鞋都是不一样的,不可以等同置换,鞋子也是代币,但是每双鞋子都是一个独一无二的NFT,因此它是非同质化代币。ERC721的代币转移需要指定代币的具体ID进行转移。

我发行的新代币有价值吗?

因为有ERC20协议的存在,它制定了一套标准,因此可以根据这个标准制定出一套合约模板,你只需要填写代币名称,填写发行数量,就可以发行任意数量的新代币,任何人都可以部署智能合约,因此任何人都可以发行新的代币,但是新的代币是没有价值的,价值是人的共识,股票为什么有价值?因为股票背后是公司,有实体,如果代币发行的团队或个人没有价值,那么这个代币不会有价值。

阅读更多

以太坊黑暗森林-抢跑(front running)

以太坊黑暗森林-抢跑(front running)

前言 鸽了很久之后的今天突然心血来潮,准备写一个系列:以太坊黑暗森林,它介绍以太坊生态上的各种奇思妙想和逆天的攻击方式,会从简单的、常见的攻击方式开始介绍。取这个名字是因为我接触以太坊不久后看的一篇文章 Ethereum is a Dark Forest ,让我想起了《三体》小说中刘慈欣描述的黑暗森林,以太坊是一个弱肉强食的、没有规则的世界,猎人们总是躲在背后监听所有的交易,一旦发现猎物,它们会把它的血给吸干。 开盘抢币 相信进入以太坊生态的韭菜们,一定有过在 uniswap 上买刚开盘新币的经历,新开盘的币,一般会上涨几倍甚至十几倍,越早买入则越能低价买入。你守着时间,等着项目方添加流动性后第一时间买入代币,但是你发现,无论你的手速多块,总是看到一开盘,价格已经飚了几倍,你骂骂咧咧,开始不断拉高 gas 费用,尝试继续买入,但是你眼睁睁的看着代币涨到十倍,自己的交易却一直失败,你开始怀疑项目方自己抢跑,怀疑项目方捣鬼:肯定是项目方吃相难看,用老鼠仓提前买了。另一些聪明人,研究了以太坊的基本技术,他们在 ethscan

By FatTiger
C#:IDisposable 和 析构函数

C#:IDisposable 和 析构函数

C# 中有两种释放资源的方式:实现 IDisposable 或使用析构函数。通常,必须在特定时间释放资源的场景中,我们实现 IDisposable,像这样: public class ExampleDispose : IDisposable { // 非托管资源 private IntPtr _handle; // 使用的其它托管资源 private readonly Stream _stream; private bool disposed = false; public ExampleDispose(Stream stream, IntPtr handle) { this._stream = stream; this._handle = handle; } public void Dispose() { if (disposed) { return; } disposed = t

By FatTiger
ThreadLocal引发的灾难

ThreadLocal引发的灾难

在 Java 里有个称之为线程本地变量的类型叫做 ThreadLocal,它与 ThreadLocal 之于 C# 中是一样的作用,可以在线程范围内设置变量,这个变量只会在当前线程可被访问,但是它们有一点不同的是,在 Java 中,当你设置好变量后,在线程使用完毕回到线程池之前,需要手动调用 ThreadLocal.remove() 方法去清除线程本地变量,否则变量随着线程回到线程池,并且在下次使用此线程时此变量继续存在,而在 C# 中,线程回到线程池时会自动清除本地变量,因此无需手动去清除。 我们的业务有这样一个场景:某个业务 UserService 类中,具有多个方法会频繁(甚至循环)调用一个获取用户标签的接口,具体原因是因为某些方法会进行递归,数据结构有个树状结构,因此,为了优化接口响应时间以及看起来不那么蠢,我使用 ThreadLocal 将用户标签接口的返回数据存储到当前线程,因为在单个请求中,多次调用此接口获取数据是不必要的,它看起来像这样: /** * 此静态变量ThreadLocal会为每个线程创建本地副本, 因此USER_TAGS_THREAD_

By FatTiger
All about ExecutionContext and SynchronizationContext

All about ExecutionContext and SynchronizationContext

前言 这篇文章深入探讨了ExecutionContext和SynchronizationContext, 这是大部分开发人员都不需要了解的 .NET 高级领域. SynchronizationContext 我最早关于 SynchronizationContext 了解可能是在 WindowsForm 程序, 当我错误的在其它线程去更新 UI 控件时, 总会出现一个异常 Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on 翻译过来即 跨线程操作无效:控件从创建它的线程以外的线程访问, 例如这个代码片段: private void button_Click(object sender, EventArgs e) { Task.Run(() => { //异常: 跨线程操作无效:控件从创建它的线程以外的线程访问

By FatTiger