00:00
刚才是哪位同学啊,提出来这个估计自己交易的guess这个这个话题,其实我觉得这个话题真是挺好的,就是我我刚才又专门又查了一下,确实是本身gas里边也有这一个接口,有一个API,让我们去估计一笔交易的大概执行这笔交易需要多少盖。大家可以看到这个API叫什么名字呢?就在ETH下面有一个方法叫做。这个。Estimate gas。Estimate应该就是估,估计的意思对吧,所以它的名字,这个名字就已经告诉我们,它就是用来估计你要花费多少。它的用法也很简单,看到我上面已经构建过了啊,我再敲一遍e.estimate gas,然后里边呢,大家注意,它是要放进去一笔交易。
01:02
就是非要放一个交易的对象,所以就像我们Eth.set transaction的时候一样,Set transaction也是要里面放一个交易对象,对吧?所以这个跟那个是完全一样的,所以大家可以把那个交易对象就是在send之前,然后我们estimate一下,看他这个到底花多少,大家都可以确定给多少GA p GA limit。呃,我们这里最基本的一个交易当然就是转账交易了。大家看我上面其实都已经都已经把这个弄了一遍了啊,就是from一个Eth.account accounts0to accounts1,然后转十个尾,这样一笔转账,他去判断这个要花多少GA,然后一执行他返回一个21000,这就是我们转账的标准的消耗的盖数量,对吧?每次转账都是这么多,大家如果不放心的话,这不是十个尾嘛,那我们转的钱多一点,是不是它就会交易这个消耗的S更大一点呢?看一下还是21000。
02:12
那所以看起来我们不管转多少钱,那手续费都是一样的收,不不会像银行那么黑啊,就是什么5%,呃,没有那么高啊,就千分之五什么的收,对吧,他按比例来说,如果按比例的话,我们这个大笔转账,那就那就真的很亏了。呃,那么还有一个就是说,大家看这个是不是永远都是两万一呢,它是不是写死的不是,如果我们要想。加上另外一个参数,大家看我上面其实已经写了,大家可以随便随便给一个什么东西啊,随便敲一串数字。那这个相当于就是运用了我们交易里边的另外一个字段,对data,我们可以随便给data对吧?那这个时候如果把这些data加进去之后,大家看他要消耗的GA大概是多少呢?诶发现这不对啊,这是因为给的这个data塔一定是要大家看得懂,上面这个报的错吗?对,它必须是0X打头的。
03:16
他要16进制的对吧,String,所以我们加一个0X,那后面这个不不能乱打啊呃,HH不行啊,F应该可以,你就打数字吧。然后BC这些应该是可以的啊,我们给一个数,诶大家看一下,21340比21000多了那么一点点。所以大家可以想到就是呃,你如果要是加上1.data的话,那这个就就它的这个执行的盖就会多耗费那么一点,那确实也好理解,你毕竟是多了一点东西嘛,在执行过程当中肯定多消耗一点系统资源,所以你这个在设置gas limit的时候,如果还跟平常一样设置21000,那可能就会就会有点问题了,这就是我们这个呃,SGAS,大家可以用这个API来去给自己发送之前做一个估计啊。
04:16
呃,当然了,就是像mamas这样的工具呢,大家在发送一笔交易之前可以看到它其实是自己就给我们已经估计好了,对吧,之前我们部署合约的时候,好像大家都没没关注这个是不是。大家如果还想查的话,可以查到当时咱们部署合约的时候,那一笔交易到底付了多少GA,那个GA厘米是不是21000。呃,我们现在去查一下吧。怎么查,复制地址就能查啊。呃,我当时如果我没记错的话,应该就是在上,所以。好,我们查一下,就是有几个out好看这个contraction。
05:04
Contract creation。这一笔交易,我们看看它盖limit是多少。GA limit,米是106393,还有零有整,显然不是我们自己设的,所以大家可以看到ma mask里边,其实在这个过程当中,咱们都能想到他到底做了什么。如果我们自己做的话,其实我们也能做出一个类似于mala这样的功能来,我们只需要去调哪个接口。只需要去调这个GA里边的。Estimate gas对吧,我们在这里我们已经设定了这些参数之后,诶,你到底要发多少,然后这个你你吐哪里,然后加什么东西,然后这里我就可以知道。你大概是需要多少盖?所以我们当时没仔细看,但是呢,我们部署的时候,Mama一定是把这个给给我们估计过的,所以我们不用管这些事情,他直接就成功了。
06:10
如果我们不管的话,他还给21000,那当时一定这个是失败的,大家看实际消耗的盖是多少,就是这么多。所以他这个该你要给多准,我们自己给绝对给不了这么准,对吧,所以这也就是说ma当时我们在那个remix上面去部署交易的时候,有时候会看到它提示他说这一笔这个交易很有可能失败。所以大家可以想到remix这里肯定也是有这个SGAS这一步的,对吧,他一检测到你这个可能超出了你这里自己给的那个GA limit是是有问题的,那他肯定就会报一个错,但是他不会给咱们自己给,就是主动的改,所以这个就是没有mad mask那么智能啊,好,这是关于这个SGAS这一部分,好,接下来我们继续看交易。
07:06
那交易前面我们说了它的其他的几个参数,前面我们,呃,最前面这一部分主要就是大幅的大量的篇幅,我们在讲nu啊,因为确实na是我们之前可能了解不多,然后也对它感觉有点陌生的一个东西,但是呢,还有非常的重要,在这里确实还是很重要,所以大家需要去知道,那提到这个浪子我多说一句,就是我之前的一个一个经验分享啊,就是因为我之前不是跟大家说,就是也维护过一个全节点嘛,呃,我们当时候有一些这些交易发送的话,就是我直接就盖客户端,在在那个全节点上,然后写了脚本去去做的,去做这些交易的,那这些交易有一次我就发现一个什么状况。就是正常情况下。这个交易肯定发出去之后都能成功。
08:00
但是那一次我发现发出去之后怎么样都。看不到他这个成功被打包的消息。那我就觉得很奇怪啊,这个这个难道是我交易出错了吗?就是它为什么总是这个攀顶状态呢?现在好像网络也不堵啊,我去检查首先检查该呃在大家想到这个这个迟迟不备打包,大家首先想到的是什么原因?可,可能盖给太少了对吧?对,我也这么想,我第一反应就是,诶,是不是当时这个guess一不小心给给少了,去查发现盖给的并不少。然后我就又想,那是不是我盖没变,但是现在网络太拥堵了呢,去看一看,查一查,1SKY出块还是十几秒一个块,然后再看他当前出块的那些给定的盖。都没什么,都没什么问题,都比我给的那个呃,Price还要小,这个就很费劲了。为什么在这种情况下迟迟得不到交易确认呢?大家觉得能能猜到这个有可能是什么问题吗?
09:06
啊呃,对,这个可能比较难猜啊呃,我可以告诉大家,就是就是跟我们今天讲的那有关的是为什么呢?是我们当时布的那个全全节点,有一段时间网络不太好。大家知道全节点部署完了,完成之后,他是下了所有整个区块链上所有的这个区块数据,对吧,然后去一笔一笔验证交易,然后去就是完成所有的状态同步,他同步上现在的所有的这个区块状态之后。我们的理财宝的区块链还在不停的增长啊,所以他需要不停的再去追现在的状态,对吧,就是你那边找一个块,他就得去不停的同步新的块,有一段时间呢,这个网络给非常的糟糕,所以有一段时间我去查他的那个dilo,有一段时间就完全没有同步这个区块。
10:03
导致后来我发币的这个阶段,就是要要做交易的这个阶段,他的对区块还没有完全赶上我们主网的那个状态。而在这个过程当中,我要发币的那个,就是发起交易的那个账户,在别的一些客户端上发了做了交易。所以大家可以想到,那在别的地方做了交易的话,那那个nuce是不是就往后又涨了,但是我这边我还没有同步到它增长浪的那些那些数据,我以为他的还在以前呢。所以我照这个去发,那肯定就会有问题。然后就是如果说我们把这个就是我我那边那个那个脚本里面设置的是假如说发不出去的话,就把那个nu增大再去发,但是我那个就是自己写的出了点问题,因为从来没有遇到过这种情况,Nu增大的那个对出了出了一点问题,结果大的过了。
11:06
就是不是不是那个就是因为因为这这个不好估计嘛,你不知道这个到底是什么情况,按道理这种情况你可能是应该一个一个去试比较好一点,然后那个就是自己自己就是直接那么写了一下,结果结果发现就是给的量太大了。给他让大了之后出现的状况就是什么?对所有的交易都在攀顶,都在那里等着了,对就这个就就很尴尬,这个就真的是,就是你会发现他必须要等到把这些档次补齐了之后,他后面这些才才能去同步,所以说分享一个在在工作当中遇到的一个一个小坑,所以以后大家如果要是有机会处理一些这样的事情的话,也也就要考虑到各种各样的状况,也你不能相信就是它的这个状况,状态永远是好的,永远是跟那个网络是同步的,这个很好的一个状态,这些异常情况可能有时候都得考虑到啊,所以这这是一个题外话啊。
12:06
好,接下来我们来看除了NUS之外呢,交易里边还有一些别的东西,呃,首先我们看这个接收者啊,就是这个to,或者有些地方会把这个叫做re receive,或者是就是接收者吧,或者叫receiver,或者怎么样,我们看这个交易的接收者呢,就是to这个字段中指定指定了非常简单,就是一个以太坊地址,地址可以是UUA,可以是一个普通账户,也可以是合约地址。这就是交易的特点吧,由一个普通账户发起,然后他的目标目的地呢,可以是任意的账户,这里注需要注意的,为什么还要单独说这么简单的这这个字段呢?需要注意的就是以太坊是对他没有进一步验证的。也就是说,我们随手写20个字节。
13:01
160位。都被以太坊认为是一个合法地址,所以这个地方大家就要注意了,那假如这个地址写错的话,以太坊是不知道的。就是它依然可以当做一个合法的地址,依然可以生成一个合法的交易,那依然有可能就是被矿工去打包,那打包完了之后,那你的这个就不知道发到哪去了,所以是这个这样的一个状况啊呃,以太坊是不知道这个地址他是不是正确派生出来的地址,他不做这个校验的。呃,另外就是说,假如说我们发错了的话,那会怎么办。呃,我之前也是就就遇到过,听到过就是这样的事情,就是有人这个发币的时候。它那个不去不去那个复制粘贴,或者是复制粘贴的时候,稍微的手一抖,差了那么一点,然后剩下的几位手手输上去补足,然后就给写错了。就是写错一位之后,大家大家可以想象得到啊,写错一位之后,离得那么近的两个地址,那这个就是你去碰撞地址的话,几乎是碰撞不到的嘛,所以说离得那么近的两个地址,可以几乎可以肯定,那就是一个作废的地址,所以冲到那个地址上的以太,那就再也找不回来了。
14:22
因为你去碰他的私钥是,呃,就是穷尽自己所有的算力,一辈子可能也碰不出来,至少我目前状况是这样啊,就以后如果要是计算机发展的特别好,那个呃,出现什么所谓的量子计算机的话,呃,那可能到时候又会有变化,这也是就是有人说区块链的一个风险,就是当然不是说区块链技术的风险啊,就是说现在的加密货币的一个所谓的风险,就是如果遇到这种技术的突飞猛进,硬件技术的突飞猛进,量子计算机或者一些什么奇奇怪怪的这些黑科技出来计算量。大幅的提升,我们以前认为穷尽一生,穷尽世界,所有的计算机可能就是几百年都算不出来的问题,有可能这个量子计算机它可能一天就算出来了,那我们现在所有的一切都都不安全了,就呃,当然就是说从我们做技术的角度来讲,呃,这可能也是好事,技术的进步总是好事,对吧,当然就可能现在的这些币,那就那就都完蛋了,那肯定会有新的币出来,呃,就是用更更加安全的加密算法的避讳出来,所以。
15:32
这就是这样的一些一些话题,那对于这个,呃,验证这个接收人的地址是否有效,如果我们之后自己去做一些真实的D做一些这些项目的话,假如我们有必要想要去验证这个接收人地址是否正确的话,那我们这个一定不要想去放在那个以太坊这边来做。就甚至我们不应该放在合约这一段来做,我们应该是用户界面那一层,就把这件事情做了,就我们校验一下是不是符合我们的地址列表里面的这个用户啊,要不然这个一旦发错的话,那就是找不回来的一个事情。
16:11
这是to这个字段啊,接下来我们来简单说一下value和data,这其实是我的一笔交易里边,呃,除了from to这两个,就是一个发送者,一个接收者之外,平常我们一般有可能盖和盖里笔的都不去手动指定,对吧?大家可以看都用的是在GA里边,我们刚才提交的几笔交易都没有指定GA和GA limit GA price和GA limit,呃,所以那两个都用是系统默认的是。那我们一般要去指定的是什么呢?其实就是value和DATA2个。Value和data卡这两个一般有些文章里面会说它是,它是交易的有效负载,就是所谓的这个paylo啊,就是有效负载。
17:03
在这里呢,这两个东西,那它既然是有效的,它是必须有的东西吗。这里可以说就是他们都不是必须的。那这样就是有四种情况了,一个交易它可以同时有value,也有data,可以只有value没有data,也可以只有。呃,Data没有value还可以,什么都没有。那他们这种这四种不同的状态分别代表什么,意味着什么事情呢?呃,如果是只有value没有data,平常我们用mama转账的时候就是这种类型,对吧?我们只要填一个转几个以态就可以了。这种状态就是1:1态的付款,所以只有value没有data是这种状态,如果是只有data没有value,那会是什么状态呢?那没有value,其实就是value是零对吧?啊,大家其实之前已经遇到过好几次这样的状态了,对,我们部署合约的时候,或者是调用合约函数的时候,我们提那个水龙头的B的时候,Withdraw对吧,那也是调用合约函数的时候,就没有看到这一个要转的value,看到都是零的一态,所以在这种情况下。
18:22
我们没有传value,但是我们传了贝塔。这种情况下一般是合约调用。好,呃呃,我们先把这个四种情况都说完,然后再回去再再验证一下啊呃,另外就是我们除了传这个贝塔,还可以发送以太,就是说合约调用传德塔一般是合约调用吧,所以我们在合约调用的时候还可以设定发多少以太,那这个以太就直接会发到这个合约的地址上,到时候我们就会看到合约它有一个余额。对吧?呃,最后那就是既没有排又没有data,这个东西它没有什么用,只是在浪费guest所,所以一般情况我们不会这么干,但是它是有效的,我们构建一笔这样的交易,矿工不会管这些事情,只要我们设定了足够的GA,矿工一样会打包,那他同样会消耗21000GA。
19:23
所以呃,我们这个都可以试一下啊,我们现在就实际实地来试验一下这几种情况。呃,首先我们还是来做这个转账的这个验证啊。好,这是这就是在我的这个私有网络里面,那这个就更简单一些,好,我们来做一笔转账,呃,转账我们其实纯转账就不用做了吧,大家太熟悉了,对吧,纯转账不做了啊,我们现在想要做一笔,诶大家说如果说这里是一笔纯转账的话,他好像就没有说我们能够加data之类的东西是吧?诶那大家就说这个可以加塔吗?呃,应该是可以加对吧。
20:14
对,所以刚才其实在PPT里面说这个既有value又有data的这个状况的时候,其实我没有列全啊,就这里说的是合约调用的时候,那他是要传data的嘛,那除了传data,还可以同时发仪态,这样的话就是调合约的同时还给合约地址发了仪态,另外一种情况是我们给别人转账的时候还可以加上data。这就是给别人转账的同时还有一句留言,其实就是这样啊,转账可以附加留言嘛,这是很正常的一种状态,好,我们看一下啊,呃,Mama的这个新版我确实还不太熟悉,没有用过,我们看一下吧,找一找它有没有能够设置的地方啊。
21:01
这里好像没有。假如我们就给自己的话,好像也是没有对吧,Maps这个就已经设置成全部都转过去了。韩文,直接next一下吧。好,他直接直接feel,好我这边没有起对吧,大家应该我们先把它取消掉。诶,我这边应该是起着的。大家觉得这个有可能是什么原因?我们得看一下这个刚才失败的这个信息,对。我们看啊,呃,Transaction created with the value of ETH,而这是他这个创建的这个交易。
22:01
但是它的失败的信息这里好像没有显示出来,呃,这里如果是eer sc的话,我们也看不到,诶,那大家觉得这个我们有这个怎么办呢?伊S肯定不会跟踪我们自己的网络,对吧?那我们到哪里去看这个信息呢?哦,啊,对,我们至少是不是还可以,我们自己的盖里边肯定可以看到,对吧?好,我们来看一下E,我们先看一下block number是多少啊。诶,现在是三。所以如果现在是三的话,那说明这个块没有增长,诶大家还记得之前好像我们就是发了几个之后就到三了,对吧,看日志吧。大家看启动之后。好像没有新的东西是吧。对,启动之后没有新的交易出现,所以这个应该就是交易就没有发出来,如果这里收到交易的话,那肯定这里是可以成功的,对吧。
23:04
呃,那这个是为什么呢?呃,这个可能涉及到就是我们没有跟大家说的一些东西啊,就是本身我们这里启动的时候,如果什么都不指定的话,诶,呃,我记得好像昨天我们说过这个是不是昨天我们在试这个连接测试网络的时候好像有过这个是吧,对RPC。好,RBC,然后启动起来,我们看一下现在。我们切换一下网络,有时候这个ma mask它的刷新不是很及时。诶,现在怎么变成零了。
24:03
为什么变成零了?是因为现在我起的是一个div的网络。对吧,对,D的网络跟我们自己的那个撕链,完全就是两两条链,所以在这个里边它就根本就没有ETH。所以啊,这这也是一个一个正常的状态,对吧,好吧,那我们现在暂时就啊,我们是想要看那边的交易的,所以我还是在这里充一个值吧,对,我看记得应该是我先copy一下这个地址啊。我们记得呃,ETH点三的transaction对吧,我们先在这边先建一个交给我们的账户,先转出去钱,然后他再转出来,这么玩一玩试试啊。
25:05
Two。帮你地址copy过去。三还有钱我们多给点吧,好,现在我们看看一下,哎,这边应该又多了一个块,对吧,这个还是很明显就出来了block numbers,现在我们来这边调研一下,诶,果然100个以态都已经过来了哦,这个自己的网络就是爽啊,要多少有多少,好,我们现在就用自己的这一个,嗯,自己的账户,然后我们再去发一笔,除了转账之外,看看能不能发数据。我们就选就选自己吧。然后我们比方说给自己发两个以态啊,这边好像这里只能设guess price和GA limit品,好像不能干别的对吧,我们做一个next,然后再看一下,诶大家可以看到啊,在这里它的这个GA fe这里有一个edit,我们看一下,呃,但是这里好像没有可以客户端,所以那那就是说这一版的这个就是ma MAS,它不支持这个功能了,所以呃,我我之前记得老版的应该是支持,可以直接去加加一条信息的,但这个看起来是不支持,那没关系,我们就先不管它了,那我们这个就直接reject了吧,这个。
26:47
就是不符合我们现在这个测试的预期,那我们不能用ma mask做这样的交易的话,我们还还可以直接在GA里面做这样的交易,对吧,这个倒没关系,好,我们呃,每次都说我那个地址还是有点麻烦啊,我们直接再一个。
27:07
看一下现在的哦,已经有了,好,那我们就往这个com里边转吧,还是Sam的transaction,反正所有的发送交易都是这个方法,对吧,只不过就是里边这个交易的对象题里边我们给什么的问题,我们可以给,呃,先写好from ETH和。TWO13。三个以太。大家想后面可以加什么东西,对,可以加一个data,里边放的是。
28:06
是0X打头的一串16进字十进制字符串,对吧?对,前面其实我干过这样的事情的啊,我随便给一个,只要是数字,这个肯定没问题,呃,包括这个CAD什么的都没问题,这里又出了一个号,所以这个应该肯定确认有了,对吧?好,我们去查询一下这个交易的信息,怎么查询交易呢?Get transaction,我们可以利用这个哈希去查询交易,复制到这里,好,我们看一下这一个。大家可以看到block block number,大家注意看它的input。之前咱们看的那一笔交易里面input的是什么?还记得吗?就是nu对吧,什么东西都没有,就一个头,因为我们没给input,现在大家看到了这个input原来就是我们给的这个data就会放到这里来,所以给的这一串数就会放到这里来。
29:05
所以呃,这件事情有一个很好玩的效果是什么呢?就是有些人可以把这个当成一个。记录一些东西的工具,然后大家有想尝试刚才我们说的这一这一部分内容的,大家就去尝试一下啊。
我来说两句