zoukankan      html  css  js  c++  java
  • 孤荷凌寒自学python第120天区块链034以太坊的 erc20代币04

    孤荷凌寒自学python第120天区块链034以太坊的 erc20代币04

    【主要内容】

    今天继续使用erc20标准规范按一篇网络博文的教程进行亲自敲打代码来写一个可以发行token的智能合约。学习共用时31分钟。

    (此外整理作笔记花费了约48分钟)

    详细学习过程见文末学习过程屏幕录像。

    【学习笔记】

    一、经过一天的思考和查看资料,现在已经基本理解了approve授权操作与transferFrom

    (一)首先调用合约中的approve()函数的节点应当是指发起授权别的节点可以运用自己节点中代币的节点。因此:

    此函数中:

    allowed[msg.sender][_spender]=_value;

    这一句代码中,之后以[msg.sender]会作为发起授权事务的一方,就是因为调用合约的approve()函数的节点就是来发起授权事务的。

    (二)而调用transferFrom()函数方法的节点却应当是曾经接受过另的节点授权,可以使用别的节点指定金额的代币的节点,因此 :

    此transferFrom函数中:

            if balances[_from]>=_value && allowed[_from][msg.sender]>=_value && _value>0{

    这句代码中的

    allowed[_from][msg.sender]

    msg.sender

    就作为了接受授权的节点,而此时_from才表示之前发起授权操作的节点。

    二、今天继续逐字母敲打书写作为基础的那个智能合约的内容。

    到今天为止【StandardToken.sol】文件已完成:

    ```

    pragma solidity ^0.4.4;

     

    import "Token.sol";

     

    contract StandardToken is Token{

        mapping (address => uint256) balances;

        mapping (address => mapping (address => uint256)) allowed;

        uint256 public totalSupply;

        function transfer(address _to,uint256 _value) returns (bool success){

            //此函数仅用于调用合约的节点(或者理解为创建这个合约的节点?)地址进行代币的发送到_to形参指定的节点地址。

            //可以发送的代币的数量_value这个形参的数值类型是 uint256,可以理解为只能是大于等于零的数,且最大值为2^256-1(为什么要减一呢?因为从0开始)

            //实际上这个形参的数值类型就限定了最大可以发送的代币的数量,最多只允许2^256-1。

            //下一行代码要进行发送方现有代币余额的检查,以确认可以发送这么多的代币。

            if balances[msg.sender]>=_value && _value>0{

                //--如果发送方节点有这么多_value,那么执行代币在两个节点间的转移

                balances[msg.sender]-=_value;

                balances[_to]+=_value;

                //---触发事件----

                Transfer(msg.sender,_to,_value);

                //--返回处理结果----

                return true;

            }else{

                return false;

            }

     

        }

     

        function transferFrom(address _from,address _to,uint256 _value) returns (bool success){

            //此函数形参_from指定的节点地址进行代币的发送到_to形参指定的节点地址。(是否是在进行授权节点(合约的节点?)的代币支配转移?)

            //可以发送的代币的数量_value这个形参的数值类型是 uint256,可以理解为只能是大于等于零的数,且最大值为2^256-1(为什么要减一呢?因为从0开始)

            //实际上这个形参的数值类型就限定了最大可以发送的代币的数量,最多只允许2^256-1。

            //下一行代码要进行发送方现有代币余额的检查,以确认可以发送这么多的代币。

            //同时检查,发送方授权给授权接受方的可支配代币金额是否大于等于_value

            if balances[_from]>=_value && allowed[_from][msg.sender]>=_value && _value>0{

                //allowed[_from][msg.sender]中:

                //_from指的是代币真正的发送方(此节点代币才真正减少),而[msg.sender]指的是_from授权的接受节点(此节点可以动用_from节点限定数量的_value)

                //为什么这儿的授权接受方是[msg.sender]没有完全理解 。

                //--如果发送方节点有这么多_value,那么执行代币在两个节点间的转移

                balances[_from]-=_value; //真正发送代币的节点的代币数量减少

                balances[_to]+=_value; //接收代币的节点代币数量增加

                allowed[_from][msg.sender]-=_value; //授权的可动用的代币数量也减少

                //上一行与后面的approve()函数中的allowed的对象多重列表的表示感觉有点混乱,不好理解,其实原因是:

                //此函数一般由之前接受过某节点(这儿指_from节点)授权的节点来调用,因此此处allowed对象表示接受授权的节点就是【msg.sender】(指当前调用合约的这个节点)

     

                //---触发事件----

                Transfer(_from,_to,_value);

                //--返回处理结果----

                return true;

            }else{

                return false;

            }

     

        }

     

        function balanceOf(address _owner) constant returns (uint256 balance){

            //此合约函数用于外部调用合约时,返回指定节点_owner目前的代币余额。

            return balance[_owner];

        }

     

        function approve(address _spender, uint256 _value) returns (bool success)) {

            //此合约由调用合约的节点(msg.sender)向指定的节点_spender授权,让_spender节点可以调用发起授权的节点指定_value数量的值。

            //调用此合约的这个函数方法的节点,将通过此函数方法发起授权,因此 这儿——调用此合约的节点:msg.sender就是发起授权的一方。

            allowed[msg.sender][_spender]=_value;

            //下面显式引发事件

            Approve(msg.sender,_spender,_value);

            return true;

        }

     

        function allowance(address _owner,address _spender) return (uint256 remaining){

            //此函数供查询指定的一个授权节点_owner与接受授权的节点_spender之间授权内容中,目前还剩余的授权_value是多少。

            return allowed[_owner][_sender];

        }

     

    }

        function balanceOf(address _owner) constant returns (uint256 balance){

            //此合约函数用于外部调用合约时,返回指定节点_owner目前的代币余额。

            return balance[_owner]

        }

     

    }

     

    ```

    三、开始写最终的继承自前两个合约的合约文件

    在最后这个合约文件中,定义了与自己要发行的代币相关的信息,并最终完善了全部需要的接口函数。

    我将自己的代币名称修改为:

    ghlhToken

    于是文件名与合约命名也修改为:

    ghlhToken.sol

    下面是今天已完成的代码:

    ```

    pragma solidity ^0.4.4;

     

    import "StandardToken.sol";

     

    contract ghlhToken is StandardToken {

     

        //下一个函数没有函数命名名称,属于特殊的函数(之前从别的资料中读到过,遗忘了,后续再补充学习)

        //此函数的基本作用是,如果收到了没有指明任何相关信息的代币发送给此合约,就将这些代币扔回去。

        function (){

            throw(); //这个单词的意思就是【扔】

        }

     

        //现在定义合约的建构函数

        function ghlhToken(

           

        ){

     

        }

     

    }

    ```

    【学习后记】

    人作为一种生物,从基因里就写着要不断去探索发现的命令,这也是我们祖先们一路进化至此的历史所证明。从非洲一隅,到遍布整个世界;从陆地到海洋;从地球到太空……无不是对新事物的一种执着追求。作为人的一个个体,其实基因里也从来不会安分于一生只囿于一个角落,一个领域,如果这样,我们的基因代码就将把烦躁与麻木与无聊的情绪加于我我们心灵,使我们变得自觉无趣。

    只有不断向未知的领域去探索,去涉足,我们的基因代码才会感到满足,这样的快乐感,才是基因代码与生俱来最推崇的快乐。

    于是我决定不断去探索全新的领域,我正走在路上,我就正最大的快乐着 ……

    更多的自学感悟,我将与大家在【就是要学】社群交流互动。

    我建立【就是要学】社群的初衷就是将渴望与我一样追求自主独立的生活的朋友 ,特别是还有大把青春可以去试错的年轻朋友聚集到一起,在这个人以类聚的时代,我们在一起, 互相交流,坚持每天成长,欢迎来到【就是要学】社群QQ群:646854445

    或访问:www.941xue.com

    【关于坚持自学的例行说明】

    最后例行说明下,我为什么要坚持自学。

    “如果我不曾见过太阳,我本可以忍受黑暗,然而阳光已使我的荒凉,成为更新的荒凉。”

    ——艾米莉·狄金森

    如果要问我对自己的前半生如何看待时,我想昨天和今天的答案都将完全不同。

    昨天的我,生活在荒凉的满意之中,自觉怡然自得,拿着包身包月的工资,听着仁慈的命令,过着几乎一成不变的生活;时而与周遭的人儿和睦互往,时而唇舌相抵斤斤计较,演出着生活的鸡毛蒜皮,工作的吹拉弹唱;忘我,忘我,才能融入这平和无奇的乐章中,迈着细碎的步伐,原地踏步。那时的我觉得这就是悠然自得的听天由命的平凡人生,也就是我的宿命了。

    可是某一天,我见到了不一样的太阳以及太阳下不一样的人生光景——那并不荒凉。

    今天的我,生活在荒凉的痛苦之中,自觉渴望改变,迈着不知所措的步伐,看着流逝的年华,睁着悔恨错失一切的双眼… …

    我知道我将再无法回到过去的我,只有改变才是唯一正确的方向。

    一、为什么一把年纪还在学习

    放弃很多去聚餐,去HI歌,去游玩,去看电影,去追剧……的时间,然后进行着这个年纪似乎已不应当再进行的学习,引来身边人们无尽的不解与鄙夷甚至可怜……

    但我不想放弃终身学习的誓言。

    因为——

    我对我今天的生活现状并不认同!

    罗伯特清崎告诉过我们,反省自己当下的生活是不是自己想要的,这难道不是最好的动力与答案?

    走过了大半生,然后才发现曾经、当下所正在进行的人生并不是自己想要的,那是一种怎样的体验?

    只有心中真切的感受才能回答这个问题,而任凭再丰富的语言也是无法描绘出来的。

    经历半生的跋涉,却发现走得并不正确,有多少人有勇气承认自己过去的一切都是错误的呢?

    而我愿意告诉过去的我:“你错了!”

    那么已经历半生错误,年岁之大又压于头顶,还有希望从这架的梯子的半端重新爬下,再蹒跚着爬上另一架梯子吗?

    我宁愿相信还有希望!

    这便是我为什么要继续坚持终身学习下去的全部理由。

    二、这个年纪还在学这些技术有意义吗

    纯的技术对这把年纪其实已没有意义。

    但兴趣可以超越意义。

    但技术可以引来思想的变革,这才是意义。

    投资自己的头脑 ,改革自己的思想,这是最保值,更长远的投资,过去我从来没有投资过,错过太多,那就从投资自己头脑开始吧。

    罗伯特清崎告诉我们,真正的富有是时间的富有;真正的自由是可以决定自己愿意做什么的自由。

    因为我愿意做我兴趣所在的事,所以我希望我有自由选择的那一天,虽然今天离那一天可能还是那么遥远,但我愿意相信,每天多赶几步,离希望就更近一步。

    再者,虽然我可能再已无法完全完整的掌握这些技术了,但技术本身却可以启迪心的觉醒,激发灵感,那么只要多了解一点,我相信我将离那个正离我而去跑得越来越快的未来更近一点,不至于被未知的那个未来抛弃得太远。

    于是我怎能放弃追逐求索的步伐?

    我要坚信:感觉太迟的时候,也许还不算太迟。

    感谢一直以来关注我,鼓励我的你!

    若不嫌弃这一个到了高龄才长大的可笑可叹的我,请不吝赐教。

    我的q号是:578652607,敬候你的指点。

    【同步语音笔记】

    https://www.ximalaya.com/keji/19103006/269075784

    【学习过程屏幕录屏】

    链接:https://pan.baidu.com/s/14uw6gNrVoeJEv1qNBEXYag

    提取码:lhct

    欢迎大家添加我为好友: QQ: 578652607
  • 相关阅读:
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    2013551822第一次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/lhghroom/p/12507037.html
Copyright © 2011-2022 走看看