初学以太坊-1

    科技2022-08-15  92

    比特币网络就是全球无数台运行比特币客户端程序的计算设备,通过国际互联网进行通信,形成一个P2P网络,在这个网络上,任何人都可以进行点对点的转账操作。

    为了实现去中心化信任以及安全性等问题,比特币引入了基于POW(Proof of work)的验证机制,就是“挖矿”。

    “区块链”本质上就是一个数据库,在比特币网络中,所有交易产生的账本数据,以区块链的形式记录在网络当中的所有计算机存储当中。

    以太坊对比特币的扩展性这一环进行补充,建立了一个可编程的,图灵完备的区块链平台。

    在以太坊协议中,账户分为两类,一类是外部账户(externally owned accounts,EOAs),另一类是合约账户(contracts)。其中普通用户使用的账户都是外部账户,合约账户是创建合约时以太坊系统生成的账户。

    外部账户之所以被称为“外部”,是因为账户本身和以太坊网络没有任何实质上的联系。换句话说,我们不需要连接以太坊网络也可以生成以太坊外部账户,使用账户进行签名等。以太坊以及类似的数字货币账户,其账户系统都是基于非对称加密机制。账户本质上就是一个密钥对,包含公钥和私钥两部分。公钥经过转换之后生成公开的以太坊账户地址,而操作这个地址中的余额,需要使用对应的私钥。以太坊通过密码学上的安全性来保证账户的安全性。

    以太坊地址基于secp256k1椭圆曲线加密。我们可以使用openssl生成一组secp256k1密钥对。

    下一步对地址进行Hash操作,这里使用Python3和其一个第三方加密库pycryptodome

    对公钥执行一次keccak-256操作,输出hash的结果,取这个hash值的后40位,在最前面加上0x表明这是一个hex字符串,这样我们就得到了一个合法的以太坊账户地址。

    一个以太坊账户,实际上是由三个部分组合而成:私钥、公钥和地址。私钥是最核心的部分,通过私钥可以生成公钥,进一步的,通过公钥可以得到地址。地址可以看做是公钥的一种简短表示。通过Hash生成地址,在缩短内容长度的同时也可以保证其唯一性。

    区块链的核心就是一个账本的数据库,我们可以认为以太坊的区块链中存储的就是“地址-余额”这样的key-value对。

    以太坊所有账户的交易和余额信息都是公开的。

    当第一笔交易转入这个账户的时候,这个账户会被真正存储到以太坊区块链当中。

    简单来说,交易是由账号的拥有者(即私钥的拥有者)发起,签名,并发送到以太坊网络,经过全网的检验确认之后,最终存储到区块链网络当中。

    以太坊网络里面的“旷工”节点付出算力,检验全网的交易,网络会直接把奖励的“钱”发送到矿工的账户当中。

    Gas是支付给矿工的佣金,在发起交易,以及执行智能合约等操作的时候,都需要额外支付一部分费用给矿工。

    Gas由两部分组成:Gas Limit是用户愿意为执行某个操作或确认交易支付的最大Gas量。Gas Price是用户远离花费于每个Gas单位的价钱。这两部分都是可以完全自定义的。

    外部账户是以太坊系统“外部“的人类操作的,合约账户是由以太坊系统本身控制执行的。

    合约账户当中存储着合约代码,即合约内部是有逻辑的,我们可以调用合约中的逻辑函数,来实现合约中的功能。合约中逻辑的执行,使用的是以太坊的EVM(Ethereum Virtual Machine)平台。

    用户向合约发起了一个withdraw调用,合约内部跑了一些逻辑,最后合约执行完毕。

    智能合约的运行,会在网络的所有节点都执行一遍,并且校验最终的结果,所有的合约代码执行时都会在全网所有完整节点上执行完全相同的代码。而且为了避免恶意的合约,使用Gas Limit可以做到限制。

    合约代码是以太坊网络的一部分,是存储在以太坊区块链数据结构里面的,如果没有手动执行合约代码的销毁,合约代码会一直存储在以太坊网络中。

    Processed: 0.078, SQL: 8