00:00
我们接下来要考虑的就是大家会想到,就是所有拍卖结束之后呢,那这个拍卖。赢得拍卖的人就诞生了,赢赢家诞生,那么接下来大家会想到我们正常的拍卖过程,卖家就应该发货了,对吧,这是一个线下的过程,我们这个控制不了啊,这个肯定就跟淘宝啊,或者怎么怎么这这些是一样的,对吧,你就直接发货就完了,然后买家应该要付钱。大家就会想到,那我们的流程是什么呢?就是卖家一发货,他认为自己一发货了之后,就在我们的合约里边,能把那个钱提出来吗?这个好像有点问题对吧,那首先你就说怎么样保证这个卖家他是如约能交付货物呢?你如果是说卖家我说我已经发货了啊,我现在就可以直接从合约里面提钱了,那他就会想到能提出钱来之后,我还管发不发货呢,那那肯定我直接提出钱来,直接就拿钱跑步了,对吧?所以这肯定是需要去做限制的一个地方。另外就是说,如果。
01:07
卖家这边,那大家知道卖家有可能拿钱跑路,那同样卖家假如他真正的去发货了,那假如买家这边他就说我不承认发货,我就不把钱打给你,对吧?大家可能想到前面我们那个要求是说卖家。只要卖家一发货,卖家就有资格从合约里面提钱,这种模式肯定不行,卖家直接提钱这种模式肯定不行,那大家就可能想到,那是不是说我们可以把这个发送就是提前的这个合约的这个函数交给买买家来处理呢?对,买家去点对吧,买家去点发起一笔交易,说我同意把这个钱转给卖家,那大家就又会想到了,卖家明明已经我已经把钱,呃,把这个货物已经发出去了。然后买家收到货了,他就不点,他就说我没收到,我这个钱就不给你。
02:01
那如果说我们这个权利全在买家手里边,他点才能把这个钱转给卖家的话,那这个就没有办法去约束买家了,对吧?所以大家就会想到,呃,就是首先我们要约束卖家,另外还得约束买家,那发送前提货提这个里边对应的以太的这个数量。这个。权利是不是既不能单独的给到卖家,也不能单独给到买家,对吧?啊,所以这就是我们基本的一个想法,另外还有一个一种情况是什么呢?就是假如说发货确实发了,但是这个货就有问题。对吧,货物损坏了,或者说一看这个东西就是坏的,明明显就跟产品描述不符,那这个时候可能就得有一个仲裁机构了,对吧,我们要判定你这个就得退款,这个时候退款,如果卖家拒绝怎么办?那大家就会想到我们是不是还应该有一个第三方机构去做一个仲裁啊,所以我们这里边。
03:01
大家就会想到我们的解决方式是什么呢?就类似于我们现实当中,像淘宝啊,或者京东啊,他们肯定也会有类似的一个仲裁机构,对吧,就是官方的平台去做仲裁,那我们在这里呢,就会去创建一个多重签名托管的一个合约,那里边会去有哪几个人去参与呢?就会有一有买方,有卖方,另外我们再引入一个任意的第三方的参与者。啊,所以这当然这里边是做了一个简化,就是我们任意的另外的一个人,不是买家,不是卖家的一个人都可以作为我们这里边的第三方托管人监或者说监管人,对吧,都可以参参与进去,但这个过程当中大家会想到,呃,如果说我们具体做这个应用的话,那第三方可能更多的应该就是平台去做,对吧?啊,我们自己可能作为一个平台及时的去把这个合约去去监管起来,然后我们把这个钱,大家就会想到,我们是不是就应该把这个合约里边对应的那个拍卖成功的那个钱数就要。
04:11
转移到这个托管账户里面来啊,托管的合约里面来啊,所以大家会发现我们想要去创建的这个,这里叫做mart s ascecq ascec是托管的意思,对吧?那Mar t s是什么意思呢?那就是多重签名对不对?所以这个就相当于是我们创建了一个合约,这个合约里边它有一个多重签名地址,多重签名钱包的一个功能,它里边的钱在什么情况下可以释放出来呢?只有在我们三个人里边的两个以上都同意的情况下才可以释放出来。啊,那当然了,它的释放的模式,我们就在可以在合约里边去具体定义了,对吧,可以释放给卖家,也可以释放给买家,那具体的这个过程我们怎么样实现呢?我们具体来看一下这个合约啊好,那么大家可以看到整个这个合约代码就在这里了,这个合约代码里边我们先大概的扫一眼啊,看看这个合约代码做了什么事情。
05:17
首先我们定义这么一个这个SQ这个合约,我们首先要定义一个合约,大家现在现在回顾一下啊,我们一上来是不是先要想这个数据结构,我们先要想在这个合约里面我们要存什么东西,那这样一个托管合约我们是不是首先得存。买家、卖家,托管人对不对?这三个参与人是一定要存在里面一定要有这样一个信息的,所以大家会看到这里有三个地址类型,对吧,Fireer ser abi,那接下来大家会想到,首先呃,就是我们既然是托管,那你托管的这个到底是谁?就是这个合约对应的是哪个产品,是哪个竞拍,那这个东西我们应该是要存下的,对吧?所以大家会看到这里有一个product ID,然后呢,还应该有金额对不对。
06:08
那你这个竞拍的金额到底是多少,我托管的这个金额到底是多少,会写在这里,然后呢,大家下面会看到这里有一个标志位了,就是我是否把这个资金已经释放了,对吧?那接下来大家会看到有两个mapping,这个mapping是一个dress类型到布尔型的一个mapping。这是在干什么呢?大家看它的定义叫做release amount,那release amount,也就是说它其实是说要释放这个资金对吧?那释放这个资金,那对应的下面还有一个mapping,它叫refund amount,也就是这个要回款退回这个资金,那大家应该想到前面的release就是释放给卖家对吧,真正的付款,那最后的refund,那就是退款退回给买家。所以大家会想到这个mapping address到布尔,是不是就是表示那布尔类型肯定是true或者false,是不是就是表示我们这里的address是否同意释放?
07:08
到卖家是否同意释放给买家,回退给买家对不对,所以就是我们这里相当于是一个简单的投票对吧,大家会发现这样一个多重签名托管的合约,它其实可以说是一个多重签名地址,也可以说它是一个简单的投票合约,对吧?所以这个在这个合约里面大家会发现实现的。方法实现的模式非常非常的多样化,大家想怎么做都可以,这就是图灵完备的这个系统里边可以做的事情非常的多,那另外大家会发现我们这里还记录了一个UN类型的叫release count和refund count的一个数,这是为什么呢?因为大家记得我们在mapping里边没有办法去把它遍历出来,对吧?所以说即使是我们里边只有三个,但是这个address是完全就是直接就是哈希出去的这样的一个在很大空间里面哈希出去,我们想要去便利,这个是不可能的一件事情,所以我们还要定义一个计数器,对吧?记录一下当前有几个人同意释放,那同样我们要回款的话,也是记录一下有几个人同意。
08:16
另外大家会看到我们这里还定义了几个事件,对不对,那这个事件就是我们创建这一个托管合约的时候,发射一个事件,然后呢,我们要解锁账户的时候。发送发发起一个事件,这个这个解锁账户是什么意思,其实就是说我这里有人想要去释放它的时候,会去解锁一下,对吧?另外还有就是说我真正释放的时候,把这个就是disperse amount,就是真正的把它释放掉的时候。我们触发一个事件,这里是基本的这个数据结构定义好,那接下来大家会想到,首先我这里边会有一个construct创建的时候,这个合约创建,那会带很多很多参数进来,对吧?大家会想到至少你这些参数都应该是创初始化的时候,创建的时候就应该传进去的,那等一下具体实现的时候时候我们再来看啊,然后大家会想到我们是不是应该有一个release的一个。
09:12
一个函数,还有一个refund To Buy的一个函数对吧,那就是一个是把它释放金额给卖家。付款,还有一个是呃,对释放金额给买家退款对吧,回款好,那么那另外就是我们还可以查这个基本信息对不对,如果我们要查不到当前的这些信息的话,那肯定也不成,所以这是一个get view类型的一个函数,对吧?好,那么接下来我们就把这个这个合约,其实这么一梳理的话,大家发现还还挺简单的对吧?好,那接下来我们就来敲一下吧。好,接下来我们在代码里边去敲一下,我们在contracts下边,现在我们又要添加合约了,对吧?我们创建一个new,这个合约我们就跟这里边的定义一样,叫做as pro.solidliity那这个as pro是什么意思呢?其实就是托管的意思,对吧?好,那么大家好久没有写合约了,对吧?Pragma solidity,大家熟悉一下合约的写法。
10:15
呃,我们这里还是给一个,大家随便给一个吧,就是4.1几的这个版本都没问题对吧?呃,大家现在尽量我们写的还不要直接写5.0 5.0的话还是会有一些特殊的要求,会更严格对吧?对编译器的要求更严格,呃,当然大家可以熟悉一下5.0的一些写法,因为大家会发现我们现在4.1级,4.2级版本放warning的很多地方在5.0里面直接就是error,所以这也就是为什么我们平常在写的时候都跟大家说,就是遇到warning我们都处理一下,尽量是最后发现是没有error,没有warning,这样才比较合合适,就是我们这里如果把war都处理掉的话,到5.0去迁移过去的时候就会比较舒服,要不然的话,到时候很多习惯大家都得改。
11:07
比如说构造函数,你如果习惯是还是用就是function,比方说我们这里先定义contract,对吧,Contract as pro。好,那接下来我们定义这样一个合约,大家如果还是就是写写,写这个构造函数的时候,还是习惯function as pro这样去写的话,大家就会发现什么写错了,拼错了。大家就会发现到5.0的时候,这个方法就被废弃了,对吧,大家一定还是尽量要不要这样去写构造函数,还是去写成constructor啊,所以这是就是给大家确定一下,大家还是养成一个好的习惯,我们尽量用更新的这种方式去构造自己的合约,好,那接下来我们就把刚才说过的那些。数据类型,我们的状态变量都定义出来,首先大家记得我们第一个状态变量应该是一个什么?应该是一个public类型的product ID,对吧?首先我们应该有一个product ID,然后呢,会想到我们肯定就是三个参与人,这个肯定都要进来,对吧,Address类型public。
12:21
呃,首先我们应该有一个seller,然后address类型public应该有一个buyer address public,另外还应该有一个叫做阿BI,就是我们所谓的这个仲裁者,对吧,第三方仲裁人。好,接下来除了基本的这些信息之外,还有产品对应的信息,呃,就是相当于我们竞拍最后对应的信息,对吧?我们应该有一个竞拍的金额放在里边,那这个应该有也是public,呃,这个我们就叫amount吧,好,这是我们的基本信息。
13:01
然后除了这些基本信息之外呢,那就应该表示我们当前托管合约里边的状态了,对吧?大家会想到首先呃,我们的那个状态里边定义了两个mapping对不对?表示有哪些人要去释放这个资金,对吧?好,我们定义一个mapping,大家会想到这个mapping是一个什么呢?是一个address到布尔类型的一个mapping,对吧。呃,那大家会想,就是我们有哪个人想要去把它释放的时候,我们就在这个mapping里面记忆笔对吧?这个默认都应该是false,那如果他要去释放的时候,把它对应的那个地址对应的那个值改成true就完了,那首先我们应该定义释放资金对吧,Release amount,那这个release就是相当于是To Buy对吧?我们这里简单写就跟那个呃,课件里面写的一样就好了。然后大家还记得我们同样还有一个mapping要去,同样还是address到。
14:07
布尔类型对吧,我们。可以要求把这个金额释放给卖家,还可以要求把它退回给买家,对不对,所以我们定义的这个叫refund amount,这个就是释放给买家的一个操作,呃,那另外我们当时跟大家说了,就是在这个mapping里边,我们没有办法去便利。所以最后什么时候,这只是记录了谁同意给他释放,谁同意给他回款,对吧?那这相当于是个投票,那最后的这个结果我们怎么去处理呢?还得定一个计数器对不对?所以我们在定义一个U类型的public,叫做release count。这就相当于是我们记录一下当前多少人同意释放资金,那如果三个人里边达到了大于等于二的时候,我们是不是直接就可以释放资金了,对,所以其实大家能想到之后我们怎么样去实现啊。
15:07
好,那接下来这边也一样有一个refund count,对吧。呃,另外最后大家再注意一下,我们还应该有一个状态变量定义我们当前的这个资金是不是已经放出去了,对吧?那就是说不管是你退回给呃,退回给买家还是释放给卖家,都应该整个我们这个资金就已经转出去了,那这个合约托管合约相当于就完结了,对不对,就相当于它的状态就处于一个无效的状态了,所以我们定义一个布尔类型的一个变量public。这个叫做,我们看一下叫什么名字。好,这个叫做放子dispersed,也就是说释放掉了对吧,放子dispersed。Disper。那么我们定义了基本数据类型之后,接下来我们就可以处理我们的这个具体的函数操作了,呃,那最基本的函数就应该是一个constructor对吧?好,我们先定义一个constructor,这个constructor大家会想到它里边的函数其实是比较多的,对不对?大家首先想一下这个constructor里边我们要传入什么东西呢?
16:27
上边的这些东西是不是全部都要传入啊,对吧?产品的ID,我们的三三个参与人,还有对应的金额啊,所以大家会想到我们首先应该有一个U的product ID,这个我们就带下滑链下划线,这样以是跟这个状态变量的区分,对吧,Product ID。然后我们应该有一个address类型的这个seller,对吧,然后类型buyer。呃,然后还有类型的。
17:05
A,大家注意,前面我们忘记把这个下划线加上了,最好不要临时变量跟这个函数参数,最好不要跟我们的状态变量重名,对吧?啊,这种东西都是有可能有坑的一些东西,哎,另外大家注意啊,我们这里边。大家说我们是不是还缺一个amount,我们是不是应该把这个amount传过来,大家想一下,我们这里要不要?大家注意这个amount是我们直接这个数字传进来的吗?传进来多少就是多少嘛,这个是我们在这个托管合约里边要去保存的那个以太的数量,对不对。那这个数量是不是我应该是实打实,你真金白银应该给我转过来呀,转过来我才应该记录对吧?对,你要是不转的话,我就不应该给你记录进去,所以是不是我们在这个里边定义一个。
18:03
呃,我们在就是进来的时候拿那个messger value把它存进来,给到这个Mo就可以了,那如果说我们的构造函数要能接收messages value的话,是不是必须得是一个payable的函数啊,对,所以我们在这里加一个payable对吧?Payable,好,这是我们的constructor,好,那接下来我们就是数值了,对吧?呃,Product ID等于product ID。然后我们的这个cell等于。Seller buyer这里又忘记写了,等于下划线的buyer。Abi等于下划线abi,好,那么最后一个大家注意,这个amount就应该等于message.value对,我们直接就应该带着这个以态传进来,对吧?好,那最后大家注意一下,我们是不是还有一些东西可以做啊。
19:16
是不是这里边的这个放dispersed,这个是应该一开始整个合约的状态变量,这个也是初始化,应该是给一个false对吧,一开始他是没有释放的,所以我们放。Disper等于false,好好,那这个大家就可以看到我们的这一个构造函数就已经完成了啊,那大家可能会发现我们在这个函数里边还就是给了一个这个合约的这个这个事件的释放,对吧?啊,那大家如果要记得的话,我们也把这个事件来写一下啊,这里边上面有三个事件对吧。所以大家注意,这个过程其实就是我们先定义它的基本的数据结构,然后之后就是我们需要的事件也应该要定义在里面,对不对,所以这个事件的定义来回顾一下event,那首先我们是不是创建的时候是有一个定义的?
20:16
呃,这个as pro create as pro对吧,那这个时候我们要什么参数呢?是不是这些关键的信息都应该传进来啊,Product ID对吧,Address。Address buyer,然后address。A,这就是类似的一些东西对吧?呃,当然了,还有一个you amount,这是不是都是应该我们传进来的关键信息啊,当然这个东西大家如果要是这个呃,Amount不想去传的话,也可以不传,对吧?因为这个在交易里边这个me value都已经记录进来了,对吧?
21:05
这个如果我们这里边写了的话呢,大家就把它传出来好,那么这里定义了这个事件,那我们是不是在这个真正创建的时候,就应该把这个事件就是触发出来,对吧,发射出来,所以大家还记得我们的那个写法啊。Imit create ec。里边我们就要把该传的信息都传进去,对吧,Product ID。Cor。Fire。呃,然后还有什么阿比特对吧。然后还有amount,好啊,当然这个大家可以传我们现在的状态变量,也可以传我们当前的这个局部变量,对吧?这个函数参数直接传过去也是可以的,这个amount没有啊,我们直接传这个amount就完了,对吧?好,这是我们当前的这个构造函数,那有了构造函数之后呢,大家会想到我们还有两个关键的。
22:15
呃,函数是什么呢?就是一个是释放资金,一个是回回款,对吧,就是我们前面不是定义了两个这个mapping吗?那肯定就要有这样的操作,我发起一个交易,我表示要一个人,我发起一个交易,我表示我要给这个卖家去释放资金,或者说我要表示同意给买家去回款,那这里就是三个人都可以做这个操作,对吧,大家都是公平的,好,那么我们这里就定义一个方式。首先我们这个function叫做,呃,比方说我们这个release,跟这个release amount相关的那个,我们就叫release amount。
23:02
To sell吧,所以这就是我们要释放资金到给卖家对吧,这就是我们要把这个钱打给卖家的这个同意的这个过程,所以大家注意这里边我们是不是应该要知道这是谁调用的这个函数,对吧。那这个人必须得是我们的BI尔塞这个阿BI特里边的一个人,对吧?啊,这里大家注意一下啊,我们这里本来大家可能想我们是不是这个me s就应该是这个。调用的那个人对不对?好,我们先暂时先可以先这么想啊,大家认为我们直接就用这个me center好,那么这应该是一个public类型,对吧。好,那接下来我们会想到这肯定就是这种函数,肯定一上来我们先得require对吧,先去判定一下,那首先我们要判定什么呢?是不是首先应该我们当前的这个标志位不能有问题对吧?放dispersed这个我们应该它必须是呃这个false才可以,所所以我们一定要require非它所以是要求它是false对吧,那如果说这个这个。
24:20
有就是没有,已经它是变成处了,说明它已经释放了,对不对?我们就直接说fund should be should not be dispersed。好好,那么接下来大家应该还会想到,我们是不是还应该有一些判断啊,我们还应该要求这个message点三是不是它应该等于。等于我们当前的S或者message.send等于fire就必须是三个人里面的一个,对吧?
25:09
Message点三的等于abi,好,我们要求它必须是这样的一个表达,把括起来啊,因为这个表达式有点大了。好,如果说不满足的话,我们给一个信息就叫呃,Color should be。Seller or buyer or。阿比特对吧。A。好。那我们已经满足这些要求之后,那么大家注意我们还应该有什么样的要求呢?
26:01
我们是不是还应该要求一个,就是大家注意,就是我当前有可能我这个假如说我确实是一个sell。然后我现在要求你给我付款对吧,然后我就提这样一笔交易,我就会在我们这个里边记上一笔对吧,我就把我那个治处了,那假如说我已经治了的话,是不是就不应该再去做处理了呢?对吧?所以这里大家注意,那我们这个是不是必须要require啊。但require其实是表示我们一定要满足这个条件,不满足的话,我们就相当于是revert了,对吧?但事实上这个地方我即使是塞的话,我我是不是其实也可以再重新提一下,重新提一下,只不过我发现这里我已经给了数值后,是不是就不应该操作了。但是我提起来之后,可以要求,假如说我们那个已经达到两个人没有回款的话,是不是我后面应该判断一下,如果是两个人的话,就应该真正给我发出来。
27:06
所以大家注意这里我们可以在这里用if就可以了,不需要去require了,对吧?那我们怎么样if呢?If,呃,大家就会想到我们前面不是定义了一个release吗?Release amount这样的一个mapping对吧,它对应的这个message sender,如果说好,那大家会想到本身它应该是false对不对,那如果说。他要现在已经变成了处的话,那代表什么意思呢?是不是就代表已经释放掉了,对吧?所以我们现在要做的其实是要求它一定是false对不对?所以只有在它是false的时候,我们才去会做下面的处理,如果是处的话,我们这一段就不管它了,好,那么我们判断一下,如果他是false,说明他之前没有提交过这个这个请求,对吧?那我们现在是不是就要把这个指出了,所以release amount message.send这个就等于处,对吧,把它是处。
28:26
然后我们还应该做什么操作呢。我们记得这个mapping,我们没办法去遍历,我们还记了一个计数器,对不对,所以我们一旦有新的把它制出的这一个数据来了,是不是应该加一啊,所以这也就是为什么我们一定得保证它没有做过这个质true的操,不是true对吧,你万一如果是true的话,再付一次是true没关系,但是后面这个加一就有问题了,对吧?所以我们这里边要去给这个release count,对。
29:00
加等于一对吧,计数器加一,诶,这里这个变成了全角,好,那么在这里大家就会发现我们是不是就已经做完了这个操作,就相当于我已经同意给他加一了,不管是ser他自己还是be尔和阿bier都可以做这个操作,对吧?来了之后就把对应的这个mapping里边质处,然后加一。那大家会想到我们是不是接下来还应该做一个事情,就是判断一下它是不是已经达到了二,啊对,已经达到二,我们是不是就直接在这个里边就应该出发,他去转钱了,对吧,所以大家会想到我们这里就把整个他提交这个请求和判定。最后发转币转到对应的那个人手里边,这个逻辑都放在一起了,那么接下来我们就判定一下if是不是这个release amount啊,拼错了啊,Release count啊,不是amount release count,如果要已经等于二,或者大家可以写大于等于二对吧?等于二应该就可以了,对不对?因为大家会发现我们每一次它改变这个count的时候,我们都来去判断,所以它一定是先等于二之后就转走了,对吧?所以大家可以看到我们课件里面应该写的是等于二啊,这个大家如果要写大于等于二也是一样的,如果大于等于二的话,那么我们就会去把这个钱转给。
30:31
转给谁?应该转给谁?对,应该转给转给买家吗?嗯,大家想一下,我们是release amount to sell对不对?这个数组里边表示的是要把这个钱要转给卖家,对吧?Seller,所以我们怎么转钱呢?合约里边怎么转钱呢?是不是sell transfer啊,对,这个不是说他要转钱,而是给他转钱的意思,那transfer转多少呢?
31:03
是不是就是amount,对这个非常简单对吧,我们都已经定义好了,所以说这个就没有任何的问题,那转完了之后,记得我们要把前边的状态变量是不是要给它改变一下了。所以把房子dispers的给给成处,所以下次已经转完了之后再来,是不是第一个我们就直接就require这个就把它回退了,对吧,就直接就不能再去做操作了,就全部都会阻塞好,那么这样我们的合约就已经完成了,那大家如果这个对比我们这里边的这个课件的话,大家会发现。啊,我们这里还少一些东西,就是还少这个事件触发对不对,因为我们想到是不是这里边的这一个东西,我们是很重要的事件,我们是不是也应该去监听这样的事件啊,所以我们继续定义两个事件在这里啊,除了这个创建托管合约是合约之外,我们要从里边转钱的这个过程也是很重要的,所以说我们定义这样的两个event,一个叫做。
32:12
比方说我们就跟课件里边叫一样,课件里面应该叫unlock amount,对吧,它是一个什么动作呢?就是说我们看到在释放的过程当中,我们是分了两步的,一步是就是这个人对应的那个,就是表示想要给他释放对不对,所以这里我们叫做解锁这个账户,某一个人去解锁这个账户的动作,然后另外是真正已经达到了2/3的同意。我们真正释放这个钱的过程,那我们到时候叫做释放这个资金的过程,对吧?所以我们定义两个事件,一个叫做unlock amount,那里边这个就会大家会想到product ID对吧?这个肯定是要有的,然后我们是不是会定义一个,这里边我们是unlock amount的话,是不是我们release to sell也可以,或者是reform To Bear也可以啊,两个人都可以,所以两种情况都可以,所以这个事件里边,我们假如归类成一种事件的话,那我们是不是就要定义一个type了,那这个里边我们不要叫type了,就叫成。
33:20
我们看看这个课件里面叫什么,应该不是叫type对吧。课件里边叫operation,对,那我们就把这个教程它的操作对吧,你是释放给谁,这个还是比较明确的啊,那同样就还会有一个operator对吧,这个应该是一个类型。谁调用的operator operator应该是OR2对吧?那同样对应的还应该有一个释放资金,真正释放资金的一个最关键的这个事件,对吧,Dispere amount,那就同样product ID,然后大家会想到我们这里是不是得有它的这个钱数啊,Amount对吧?然后另外还应该有一个address,就是谁收到了这笔钱对不对。
34:21
谁收到了这笔钱,这个叫receiver吗?我们看一下。哦,他这个叫benefacturary啊,就是谁是受益者对不对?好,我们就跟这个定义的一样,好了,我们也叫benefactur,或者大家叫一个receiver也可以,对吧,谁收到了这笔钱,好,我们把这个定义出来之后,就会发现在这里是不是就可以去调用这个事件了,对吧,就是发射这个事件对吧?It我们定义的是这里是一个onlock,叫什么amount。
35:00
Unlock amount,然后我们要传入的是product ID,对吧?Product ID,然后后边要传入的是一个operation,这个operation我们就可以自己定义了,对不对?来我们这里比方说给一个字符串,这个就叫做release to sell,好,那么最后还有一个是地址,那就是说,呃,我们操作人的这个地址,这里是message sender,对吧?那同样下边这里我们也可以发射一个事件。叫做dispers amount。这个事件里面包含product ID,呃,这就不是一个字符串,对吧?这就是amount当前的数量amount,还有就是我们当前的受益人应该是谁呢?当前的受益人应该是S,对吧?前面。
36:17
我们这里给定的这个cellar transfer,所以这里给一个cell过去,好,大家可以看到这我们就实现了这个release amount to cell这个函数。
我来说两句