㈠ 区块链里的加密是什么意思(区块链加密算法是什么)
区块链中的对称加密是什么?非对称加密又是什么?对称加密算法是指在加密和解密时使用的是同一个秘钥。与对称加密算法不同,非对称加密算法需要公钥和私钥。公钥和私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。
非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。
而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,在通讯前不需要先同步秘钥,避免了在同步私钥过程中被黑客盗取信息的风险。
【深度知识】区块链之加密原理图示(加密,签名)先放一张以太坊的架构图:
在学习的过程中主要是采用单个模块了学习了解的,包括P2P,密码学,网络,协议等。直接开始总结:
秘钥分配问题也就是秘钥的传输问题,如果对称秘钥,那么只能在线下进行秘钥的交换。如果在线上传输秘钥,那就有可能被拦截。所以采用非对称加密,两把钥匙,一把私钥自留,一把公钥公开。公钥可以在网上传输。不用线下交易。保证数据的安全性。
如上图,A节点发送数据到B节点,此时采用公钥加密。A节点从自己的公钥中获取到B节点的公钥对明文数据加密,得到密文发送给B节点。而B节点采用自己的私钥解密。
2、无法解决消息篡改。
如上图,A节点采用B的公钥进行加密,然后将密文传输给B节点。B节点拿A节点的公钥将密文解密。
1、由于A的公钥是公开的,一旦网上黑客拦截消息,密文形同虚设。说白了,这种加密方式,只要拦截消息,就都能解开。
2、同样存在无法确定消息来源的问题,和消息篡改的问题。
如上图,A节点在发送数据前,先用B的公钥加密,得到密文1,再用A的私钥对密文1加密得到密文2。而B节点得到密文后,先用A的公钥解密,得到密文1,之后用B的私钥解密得到明文。
1、当网络上拦截到数据密文2时,由于A的公钥是公开的,故可以用A的公钥对密文2解密,就得到了密文1。所以这样看起来是双重加密,其实最后一层的私钥签名是无效的。一般来讲,我们都希望签名是签在最原始的数据上。如果签名放在后面,由于公钥是公开的,签名就缺乏安全性。
2、存在性能问题,非对称加密本身效率就很低下,还进行了两次加密过程。
如上图,A节点先用A的私钥加密,之后用B的公钥加密。B节点收到消息后,先采用B的私钥解密,然后再利用A的公钥解密。
1、当密文数据2被黑客拦截后,由于密文2只能采用B的私钥解密,而B的私钥只有B节点有,其他人无法机密。故安全性最高。
2、当B节点解密得到密文1后,只能采用A的公钥来解密。而只有经过A的私钥加密的数据才能用A的公钥解密成功,A的私钥只有A节点有,所以可以确定数据是由A节点传输过来的。
经两次非对称加密,性能问题比较严重。
基于以上篡改数据的问题,我们引入了消息认证。经过消息认证后的加密流程如下:
当A节点发送消息前,先对明文数据做一次散列计算。得到一个摘要,之后将照耀与原始数据同时发送给B节点。当B节点接收到消息后,对消息解密。解析出其中的散列摘要和原始数据,然后再对原始数据进行一次同样的散列计算得到摘要1,比较摘要与摘要1。如果相同则未被篡改,如果不同则表示已经被篡改。
在传输过程中,密文2只要被篡改,最后导致的hash与hash1就会产生不同。
无法解决签名问题,也就是双方相互攻击。A对于自己发送的消息始终不承认。比如A对B发送了一条错误消息,导致B有损失。但A抵赖不是自己发送的。
在(三)的过程中,没有办法解决交互双方相互攻击。什么意思呢?有可能是因为A发送的消息,对A节点不利,后来A就抵赖这消息不是它发送的。
为了解决这个问题,故引入了签名。这里我们将(二)-4中的加密方式,与消息签名合并设计在一起。
在上图中,我们利用A节点的私钥对其发送的摘要信息进行签名,然后将签名+原文,再利用B的公钥进行加密。而B得到密文后,先用B的私钥解密,然后对摘要再用A的公钥解密,只有比较两次摘要的内容是否相同。这既避免了防篡改问题,有规避了双方攻击问题。因为A对信息进行了签名,故是无法抵赖的。
为了解决非对称加密数据时的性能问题,故往往采用混合加密。这里就需要引入对称加密,如下图:
在对数据加密时,我们采用了双方共享的对称秘钥来加密。而对称秘钥尽量不要在网络上传输,以免丢失。这里的共享对称秘钥是根据自己的私钥和对方的公钥计算出的,然后适用对称秘钥对数据加密。而对方接收到数据时,也计算出对称秘钥然后对密文解密。
以上这种对称秘钥是不安全的,因为A的私钥和B的公钥一般短期内固定,所以共享对称秘钥也是固定不变的。为了增强安全性,最好的方式是每次交互都生成一个临时的共享对称秘钥。那么如何才能在每次交互过程中生成一个随机的对称秘钥,且不需要传输呢?
那么如何生成随机的共享秘钥进行加密呢?
对于发送方A节点,在每次发送时,都生成一个临时非对称秘钥对,然后根据B节点的公钥和临时的非对称私钥可以计算出一个对称秘钥(KA算法-KeyAgreement)。然后利用该对称秘钥对数据进行加密,针对共享秘钥这里的流程如下:
对于B节点,当接收到传输过来的数据时,解析出其中A节点的随机公钥,之后利用A节点的随机公钥与B节点自身的私钥计算出对称秘钥(KA算法)。之后利用对称秘钥机密数据。
对于以上加密方式,其实仍然存在很多问题,比如如何避免重放攻击(在消息中加入Nonce),再比如彩虹表(参考KDF机制解决)之类的问题。由于时间及能力有限,故暂时忽略。
那么究竟应该采用何种加密呢?
主要还是基于要传输的数据的安全等级来考量。不重要的数据其实做好认证和签名就可以,但是很重要的数据就需要采用安全等级比较高的加密方案了。
密码套件是一个网络协议的概念。其中主要包括身份认证、加密、消息认证(MAC)、秘钥交换的算法组成。
在整个网络的传输过程中,根据密码套件主要分如下几大类算法:
秘钥交换算法:比如ECDHE、RSA。主要用于客户端和服务端握手时如何进行身份验证。
消息认证算法:比如SHA1、SHA2、SHA3。主要用于消息摘要。
批量加密算法:比如AES,主要用于加密信息流。
伪随机数算法:例如TLS1.2的伪随机函数使用MAC算法的散列函数来创建一个主密钥——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。
在网络中,一次消息的传输一般需要在如下4个阶段分别进行加密,才能保证消息安全、可靠的传输。
握手/网络协商阶段:
在双方进行握手阶段,需要进行链接的协商。主要的加密算法包括RSA、DH、ECDH等
身份认证阶段:
身份认证阶段,需要确定发送的消息的来源来源。主要采用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA签名)等。
消息加密阶段:
消息加密指对发送的信息流进行加密。主要采用的加密方式包括DES、RC4、AES等。
消息身份认证阶段/防篡改阶段:
主要是保证消息在传输过程中确保没有被篡改过。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC:EllipticCurvesCryptography,椭圆曲线密码编码学。是一种根据椭圆上点倍积生成公钥、私钥的算法。用于生成公私秘钥。
ECDSA:用于数字签名,是一种数字签名算法。一种有效的数字签名使接收者有理由相信消息是由已知的发送者创建的,从而发送者不能否认已经发送了消息(身份验证和不可否认),并且消息在运输过程中没有改变。ECDSA签名算法是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。主要用于身份认证阶段。
ECDH:也是基于ECC算法的霍夫曼树秘钥,通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,并且是这种共享秘钥是为当前的通信暂时性的随机生成的,通信一旦中断秘钥就消失。主要用于握手磋商阶段。
ECIES:是一种集成加密方案,也可称为一种混合加密方案,它提供了对所选择的明文和选择的密码文本攻击的语义安全性。ECIES可以使用不同类型的函数:秘钥协商函数(KA),秘钥推导函数(KDF),对称加密方案(ENC),哈希函数(HASH),H-MAC函数(MAC)。
ECC是椭圆加密算法,主要讲述了按照公私钥怎么在椭圆上产生,并且不可逆。ECDSA则主要是采用ECC算法怎么来做签名,ECDH则是采用ECC算法怎么生成对称秘钥。以上三者都是对ECC加密算法的应用。而现实场景中,我们往往会采用混合加密(对称加密,非对称加密结合使用,签名技术等一起使用)。ECIES就是底层利用ECC算法提供的一套集成(混合)加密方案。其中包括了非对称加密,对称加密和签名的功能。
metacharset="utf-8"
这个先订条件是为了保证曲线不包含奇点。
所以,随着曲线参数a和b的不断变化,曲线也呈现出了不同的形状。比如:
所有的非对称加密的基本原理基本都是基于一个公式K=kG。其中K代表公钥,k代表私钥,G代表某一个选取的基点。非对称加密的算法就是要保证该公式不可进行逆运算(也就是说G/K是无法计算的)。*
ECC是如何计算出公私钥呢?这里我按照我自己的理解来描述。
我理解,ECC的核心思想就是:选择曲线上的一个基点G,之后随机在ECC曲线上取一个点k(作为私钥),然后根据kG计算出我们的公钥K。并且保证公钥K也要在曲线上。*
那么kG怎么计算呢?如何计算kG才能保证最后的结果不可逆呢?这就是ECC算法要解决的。
首先,我们先随便选择一条ECC曲线,a=-3,b=7得到如下曲线:
在这个曲线上,我随机选取两个点,这两个点的乘法怎么算呢?我们可以简化下问题,乘法是都可以用加法表示的,比如22=2+2,35=5+5+5。那么我们只要能在曲线上计算出加法,理论上就能算乘法。所以,只要能在这个曲线上进行加法计算,理论上就可以来计算乘法,理论上也就可以计算k*G这种表达式的值。
曲线上两点的加法又怎么算呢?这里ECC为了保证不可逆性,在曲线上自定义了加法体系。
现实中,1+1=2,2+2=4,但在ECC算法里,我们理解的这种加法体系是不可能。故需要自定义一套适用于该曲线的加法体系。
ECC定义,在图形中随机找一条直线,与ECC曲线相交于三个点(也有可能是两个点),这三点分别是P、Q、R。
那么P+Q+R=0。其中0不是坐标轴上的0点,而是ECC中的无穷远点。也就是说定义了无穷远点为0点。
同样,我们就能得出P+Q=-R。由于R与-R是关于X轴对称的,所以我们就能在曲线上找到其坐标。
P+R+Q=0,故P+R=-Q,如上图。
以上就描述了ECC曲线的世界里是如何进行加法运算的。
从上图可看出,直线与曲线只有两个交点,也就是说直线是曲线的切线。此时P,R重合了。
也就是P=R,根据上述ECC的加法体系,P+R+Q=0,就可以得出P+R+Q=2P+Q=2R+Q=0
于是乎得到2P=-Q(是不是与我们非对称算法的公式K=kG越来越近了)。
于是我们得出一个结论,可以算乘法,不过只有在切点的时候才能算乘法,而且只能算2的乘法。
假若2可以变成任意个数进行想乘,那么就能代表在ECC曲线里可以进行乘法运算,那么ECC算法就能满足非对称加密算法的要求了。
那么我们是不是可以随机任何一个数的乘法都可以算呢?答案是肯定的。也就是点倍积计算方式。
选一个随机数k,那么k*P等于多少呢?
我们知道在计算机的世界里,所有的都是二进制的,ECC既然能算2的乘法,那么我们可以将随机数k描述成二进制然后计算。假若k=151=10010111
由于2P=-Q所以这样就计算出了kP。这就是点倍积算法。所以在ECC的曲线体系下是可以来计算乘法,那么以为这非对称加密的方式是可行的。
至于为什么这样计算是不可逆的。这需要大量的推演,我也不了解。但是我觉得可以这样理解:
我们的手表上,一般都有时间刻度。现在如果把1990年01月01日0点0分0秒作为起始点,如果告诉你至起始点为止时间流逝了整1年,那么我们是可以计算出现在的时间的,也就是能在手表上将时分秒指针应该指向00:00:00。但是反过来,我说现在手表上的时分秒指针指向了00:00:00,你能告诉我至起始点算过了有几年了么?
ECDSA签名算法和其他DSA、RSA基本相似,都是采用私钥签名,公钥验证。只不过算法体系采用的是ECC的算法。交互的双方要采用同一套参数体系。签名原理如下:
在曲线上选取一个无穷远点为基点G=(x,y)。随机在曲线上取一点k作为私钥,K=k*G计算出公钥。
签名过程:
生成随机数R,计算出RG.
根据随机数R,消息M的HASH值H,以及私钥k,计算出签名S=(H+kx)/R.
将消息M,RG,S发送给接收方。
签名验证过程:
接收到消息M,RG,S
根据消息计算出HASH值H
根据发送方的公钥K,计算HG/S+xK/S,将计算的结果与RG比较。如果相等则验证成功。
公式推论:
HG/S+xK/S=HG/S+x(kG)/S=(H+xk)/GS=RG
在介绍原理前,说明一下ECC是满足结合律和交换律的,也就是说A+B+C=A+C+B=(A+C)+B。
这里举一个WIKI上的例子说明如何生成共享秘钥,也可以参考AliceAndBob的例子。
Alice与Bob要进行通信,双方前提都是基于同一参数体系的ECC生成的公钥和私钥。所以有ECC有共同的基点G。
生成秘钥阶段:
Alice采用公钥算法KA=ka*G,生成了公钥KA和私钥ka,并公开公钥KA。
Bob采用公钥算法KB=kb*G,生成了公钥KB和私钥kb,并公开公钥KB。
计算ECDH阶段:
Alice利用计算公式Q=ka*KB计算出一个秘钥Q。
Bob利用计算公式Q'=kb*KA计算出一个秘钥Q'。
共享秘钥验证:
Q=kaKB=ka*kb*G=ka*G*kb=KA*kb=kb*KA=Q'
故双方分别计算出的共享秘钥不需要进行公开就可采用Q进行加密。我们将Q称为共享秘钥。
在以太坊中,采用的ECIEC的加密套件中的其他内容:
1、其中HASH算法采用的是最安全的SHA3算法Keccak。
2、签名算法采用的是ECDSA
3、认证方式采用的是H-MAC
4、ECC的参数体系采用了secp256k1,其他参数体系参考这里
H-MAC全程叫做Hash-.其模型如下:
在以太坊的UDP通信时(RPC通信加密方式不同),则采用了以上的实现方式,并扩展化了。
首先,以太坊的UDP通信的结构如下:
其中,sig是经过私钥加密的签名信息。mac是可以理解为整个消息的摘要,ptype是消息的事件类型,data则是经过RLP编码后的传输数据。
其UDP的整个的加密,认证,签名模型如下:
区块链的加密技术数字加密技能是区块链技能使用和开展的关键。一旦加密办法被破解,区块链的数据安全性将受到挑战,区块链的可篡改性将不复存在。加密算法分为对称加密算法和非对称加密算法。区块链首要使用非对称加密算法。非对称加密算法中的公钥暗码体制依据其所依据的问题一般分为三类:大整数分化问题、离散对数问题和椭圆曲线问题。第一,引进区块链加密技能加密算法一般分为对称加密和非对称加密。非对称加密是指集成到区块链中以满意安全要求和所有权验证要求的加密技能。非对称加密通常在加密和解密进程中使用两个非对称暗码,称为公钥和私钥。非对称密钥对有两个特点:一是其间一个密钥(公钥或私钥)加密信息后,只能解密另一个对应的密钥。第二,公钥可以向别人揭露,而私钥是保密的,别人无法通过公钥计算出相应的私钥。非对称加密一般分为三种首要类型:大整数分化问题、离散对数问题和椭圆曲线问题。大整数分化的问题类是指用两个大素数的乘积作为加密数。由于素数的出现是没有规律的,所以只能通过不断的试算来寻找解决办法。离散对数问题类是指基于离散对数的困难性和强单向哈希函数的一种非对称分布式加密算法。椭圆曲线是指使用平面椭圆曲线来计算一组非对称的特殊值,比特币就采用了这种加密算法。非对称加密技能在区块链的使用场景首要包含信息加密、数字签名和登录认证。(1)在信息加密场景中,发送方(记为A)用接收方(记为B)的公钥对信息进行加密后发送给
B,B用自己的私钥对信息进行解密。比特币交易的加密就属于这种场景。(2)在数字签名场景中,发送方A用自己的私钥对信息进行加密并发送给B,B用A的公钥对信息进行解密,然后确保信息是由A发送的。(3)登录认证场景下,客户端用私钥加密登录信息并发送给服务器,服务器再用客户端的公钥解密认证登录信息。请注意上述三种加密计划之间的差异:信息加密是公钥加密和私钥解密,确保信息的安全性;数字签名是私钥加密,公钥解密,确保了数字签名的归属。认证私钥加密,公钥解密。以比特币体系为例,其非对称加密机制如图1所示:比特币体系一般通过调用操作体系底层的随机数生成器生成一个256位的随机数作为私钥。比特币的私钥总量大,遍历所有私钥空间获取比特币的私钥极其困难,所以暗码学是安全的。为便于辨认,256位二进制比特币私钥将通过SHA256哈希算法和Base58进行转化,构成50个字符长的私钥,便于用户辨认和书写。比特币的公钥是私钥通过Secp256k1椭圆曲线算法生成的65字节随机数。公钥可用于生成比特币交易中使用的地址。生成进程是公钥先通过SHA256和RIPEMD160哈希处理,生成20字节的摘要成果(即Hash160的成果),再通过SHA256哈希算法和Base58转化,构成33个字符的比特币地址。公钥生成进程是不可逆的,即私钥不能从公钥推导出来。比特币的公钥和私钥通常存储在比特币钱包文件中,其间私钥最为重要。丢掉私钥意味着丢掉相应地址的所有比特币财物。在现有的比特币和区块链体系中,现已依据实践使用需求衍生出多私钥加密技能,以满意多重签名等愈加灵敏杂乱的场景。
㈡ metamask使用哪个以太坊节点
metamask使用rpcurl以太坊节点。根据查询相关的公开信息,当用户连接到自定义MetaMask网络时,MetaMask将与RPCURL中的以太坊节点通信,并使用它发送交易、从区块链读取数据以及与智能合约交互。
㈢ 以太坊如何使用web3.js或者rpc接口获取交易数据交易时间与确认数
对于主网交易记录的查询,许多开发者会选择使用Etherscan,然而在面对自建私链时,这一选项不再适用。那么如何获取私链上的交易数据呢?一种常见的方法是监听链上的日志,然后将这些日志存入数据库,通过数据库进行查询。例如,你可以编写如下代码:
首先定义一个地址,比如:var addr = "";
接着使用web3库的eth.filter方法来监听特定地址上的交易,这一步操作的代码如下:var filter = web3.eth.filter({fromBlock: 0, toBlock: 'latest', address: addr});
监听完成后,使用filter.get方法获取所有交易,遍历这些交易,通过web3.eth.getTransaction方法获取具体的交易信息。例如:transactions.forEach(function(tx){ var txInfo = web3.eth.getTransaction(tx.transactionHash); // 将交易信息存入数据库 })
在这里,web3.eth.filter()用于监听链上的交易日志,web3.eth.getTransaction()则用于提取特定交易的详细信息。一旦获取到交易信息,就可以将其存储到数据库中,为后续查询提供支持。
除了上述方法外,还有其他方式可以实现这一目标,比如使用RPC接口。RPC接口提供了更多功能,包括查询账户余额、调用智能合约等,而不仅仅是监听交易。例如,你可以使用web3.eth.sendTransaction方法来发送交易,或使用web3.eth.getBalance方法来获取账户余额。
总之,无论是监听日志还是使用RPC接口,都是获取私链交易数据的有效方法。选择哪种方式取决于你的具体需求和场景。当然,如果你想进一步深入学习以太坊技术,我推荐你参考一些实战教程,例如:以太坊教程。
㈣ Infura API 获取以太坊当前配置链 ID - 区块链数据开发实战
简介:Infura 是以太坊和 IPFS 的 API 服务提供商。Infura 一开始只是为 ConsenSys 内部项目提供稳定可靠的 RPC 访问,后来随着以太坊生态发展,他们意识到自己可以起到更大作用,于是开始面向开发者提供公共 API 服务。本文整理使用 Infura API 获取以太坊当前配置链 ID 的实现。
Infura 是以太坊和 IPFS 的 API 服务提供商。Infura 一开始只是为 ConsenSys 内部项目提供稳定可靠的 RPC 访问,后来随着以太坊生态发展,他们意识到自己可以起到更大作用,于是开始面向开发者提供公共 API 服务。
本文整理使用 Infura API 获取以太坊当前配置链 ID 的实现。
Infura API 官方文档: https://infura.io/docs
使用 API 需要申请 Project ID ,ID 是免费申请的,申请流程为“注册 - 登录 - 创建新项目”,不需要审核,几分钟就能搞定。
Infura API 标准请求端口格式:
本例中我们使用基于 HTTP 的以太坊主网 JSON-RPC 端口:
Infura API 获取以太坊当前配置链 ID:
Curl 示例:
Node.js 示例:
返回的 JSON 示例:
返回当前链 ID 的大整数。
Infura API 服务思维导图:
我们有一个区块链知识星球,做区块链前沿资料的归纳整理以方便大家检索查询使用,也是国内顶尖区块链技术社区,欢迎感兴趣的朋友加入。如果你对上面内容有疑问,也可以加入知识星球提问我:
㈤ Foundry的基本使用总结
本文列举了 foundry 中常用的命令,方便后续查阅。使用 foundry 的工具主要涉及三大组件,分别对应不同的功能,接下来将详细介绍每个组件的使用方法和应用场景。
在使用 foundry 之前,需要先安装。可以通过访问 foundry 的官方网址 getfoundry.sh 进行安装。对于 mac 系统用户,可以使用以下命令进行安装:
foundry
foundry 工具包含三大组件,分别是 cast、anvil 和 forge。
**cast 使用**
cast 是用于执行以太坊 RPC 调用的命令行工具。它支持智能合约调用、发送交易和检索链数据等操作。cast 与 web3 的交互十分便捷,即使是非代码开发者也能轻松使用进行链上数据查询。
使用示例:
cast rpc eth_blockNumber --rpc-url=$ETH_RPC_URL
cast 支持环境变量 ETH_RPC_URL,读取时无需在命令中体现,只需设置该变量即可。
**cast 查询功能**
- **区块高度**:使用 `cast rpc eth_blockNumber` 查询。
- **区块信息**:使用 `cast block` 查询。
- **交易信息**:使用 `cast tx` 查询。
- **交易回执查询**:使用 `cast receipt` 查询。
**使用 jq 进行数据处理**
`jq` 是一个灵活的轻量级命令行 JSON 处理器,用于处理 JSON 输入并生成 JSON 输出。可应用于处理 cast 查询结果。
**交易模拟**
`cast run` 命令可用于模拟交易,以进行测试或研究特定交易场景。
**钱包相关功能**
`cast wallet new` 可创建新钱包,通过 `cast wallet sign` 进行签名操作。此外,`cast resolve-name` 和 `cast lookup-address` 功能用于 ENS 查询。
**合约相关功能**
在使用查看源代码功能前,需设置 `ETHERSCAN_API_KEY` 环境变量。`cast etherscan-source` 可用于查看合约源代码,通过 `-d` 参数保存结果。调用合约函数则使用 `cast call`。
查询合约存储位置的 `cast index` 命令可根据类型、键和槽位编号计算存储位置。
**anvil 使用**
`anvil` 提供了模拟从主网 fork 的功能,通过 `casat —fork-url=$ETH_RPC_URL` 实现。常用命令参数包括 `—accounts`、`—balance` 和 `—fork-block-number`。
**forge-智能合约开发框架**
`forge init` 命令初始化项目,`forge build` 编译代码,`forge test` 进行自动化测试。日志打印可通过 `emit log` 或 `console2.log` 实现,确保在使用 `forge test` 时使用 `—vvv` 参数以显示打印内容。
`cheatcode` 功能允许在测试合约中通过 `vm` 修改虚拟机状态,如 `vm.warp` 修改时间戳、`vm.startPrank` 和 `vm.stopPrank` 修改发件人、`vm.deal` 修改余额等。
`forge snapshot` 功能允许在每个测试用例的 gas 使用上创建快照,有助于优化 gas 费用。
**代码示例**
### 修改 ERC20 代币余额
在进行 ERC20 代币余额修改时,可以使用 `vm.deal` 函数。如果在测试环境中未部署 ERC20 合约,可通过 fork-url 直接使用主网的 ERC20 合约。
### fork-url 在代码中的实现
在代码中实现 fork-url 可以通过 `vm.envAddress` 函数读取 vm 中的环境变量地址,进而实现针对不同测试网络的灵活测试用例编写。
本文详细介绍了 foundry 的基本使用方法,旨在为开发者提供便捷的工具链,提高智能合约开发和测试的效率。通过上述指南,开发者能够更加熟练地掌握 foundry 的核心功能,为区块链项目开发提供有力支持。
㈥ 简述以太坊P2P网络之UDP
个人认为以太坊是区块链项目中带来技术重新认识和学习的不错的项目,特别是在P2P网络这一块。本文将介绍P2P网络中负责节点之间的通信连接和服务发现,本文的内容主要是对代码层级的理解,可能存在对其理解的错误,欢迎指点。包括以下两个方面:
种子节点初始化,节点发现
节点连接及相互通信
pending一种延迟处理逻辑,提供一个回调机制当某一个操作发起异步请求时,就使用pending结构封装一个闭包,当收到异步回复后从pending列表取出这个闭包,执行回调,因此在这个回调里可以完成数据包校验等后处理,如findnode操作将更新k桶的操作暂存,再获取到异步回复后执行这个闭包完成k桶更新
提供多个回复接收功能,一个RPC请求可能会对应多个回复包,比如findnode对应多个neigbours回复包,此时可以提供多个pending进行逐个包校验
种子节点初始化及节点发现这部分的逻辑的实现主要在p2p/discover/table.go中,在udp中newUDP方法调用newTable开始种子节点及节点的发现。
newTable:执行该函数会传入Bootnodes信息,配置信息在params/bootnodes.go中,为初始连接节点,服务启动后就从这些节点开始进行节点的发现和扩散。关键执行方法
tab.doRefresh:创建goroutine刷新所有节点(30分钟),并进行连接
tab.lookup:查找距离自己最近的节点
tab.closest:获取距离target最近的16个节点
tab.findnode:向最近的节点发起findnode请求,并增加处理neighborsPacket闭包的pending,具体实现为udp.go中的findnode,对于超过24小时没有接收到ping包的节点重新发送ping;对端节点接收到findnode请求后,查找附近的16个节点,并发送neighborsPacket
tab.setFallbackNodes:验证bootnodes信息,将节点信息赋值给tab.nursery
tab.seedRand:设置随机seed
tab.loadSeedNodes:将bootnodes加入路由表
tab.loop:创建goroutine发现节点并进行连接
--
findnode-neighbors 时序图
由于UDP有最大报文数限制,所以能够发送的邻近节点数目是有限的,需要拆包发送
节点连接及相互通信P2P服务的启动位于p2p/server.go 中的Start()。
建立一个UDP连接服务discover.ListenUDP这个方法的关键实现是初始化三个通道,2个goroutine 。
三个通道
closing:关闭udp
gotreply:消息回复
addpending:pending消息处理
2个 goroutine
t.handlePacket:执行decodePacket对数据包进行解码,然后调用相应数据包的handle方法
t.addpending:接收并增加一个闭包
t.gotreply:接收回复遍历,执行callback通知errC通道
udp.loop():主要监听t.gotreply和t.addpending
udp.readLoop():读取UDP数据包,执行t.handlePacket进行数据包处理
网络传输四种数据包数据包类型
const(pingPacket=iota+1//zerois'reserved')数据包结构
ping-pong 时序图
总结区块链技术是一个不错的技术,以太坊让我们重新理解了网络的应用。本文简单介绍了P2P网络的UDP协议这一块,实际上网络及节点的发现是有一整套算法,经典的有 Kademlia 网络,这里不做介绍。
㈦ 区块链id是指什么,区块链lp是什么
以太坊的ChainId与NetworkIdChainId是EIP-155引入的一个用来区分不同EVM链的一个标识。如下图所示,主要作用就是避免一个交易在签名之后被重复在不同的链上提交。最开始主要是为了防止以太坊交易在以太经典网络上重放或者以太经典交易在以太坊网络上重放。在以太坊网络上是从2675000这个区块通过SpuriousDragon这个硬分叉升级激活。
引入ChainId后,带来了哪些影响呢?
NetworkId主要用来在网络层标识当前的区块链网络。NetworkId不一致的两个节点无法建立连接。
NetworkId无法通过配置文件指定,智能通过参数--networkid来指定。所以我们启动自己私链节点上需要记得加上这个参数。如果不加这个参数也不指定网络类型,默认NetworkId的值和以太坊主网一致。
不是。
这个根据上面的介绍可以很明显的看出,两者并没有非常高的关联度。
网上几乎所有提到搭建以太坊私链的文章,都要强调NetworkId需要和genesis文件里ChainId的值相同。事实上是没必要的。
就像下面这张图展示的这样,很多已经在主网运行的EVM链,它们的ChainId和NetworkId并不相同。比如以太经典,它的ChainId是61,但NetworkId和以太坊主网一样都是1。
之所以很多文章强调ChainId和NetworkId要保持一致,可能因为在某一段时间内,一些开发工具比如MetaMask,会把NetworkId当作ChainId来用。不过现在MetaMask已经支持自定义ChainId,以太坊也添加了“eth_chainId”这个RPCAPI,相信两者误用的情况会越来越少。
区块链交易id在哪查
这里我们用以太坊区块链的钱包作为例子,小狐狸是加密钱包,以及进入区块链APP的出入口。进入之后获取钱包地址,再使用以太坊区块链的搜索器进入Etherscan官网首页后,就可以获取到以下区块链交易id信息:
1.最新产生的区块
2.最新发生的交易
拓展资料:
区块链的交易过程看似神秘繁琐,其实真正说起来却也不见得有那么难。
第一步:所有者A利用他的私钥对前一次交易(比特货来源)和下一位所有者B签署一个数字签名,并将这个签名附加在这枚货币的末尾,制作出交易单。此时,B是以公钥作为接收方地址。
第二步:A将交易单广播至全网,比特币就发送给了B,每个节点都将收到交易信息纳入一个区块中
此时,对B而言,该枚比特币会即时显示在比特币钱包中,但直到区块确认成功后才可以使用。目前一笔比特币从支付到最终确认成功,得到6个区块确认之后才能真正的确认到账。
第三步:每个节点通过解一道数学难题,从而去获得创建新区块的权利,并争取得到比特币的奖励(新比特币会在此过程中产生)
此时节点反复尝试寻找一个数值,使得将该数值、区块链中最后一个区块的Hash值以及交易单三部分送入SHA256算法后能计算出散列值X(256位)满足一定条件(比如前20位均为0),即找到数学难题的解。
第四步:当一个节点找到解时,它就向全国广播该区块记录的所有盖时间戳交易,并由全网其他节点核对。
此时时间戳用来证实特定区块必然于某特定时间是的确存在的。比特币网络采用从5个以上节点获取时间,然后取中间值的方式成为时间戳。
第五步:全网其他节点核对该区块记账的正确性,没有错误后他们将在该合法区块之后竞争下一个区块,这样就形成了一个合法记账区块链。
时间条约链区块身份ID是什么东西?有什么用?1.区块身份是用户在TTC生态社区中的通行证,与区块身份ID绑定。
区块身份ID相当于腾讯产品生态内的QQ号。区块身份ID与QQ号不同的地方有:
a.用户的个人数据会存储在各自的区块地址中,用户可以通过区块身份ID登陆进行管理。b.区块身份ID是基于区块链技术研发的,具备区块链的去中心化、分布式记账、匿名、安全、可控等特点。
2.区块身份ID是TTC生态社区的通行证,可以用来一键登录TTC生态内的所有应用,包括后续上线的各种Dapp,无需重复注册,收付款更便捷,现在注册更有六位数靓号可以获得。
区块链ido是什么意思IDO(是InitialDigitalassetsOffering缩写),首次区块链数字资产的发行、源自股票市场的首次公开发行(IPO)概念,是企业区块链项目首次以资产数字化产生出来的区块链数字资产,以产品锚定资产债券、众筹方式募集的通用数字资产的行为。
一、首次公开募股(InitialPublicOffering)是指一家企业第一次将它的股份向公众出售通常,上市公司的股份是根据相应证监会出具的招股书或登记声明中约定的条款通过经纪商或做市商进行销售。一般来说,一旦首次公开上市完成后,这家公司就可以申请到证券交易所或报价系统挂牌交易。?有限责任公司在申请IPO之前,应先变更为股份有限公司。
二、就估值模型而言,不同的行业属性、成长性、财务特性决定了上市公司适用不同的估值模型。较为常用的估值方式可以分为两大类:收益折现法与类比法。所谓收益折现法,就是通过合理的方式估计出上市公司未来的经营状况,并选择恰当的贴现率与贴现模型,计算出上市公司价值,如最常用的股利折现模型(DDM)、现金流贴现(DCF)模型等。贴现模型并不复杂,关键在于如何确定公司未来的现金流和折现率,而这正是体现承销商的专业价值所在。所谓类比法,就是通过选择同类上市公司的一些比率,如最常用的市盈率(P/E即股价/每股收益)、市净率(P/B即股价/每股净资产),再结合新上市公司的财务指标如每股收益、每股净资产来确定上市公司价值,一般都采用预测的指标。
三、市盈率法的使用具有许多局限性,例如要求上市公司经营业绩要稳定,不能出现亏损等。而市净率法则没有这些问题,但同样也有缺陷,主要是过分依赖公司账面价值而不是最新的市场价值,因此对于那些流动资产比例高的公司如银行、保险公司比较适用此方法。在此次建行IPO过程中,按招股说明书中确定的定价区间1.9~2.4港元计算,发行后的每股净资产约为1.09~1.15港元,则市净率(P/B)为1.74~2.09倍。除上述指标,还可以通过市值/销售收入(P/S)、市值/现金流(P/C)等指标来进行估值。通过估值模型,可以合理地估计公司的理论价值,但是要最终确定发行价格,还需要选择合理的发行方式,以充分发现市场需求,常用的发行方式包括:累计投标方式、固定价格方式、竞价方式。一般竞价方式更常见于债券发行,这里不做赘述。累计投标是国际上最常用的新股发行方式之一,是指发行人通过询价机制确定发行价格,并自主分配股份。所谓"询价机制",是指主承销商先确定新股发行价格区间,召开路演推介会,根据需求量和需求价格信息对发行价格反复修正,并最终确定发行价格的过程。一般时间为1~2周。例如此次建行最初的询价区间为1.42~2.27港元,此后收窄至1.65~2.10港元,最终发行价将在10月25日前确定。询价过程只是投资者的意向表示,一般不代表最终的购买承诺。
区块链的tokenid是什么一般是用于需要安全登陆验证的网站,每次访问创建一个随机令牌ID,注销后即吊销该ID,起到安全防护作用。