21026 large

093 孤荷凌寒自学第 179 天区块链 093 天 Dapp048

941xue · 于 发布 · 150 次阅读

孤荷凌寒自学第179天区块链093天Dapp048
【主要内容】
今天继续学习实战,做一个波菜类的猜大小的智能合约。共耗时34分钟。
(此外整理作笔记花费了约44分钟)
详细学习过程见文末学习过程屏幕录像。

【今天正式部署合约成功】
合约部署成功后,进行了完整的测试,我狐狸钱包中的四个地址节点进行了分别的下注,其中节点一是部署合约的节点,猜小(0.1ether);节点二猜大(0.15ether),节点三猜大(0.12ether),节点四猜小(0.1ether)。
总参猜金额为:
0: uint256: 470000000000000000 wei
猜大猜小的参与金额分别 为:
(大)
0: uint256: 250000000000000000 wei
(小)
1: uint256: 220000000000000000 wei
开奖也非常成功,随机数为5,猜大的节点二和节点三获胜。
然而出现了问题——
赢的节点二和节点三,在开奖后,没有收到奖金!
根据开奖记录:

0: uint256: 1571559305 (时间戳)
1: uint256: 5
2: uint256: 186

可以看出,赔率为186%,如果这样计算,节点二下注的0.15ether应当收到远大于0.15ether的奖金,却什么也没有收到。节点三也一样。
不过,合约赢利部分,在合约中用变量yingli记录的金额:>0.004ether(合约中没有获取这一准确值的函数),赢利部分由部署合约的节点,节点一成功取回。

【分析为什么合约在开奖时为什么没有将奖金成功返回给赢方节点】

            if (isda==true){
                //猜大的一方赢了
                for(i = 0; i < addbig.length; i ++){
                    v = bigmap[addbig[i]]; //取出下注猜大的所有节点(当前i这个节点)的实际下注金额。
                    jj = intallvalue * (v / intwinpartvalue); //当前节点实际应得奖金
                    addbig[i].transfer(jj); //发放奖金
                }
            }
            if (isda==false){
                //猜小的一方赢了
                for(i = 0; i < addsmall.length; i ++){
                    v = smallmap[addsmall[i]]; //取出下注猜大的所有节点(当前i这个节点)的实际下注金额。
                    jj = intallvalue * (v / intwinpartvalue); //当前节点实际应得奖金
                    addsmall[i].transfer(jj); //发放奖金
                }
            }

用于参照的原智能合约中的源代码是这样写的:

//c、按比例派发奖金
        for (i = 0; i < addressBig.length; i ++) {
            address k = addressBig[i];
            b = bigMap[k];
            uint jj =  all * b / winAll;
            delete bigMap[k];
            if (big) {
                require (k.send(jj));
            }
        }

        for (i = 0; i < addressSmall.length; i ++) {
            k = addressSmall[i];
            b = smallMap[k];
            jj = all * b / winAll;
            delete smallMap[k];
            if (!big) {
                require (k.send(jj));
            }
        }

于是首先怀疑,是不是使用的发送代币的方法不同——
send()方法与transfer()方法的区别,需要进一步学习。

github: https://github.com/lhghroom/Self-learning-blockchain-from-scratch
原文地址:https://www.941xue.com/content.aspx?id=1557

【欢迎大家加入[就是要学]社群】
如今,这个世界的变化与科技的发展就像一个机器猛兽,它跑得越来越快,跑得越来越快,在我们身后追赶着我们。
很多人很早就放弃了成长,也就放弃了继续奔跑,多数人保持终身不变的样子,原地不动,成为那猛兽的肚中餐——当然那也不错,在猛兽的逼迫下,机械的重复着自我感觉还良好地稳定工作与生活——而且多半感觉不到这有什么不正常的地方,因为在猛兽肚子里的是大多数人,就好像大多数人都在一个大坑里,也就感觉不出来这是一个大坑了,反而坑外的世界显得有些不大正常。
为什么我们不要做坑里的大多数人?
因为真正的人生,应当有百万种可能 ;因为真正的一生可以有好多辈子组成,每一辈子都可以做自己喜欢的事情;因为真正的人生,应当有无数种可以选择的权利,而不是总觉得自己别无选择。因为我们要成为一九法则中为数不多的那个一;因为我们要成为自己人生的导演而不是被迫成为别人安排的戏目中的演员。
【请注意】
就是要学社群并不会告诉你怎样一夜暴富!也不会告诉你怎样不经努力就实现梦想!
【请注意】
就是要学社群并没有任何可以应付未来一切变化的独门绝技,也没有值得吹嘘的所谓价值连城的成功学方法论!
【请注意】
社群只会互相帮助,让每个人都看清自己在哪儿,自己是怎样的,重新看见心中的梦想,唤醒各自内心中的那个英雄,然后勇往直前,成为自己想要成为的样子!
期待与你并肩奔赴未来!
www.941xue.com
QQ群:646854445 (【就是要学】终身成长)

【同步语音笔记】
https://www.ximalaya.com/keji/19103006/349764205

【学习过程屏幕录屏】
没有发布成功,被B站拒绝了。

  • 暂无回复。