点击下方“JavaEdge”,选择“设为星标”
第一时间关注技术干货!
免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」; 不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。 怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」
以太坊的账户模型和比特币非常相似,如都有椭圆曲线算法,并以secp256k1作为参数。
但以太坊的账户模型也针对性做了一些修改以适应以太坊的需求。如以太坊的账户分为外部账户和合约账户。
以太坊的外部账户和比特币的账户模型一样:
不过以太坊计算地址的方式和比特币有所不同。看以太坊地址计算流程。
flowchart TD
A[开始]
B[1. CSPRNG生成随机数N]
C["2. P(px, py)=N*G(gx, gy)"]
D["3. data=px+py"]
E["4. H=keccak256(data)"]
F["5. address=H.sub(12,32)"]
G[结束]
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
和比特币不同的是,以太坊还有一种合约账户的账户类型,因为与比特币纯粹的数字货币不同,以太坊支持智能合约。
智能合约可看做一个特殊的账户,在以太坊中称合约账户,其特殊在于关联了可执行的智能合约代码。
合约地址是在合约创建过程中生成的,一般根据合约数据计算得到,也可通过创建外部地址的方式得到。
基本一样,以太坊虽区分两种账户,但数据结构上一致,只在具体实现有所差异。
有相同的属性:
以太坊中细化了交易费相关,交易肯定有交易费用,以太坊中引入一个中间概念 gas,字面意“汽油”,可理解为一种燃料或能量,在以太坊交易涉及的各种操作都要 gas。如存储一个数据、创建一个合约、执行一次 Hash计算都需要。
一个交易使用的能量 gas 可作为衡量一个交易的计算量,需要越多的计算和存储就花费更多gas。当然仅有 gas 不够,还需要为 gas 定价,就像汽油有价格,gas 也有价格,即gasPrice。
gasLimit,表示限制最多使用的 gas,主要考虑到遇到错误时做尽量减小损失。如本来一个正常的合约调用只需很少gas,但因错误造成死循环。若无 gasLimit 就会一直运行,不断消耗 gas,而 gas 要花钱。
以太坊对操作需要的gas做了些规定,如交易的基本费用是500gas、合约创建是53000 gas、交易数据每一个字节需要 5 gas 等。
正因每个操作都有明确的需要多少gas,所以我们可对交易或合约调用需要的gas进行评估。
gasUsed就是执行所有操作需要的gas总和。交易的花费就是一个交易需要使用多少以太币,假设交易花费为totalCost,则 totalCost = gasUsed * gasPrice
以太坊的交易指区块链上的外部账户向另一外部账户发送存储消息的签名数据包。可简单看做以太坊的一个账户向另一个账户转账。
下图展示与交易相关的不同属性和它们之间的关系:
数据签名,用来证明交易的合法性,检查是否是from地址对应签名的数据以判断是否接受交易。
转账 | data是可选数据 |
---|---|
合约创建 | data是编译之后的合约字节码 |
合约方法调用 | data是合约方法签名和参数编码 |
消息(message),本质是个transaction,不过消息由合约产生,适当合约执行call或delegatecall时产生而不是由外部产生。
以太坊是一个分布式系统,使用了分布式哈希表拓扑结构。每个节点都按距离维护一张路由表,路由表维护256个bucket,每个桶存放k个Node(k=16,指定距离范围最多能存放16个节点,此举可以增加整个网络的稳定性),每个Node用NODEID作为唯一标识符。
Kademlia,一种点对点分布式哈希表(DHT),它在易出错的环境中也具备可证实的一致性和性能。
Kademlia使用一种基于异或指标的拓扑结构来路由查询和定位节点,这简化了算法并有助于证明。该拓扑结构有个特点:每次消息交换都能传递或强化有效信息。系统利用这些信息进行并发的异步查询,可容忍节点故障,并且故障不会导致用户超时。
以太坊的节点发现机制基于Kademlia,但其目的却不同:
客户端 | 语言 | 代码库 |
---|---|---|
Go-ethereum | Go | https://github.com/ethereum/go-ethereum |
Parity | Rust | https://github.com/paritytech/parity-ethereum |
Cpp-ethereum | C++ | https://github.com/ethereum/aleth |
pyethapp | Python | https://github.com/ethereum/pyethapp |
Ethereumjs-lib | JavaScript | https://github.com/ethereumjs/ethereumjs-lib |
Ethereum(J) | Java | https://github.com/ethereum/ethereumj |
Go-ethereum是使用最多的客户端,也被称为Geth,是由以太坊基金会使用Go语言所开发的。
因为账户、交易和交易收据的内容比较多,在区块头中只包含它们的 Hash 值,但这些Hash值是一个根Hash值,是通过内容计算获取的,只要有交易、账户或者交易数据被修改,相应的Hash值也会修改,所以可以放在区块头中作为工作量证明机制的参数
Hardhat:
综上,以太坊是一个全球性的区块链平台,而Hardhat是一个为以太坊智能合约开发提供便利的工具。开发者使用Hardhat来编写、测试和部署将以太坊作为运行平台的智能合约。简而言之,Hardhat是为了方便开发者在以太坊上构建应用而设计的开发工具。
参考:
作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。 各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。 负责:
目前主攻市级软件项目设计、构建服务全社会的应用系统。
参考:
编程严选网:
http://www.javaedge.cn/
专注分享软件开发全生态相关技术文章
、视频教程
资源、热点资讯等,全站资源免费学习,快来看看吧~
编程严选星球
欢迎长按图片加好友
,我会第一时间和你分享软件行业趋势
,面试资源
,学习方法
等等。