专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

NO6。一文聊透Solidity语法助你成为智能合约专家

  互联网的技术日新月异,互联网不断深入人们的生活;
  web3。0将是彻底改变人们生活的互联网形式;
  web3。0使所有网上公民不再受到现有资源积累的限制;
  具有更加平等地获得财富和声誉的机会。
  web3。0会从哪里开始呢?
  本合集文章,授权转载,侵权必究。
  Web3。0世界系列文章
  来源:代码与野兽
  【Web3系列文章】
  NO。1遇见Web3:在Web3的世界中写下第一行HelloWorld
  NO。2全面系统的Web3学习路线,助你成为Web3开发专家
  NO。3Web3世界:区块链、比特币、以太坊和智能合约
  NO。4RemixIDE使用与VSCode搭建Solidity开发环境
  NO。5深入聊聊Web3世界中的协议和硬盘:IPFS
  关于区块链和智能合约开发者的区别解释
  我发现很多人都表述不清楚区块链和智能合约。我认识几位程序员朋友,他们都自称是在做区块链开发,但实际上是在做智能合约的开发。大多数外行分不清楚区块链和智能合约我能理解,但是很多从事智能合约开发的程序员竟然也分不清楚,我不知道是不是表述问题还是理解问题。
  区块链是区块链,智能合约是智能合约,两者的关系就像是微信和微信小程序一样,一个是App开发,一个是小程序开发,根本不一样,不能混为一谈。
  据我了解,区块链的需求没那么多,特别是中国这个环境下。大多数区块链相关的程序员都是在做智能合约开发,而不是真的在开发区块链。
  区块链是可以用很多后端语言去开发的,比如用Go、Node。js、Rust、Java等。
  但是智能合约不可以随便选择编程语言,我这里讲的智能合约是指以太坊智能合约。目前它只能选择Solidity、Vyper、YUL、YUL和Fe这5种语言。其中solidity最受欢迎,大多数项目和开发者都是选择了solidity。我们几乎可以说solidity是智能合约的首选编程语言。
  这篇文章会讲什么?
  这篇文章将会介绍我认为使用Solidity编写智能合约时90以上的场景中能够用到的语法和特性。
  但是Solidity是一门完整的编程语言,想要把它彻底学明白,一篇文章肯定是不够的。因为很多语言都被写成了一厚厚地本书。不过通常写编程语言的书都会非常全体、体系化地介绍语言的全部,包括那些平时压根用不到的知识,或者一些已经落伍,语言设计上糟粕的部分。总体来说,通过一本厚厚的书来讲一门编程语言,多少是从研究的角度出发的,如果你只想快速用Solidity开发智能合约,不想把这门语言研究的这么透彻,那么本文很适合你。
  同时本文会拿solidity和一些面向对象的语言做对比,如果你完全不懂其他编程语言,那么本文不适合你。面向合约
  Solidity的设计理念和面向对象编程语言很相似,不过Solidity是面相合约的编程语言,如果你有面向对象编程语言的开发经验,那么学习Solidity就没有那么难。
  Solidity语言被设计为编写合约的语言,目前来说也只能写合约,所以它不像其他语言那样可以做很多事情。合约构成解读
  我们先来看一个最简单的合约构成,做一个整体的感受。SPDXLicenseIdentifier:MITpragmasolidity0。8。0;contractHelloWorld{addressprivateowner;unitpublicstate;modifieronlyOwner(){require(msg。senderowner,onlyowner);;}eventStateChanged(unitstate);constructor()public{ownermsg。sender;}functionsetState(uintstate)externalonlyOwner{statestate;emitStateChanged(state)}}
  我简单解释下这个合约的代码,不会详细介绍。
  第1行是指定版本许可。
  第2行是指定使用的语言版本。
  第4行是声明一个名为HelloWorld的合约。
  第56行是状态变量,它们会永久存储在合约中。
  第811行是函数修改器,它可以用在函数修饰符上,可以改变函数的行为。
  第13行是声明一个事件,事件可以被触发和监听。
  第1517行是构造函数,在部署时会被调用。
  第1922行是声明了一个名为setState的函数。版本
  solidity有很多种版本,目前最新的版本是8。x。
  但是在早期比较流行的是5。x、6。x这两个版本。
  solidity的版本命名规范采用。
  和其他大多数编程语言不同的是,solidity的版本是直接写在源代码里的。
  在任意一个sol文件的最开始,都应该是版本代码。
  语法为:pragmasolidity0。8。0;
  如果你用过npm的话,那这个版本语言一定不会陌生,因为solidity同样使用了semver版本规范。合约
  合约的概念有点像面向对象编程语言的类,属于一等公民。
  通过关键字contract创建。
  语法:contractMyContract{}
  可以通过new关键字创建合约。newMyContract();继承
  面向对象的语言通常会使用extends关键字来继承,但是solidity没有这样做,它使用is来继承合约。contractMyContract1{uint256num2022;}contractMyContract2isMyContract1{}
  子合约被部署时,会把所有父合约的代码一起打包,所以对父合约中函数的调用都属于内部调用。
  子合约可以隐式转换父合约,合约也可以显式转换为地址。addressaddraddress(c);
  重写函数使用override关键字。父合约中支持重写的函数必须是virtual的。contractParent{functionfn()publicvirtual{}}contractChildisParent{functionfn()publicoverride{}}
  调用父合约中的方法,使用super关键字。contractParent{functionfn()public{}}contractChildisParent{functionfn2()public{super。fn();}}
  支持多重继承。contractParent1{functionfn()publicvirtual{}}contractParent2{functionfn()publicvirtual{}}contractChildisParent1,Parent2{functionfn()publicoverride(Parent1,Parent2){}}变量与基础类型
  变量是永久存储在合约中的值,通常用来记录业务信息。
  每个变量都需要声明类型,solidity中的类型有如下几种:string:字符串类型bool:布尔值,truefalse。uint:无符号整型,有uint和uint8163264128256几个类型。uint是uint256的别名。int:有符号整型,规则和uint一样。bytes:定长字节数组。从bytes1到bytes32,byte是bytes1的别名。它和数组类似,通过下标获取元素,通过length获取成员数量。address:地址类型。保存一个20字节的地址。addresspayable:可支付的地址,有成员函数transfer和send。contractMyContract{stringname}uint
  对于整型变量,我们可以通过type(x)。min和type(x)。max来获取某个类型的最大值和最小值。address
  addresspayable可以隐式转换到address,但是address必须通过payable(address)这种方式显示转换。
  address还可以显示转换为uint160和bytes20。bytes和string
  bytes和string都是数组,而不是普通的值类型。
  bytes和byte〔〕非常像,但是它在calldata和memory中会紧打包。紧打包的意思是将元素连续存储在一起,不会按照每32字节为一个单元进行存储。
  string是变长utf8编码的字节数组,和bytes不同的是它不可以用索引来访问。
  字符串没有操作函数,一般都是通过第三方string库来操作字符串。
  string可以转换为bytes,转换时是创建引用而不是创建拷贝。functionstringToBytes()publicpurereturns(bytesmemory){stringmemorystrhello;bytesmemorybtsbytes(str);returnbts;}
  由于bytes和string很相似,所以我们在使用它们时应该有对应的原则。对于任意长度的原始字节使用bytes。对于任意长度的UTF8字符串使用string。当需要对字节数组长度进行限制时,应该使用byte1byte32之间的具体类型。
  合理使用bytes可以节省Gas费。变量修饰符
  我们也可以为变量指定访问修饰符。
  语法是类型访问修饰符(可选)字段名。
  访问修饰符有三种:public:公开,外部可以访问,声明为public的话会自动生成getter函数。internal:默认,只有合约自身和派生的合约可以访问。private:只有合约自身可以访问。
  solidity中的变量与传统语言的变量有些不同。字符串的值默认不可以包含中文。如果要使用除了英文外的其他语言,必须加unicode前缀。stringnameunicode小明;结构体
  使用关键字struct创建结构,有点类似GoC的struct,或者类似TypeScript中的typeinterface。structUser{stringname;stringpassword;uint8age;boolstate;}
  初始化结构体和调用函数类似,参数的顺序和结构体的顺序保持一致。UseruserUser(章三,123,12,false);
  访问某一个属性使用点号。user。name;
  属性也可以直接赋值。user。name里斯;数组
  和TypeScript中的数组语法一致,语法是type〔〕。User〔〕users;
  访问数组元素,使用array〔index〕的方式。users〔0〕;
  访问不存在的下标,会直接报错。
  在创建数组时可以声明长度,如果不声明,那就是可以动态调整大小的数组。uint256〔10〕nums;
  数组具有pop和push方法,分别用于弹出一个元素和添加一个元素。但是它们不可以用在定长数组中。
  push方法可以不传递参数,这时表示它添加一个该元素类型的零值。strs。push(1);strs。pop();映射
  类似于很多语言中的Map结构。语法是mapping(keyTypevalueType)。mapping(addressUser)userMapping;
  key的类型只允许是基本类型,不可以是复杂类型,比如合约、枚举、映射和结构体。
  value的类型没有限制。
  访问mapping元素,使用mapping〔key〕的方式。userMapping〔0x021221〕
  访问不存在的key,会返回value类型的默认值。
  mapping不可以作为公有函数的参数和返回值,只可以作为变量或者函数内的存储或者库函数的参数。
  声明为public的mapping,会自动创建getter函数。KeyType作为参数,ValueType作为返回值。
  mapping无法被遍历。不过有一些开源库用一种结构来实现了可遍历的mapping。可以直接拿过来用。枚举
  枚举是创建用户自定义类型的一种方式。enumActionChoices{GoLeft,GoRight,GoStraight,SitStill}ActionChoiceschoice;
  枚举可以和所有的整型显示相互转换,但是不能隐式转换。uintnumuint(choice);
  从整型显示转换到枚举类型,会在运行时检查整数是否在枚举范围内,超过的话会导致异常。choiceActionChoices(num);
  枚举最少包含1个成员,最多可以包含256个成员。
  枚举默认值是第一个成员。
  枚举的数据表示和C语言是一样的,从0开始的无符号整数开始递增。构造函数
  部署合约时会由EVM自动调用构造函数,和常规的编程语言语法一致。contractMyContract{constructor(){}}
  如果在构造函数中设置参数的话,那么在部署时需要传入对应参数的值。contractMyContract{constructor(uint256initNum){}}
  构造函数不支持重载。
  如果一个合约没有构造函数,那么会采用默认构造函数,将所有变量初始化为类型对应的默认值。函数
  语法是function(typeparam){internalexternal}〔pureviewpayable〕〔returns(paramType)〕
  可访问性标识符、状态标识符、函数修改器
  函数可以定义在合约之外,但是只能通过internal的形式访问。
  函数可以接受多个参数,也可以返回多个返回值。函数修改器
  可以放在函数声明中,具有修改函数行为的能力。modifieronlyOwner(){require(msg。senderowner,onlyowner);;}
  常用的关键字有require和。
  require有两个参数,第一个参数是一个bool值,如果为false,那么就会触发错误,终止函数运行。第二个参数是当发生错误时的消息。
  表示函数运行。
  使用函数修改器只需要在函数的修饰符部分添加修改器的名字即可,如果要添加多个修改器,使用空格隔开。functionsetState(uintstate)externalonlyOwnerm2m3{statestate;emitStateChanged(state)}
  函数修改器可以被继承。函数修饰符
  修饰符可以用在成员属性或者函数上,它决定了成员属性函数的访问权限,共有4种:public:最大访问权限,任何人都可以调用。private:只有合约内部可以调用,不可以被继承。internal:子合约可以继承和调用。external:外部可以调用,子合约可以继承和调用,当前合约不可以调用。
  external和public的函数是合约的成员变量,可以通过fn。address来获取地址,通过。selector来获取标识符,这也被称作函数选择器。函数调用
  函数分为内部函数与外部函数。内部函数
  只有在同一个合约内的函数可以内部调用,内部调用可以递归调用。函数调用在EVM中会被解释为简单地跳转,内存不会被清除。
  比如可以做斐波那契数列。contractMyContract{functionfibonacci(uint256n)publicreturns(uint256){if(n1n2){return1;}returnfibonacci(n2)fibonacci(n1);}}外部调用
  调用父合约的external方法和调用其他合约中的externalpublic方法,都属于外部调用。
  调用父合约的方法使用this。fn();,调用外部合约的方法使用contract。fn();。
  进行外部调用会通过消息调用,而不是简单跳转。接口
  与传统语言一样,使用关键字interface。
  接口可以被合约继承。interfaceToken{functiontransfer(addressrecipient,uintamount)external;}contractMyTokenisToken{functiontransfer(addressrecipient,uintamount)externaloverride{}}事件
  定义事件:eventeventName(paramsTypeparamsName)
  触发事件。emiteventName(params)
  事件会被记录到区块链的Log中,区块链的Log分为索引和数据。我们可以指定最多3个参数为indexed,表示它们可以被索引。
  前端可以通过web3。js来订阅和监听事件。
  事件也可以被继承。控制结构
  solidity支持大多数传统编程语言的流程控制语句。比如if、else、while、do、for、break、continue、return。但是不支持goto和switch。
  solidity支持trycatch做异常处理,但是只支持外部函数调用和合约创建调用。数据存储位置
  所有引用类型的数据(包括数组、结构体、mapping、合约等)都有三种存储位置。分别是:内存memory:合约执行时的内存。存储storage:合约的永久存储。调用数据calldata:不可修改,函数的参数。和memory有些像,但和内存不在同一个位置。
  直接声明在合约中的变量都会存储在storage中。
  声明为external的函数,参数必须存储在calldata。
  在storage和memorycalldata之间进行复制,会创建独立的拷贝。
  memory和calldata之间相互赋值不会创建拷贝,而是创建引用。
  storage与本地storage之间的赋值也只会创建引用。contractMyContract{uint256〔〕arr1;arr1存储在storage中arr2存储在memory中functionfn1(uint256〔〕memoryarr2)public{memory赋值到storage中,创建拷贝arr1arr2;stoarge赋值到本地storage中,创建引用uint256〔〕storagearr4arr1;pop会同时影响arr1arr4。pop();清空arr1,同时会影响arr4deletearr1;storage是静态分配内存,所以不可以直接从memory赋值到本地storage中arr4arr2;因为没有指向存储位置,所以无法重置指针deletearr4;storage之间传递引用fn3(arr1);storage到memory会拷贝fn4(arr1);}arr3存储在calldata中functionfn2(uint256〔〕calldataarr3)external{}functionfn3(uint256〔〕storagearr5)internalpure{}functionfn4(uint256〔〕memoryarr6)publicpure{}}
  在使用数据时,要优先考虑放在memory和calldata中。
  因为EVM的执行空间有限。而且如果storage的占用很高,Gas费也会很贵。单位
  solidity中有两种单位。以太单位和时间单位。以太单位
  以太单位是以太坊独有的单位,在其他编程语言中没有这种单位。
  1wei等于1。
  1gwei等于1e9。
  1ether1e18。
  用代码表示如下:assert(1wei1);assert(1gwei1e9);assert(1ether1e18);时间单位
  默认1等于1秒。
  solidity支持以下时间单位:seconds:秒minutes:分hours:时days:天weeks:周years:年,不推荐使用。
  用代码表示如下:assert(1seconds1);assert(1minutes60seconds);assert(1hours60minutes);assert(1days24hours);assert(1weeks7days);错误处理与异常
  Solidity使用状态恢复异常来处理错误。这种异常会撤销当前调用以及子调用中的状态变更,并且会向调用者标记错误。
  外部调用的异常可以被trycatch捕获。assert
  assert用在我们认为不会出现错误的地方,它返回Panic(uint256)类型的错误。functionbuy(addresspayableaddr)public{addr。transfer(1ether);assert(addr。balance1ether);}require
  require通常用来条件判断,它会创建一个Error(string)类型的错误,或者是没有错误数据的错误。functionbuy(uintamount)public{require(amount1,amountmustbegreaterthan1);}revert
  可以用来标记错误并且退回当前调用。
  require本身也会去调用revert。functionbuy(uintamount)public{if(amount1){revert(amount1,amountmustbegreaterthan1);}}区块和交易属性
  区块和交易属性都是以全局变量或者全局函数的形式存在的。我们可以直接访问它们。常见的属性如下:blockhash(uintblockNumber)returns(bytes32):获取指定区块的区块哈希,可用于最新的256个区块,不包含当前区块。block。chainid:uint类型,当前链的id。block。coinbase:address类型,当前区块的矿工地址。block。diffculty:uint类型,当前区块的难度。block。gaslimit:uint类型,当前区块的gas限额。block。number:uint类型,当前区块号。block。timestamp:uint类型,从unixepoch到当前区块以秒计的时间戳。gasleft()returns(uint256):剩余的gas。msg。data:bytes类型,完整的calldata。msg。sender:address类型,消息发送者(当前调用者)。msg。sig:bytes4类型,calldata的前4个字节,也就是函数标识符。msg。value:uint类型,消息发送的wei数量。tx。gasprice:uint类型,当前交易的gas价格。tx。origin:addresspayable类型,交易发起者。receive和fallback
  receive是一个特殊的函数,一个合约可以包含最多一个receive函数。
  receive没有function关键字,必须是externalpayable的。可以是virtual的,可以被重载,可以添加modifier。
  我们给合约转账时,会去执行receive函数。如果转账时receive函数不存在,会去调用fallback函数。如果fallback函数也不存在,那么合约不可以通过正常转账来接受ether。
  fallback函数和receive类似,只能最多有一个fallback函数,必须是external的,可以是virtual的,可以被重载,可以添加modifier。但payable是可选的。
  fallback方法可以接受参数,也可以返回数据。
  如果调用某个合约的函数,但是这个函数不存在,会调用fallback。contractMyContract{receive()externalpayable{}fallback()external{}}
  web3。0生态系统
  Web3世界非常精彩。
  如果你对Web3感兴趣,右上角记得加关注。
  我会持续更新更多Web3相关的高质量文章。
  头条创作挑战赛web3。0

养老,难道就是活着?每当去养老院看望前辈,总会感慨万千人老了到底该如何度过晚年?毋庸讳言,对大多数老人来说,所谓的养老,其实就是有吃的,有喝的,能够解决温饱,不至于因饥寒而死所谓的有靠,没有养老金的人女人过了35岁后,面对这两件事,还能如此冷静,她绝对不简单01或许,女人二十岁的时候,想要的是能轰轰烈烈地谈场恋爱而,过了三十岁后,想要的却是能安安心心地睡到自然醒。人在年少,总会随时随地就如打了鸡血一般,斗志昂扬到了中年后,就少了许多剑马桶底座发霉怎么办?别换玻璃胶了,教你这么做,干净又卫生房子居住时间久了,你就会发现卫生间台面角落玻璃胶,甚至洗衣机胶条,冰箱密封条上都是顽固的霉菌清洁过的人都知道,这些霉菌是很顽固的,即使是用钢丝球擦,都没有办法彻底消除。尤其是到了潮秋真的让我心伤水在静静的流着,仿佛少女的眼泪,洗去了刚刚妆好的胭脂。胭脂的水粉和馨芬。是呀,叶落了,草黄了。大雁飞走了,大雁要飞到哪里去呢?是很远很远的地方吗?这漫漫的旅程你能飞得动吗?你们的孩刘亦菲的10张美照,每张都是珍藏版1。人生只是一个或长或短的过程,在这个过程里我们一天天缩短生命的距离,我们只有用宽容与爱心去拉长生命的每一天,学会并懂得去面对现实生活,去面对每一个给予我痛苦与快乐的时刻,丰富着我伤感篇之一上篇1。男儿有泪不轻弹,只因未到伤心时。2。美人卖笑千金易,壮士穷途一饭难。3。无人与我立黄昏,无人问我粥可温无人与我把酒分,无人告我夜已深。夢中人名言4。但愿你多年以后仍能想起曾有个接受自己但不能止步现状你低谷期经常安慰自己的一句话是什么?所谓的低谷,就是现状无法满足自己所求,得不到认可感情受挫工作失意心情像浮木在海中飘荡,望不到边望不到岸。糟糕得想摆烂,就此苟且过活。但总有人在咬人贵三得静得下心沉得住气拐得了弯老人们常说人贵有三得,静得下心,沉得住气,拐得了弯。仔细想想,确实如此。人这一生,不如意之事,十常八九,会遇到合不来的人,也会经历不顺心的事。能拥有一个好的心态,遇事平静淡定,想得一个女人的品味高低,看她脚上的袜子一个女人的品味,代表着她的智慧。一个女人的品味,代表着她的修养。一个女人品味的高低,决定了她的生活品质。一个女人的品味,影响着她的人生。看一个女人的品味好坏,要看细节之处。往往最容真正见过世面的女人,服饰不会买太多,备齐2袜3鞋4衣就好穿衣打扮一半看挑款一半看搭配,再会穿衣的女人也要选对服饰,服饰过关才是轻松穿出好气质的前提。那么服饰是多多益善越贵越好吗?答案其实是否定的,衣服不要买多,也不能一味追逐价格。那么在名门痞女洪晃豪言女人要睡五个男人才够本,如今过得怎么样?文绻影已浮沉编辑绻影已浮沉洪晃出身名门,却和大众眼中的贵女迥异。她真实不做作,曾豪言一个女人一辈子要睡五个男人才够本。她身上一直都被贴着名门贵女女强人陈凯歌前妻时尚教母等标签。但是
在成都上班普通人能领多少工资?2003年,我一个人来到成都,一晃快二十年时间过去了。2005年,我开始做生意和创业。现在,我在成都有十几家公司,在成都已经成家立业十多年了。下面,以我的财税代理公司为例,简单说下工作了一个多月没有签合同,现在要辞职,领导要我签了合同然后在三天后办离职手续,这合理吗?又一个被劳务派遣坑骗的人。我的建议是拨打劳动仲裁部门的电话,让劳动仲裁部门出面去协调这个事情,你的单位涉嫌克扣员工的利益,虽然不是很严重,但是这个事情绝对不会只发生在你一个人的身上孩子四年级,语文99。5,数学100,英语100,接下来读五六年级需要注意什么?四年级的学生三科基本上都是满分,这是一个非常不错的成绩,足以证明孩子在学习中有着比较好的学习状态。虽然小学的考试题目难度不大,但要考满分还真不是一件容易的事情,除了必须具备扎实的基孩子五年级,没报过课外的补习班,但是别的家长说一定要学新概念英语,想问有必要吗?孩子五年级,没报过课外的补习班,但是别的家长说一定要学新概念英语,想问有必要吗?为了回答这篇问题,我特意又请教了一下我的老爹,他老人家教了40多年书,其中有近30年是教英语的。我呢怀孕17周5天,胎盘下缘覆盖宫颈内口,怎么办,会长上去吗?你好,非常高兴为你解答问题,你是孕175周,B超查出胎盘下缘覆盖宫颈内口边缘,不要太紧张,如果发生阴道流血,有时候量稍多,有的时候量偏少,要绝对卧床休息,要杜绝一切剧烈运动,不宜下胸部软软的,奶水少,宝宝老是吸几分钟就睡着了,如果拿吸奶器经常吸奶水会变多一点吗?催乳师说用吸奶器容易伤着乳房,效果适得其反,说奶水不足,最好让宝宝一直吸,要是宝宝不排斥只是睡着了,可以挠脚心醒了接着吸,前期可以间隔俩小时喂母乳,让奶存多点,我找催乳的催乳过后胸全职宝妈,除了老公给的零花钱没有任何收入,谁有靠谱兼职求介绍?说一下我姐兼职一个月挣了6000多的事吧!她是一个41岁的大龄二婚宝妈。因为有了孩子之后,生活压力确实大了不少,我姐夫工资大部分都还房贷了。最初我姐只是想挣孩子幼儿园学费800元,十一二岁小孩太胖,晚上不吃晚饭,对长个头,发育有影响吗?当然受影响,这个年龄正是长身体的时候,晚上不吃饭会影响到营养吸收,长不了高个子,青春期的发育也受到影响,如果害怕太胖的话,那可以通过运动来实现减肥的目的,不吃饭是不建议的,而且长期晚上几点之前睡有利于减肥?睡觉是每一个人都需要的一项活动,在这个世界上没有人可以不睡觉,一定不要小看了睡觉这件事,睡觉其实也是有很多诀窍的,睡得好了,不仅仅可以睡出健康,而且还可以睡出美貌,甚至是可以睡出好小学一年级学生的作业,天天晚上要做到十一二点,正常吗?当然不正常了。一年级的作业还是比较少的,而且一年级放学都比别的年级早,就这点学业量,一般情况下,一两个小时,就算孩子写字慢,3个小时也做完了的,不会做到十一二点。一年级的孩子,刚从有没有很实在的副业,日收入在100200左右的,晚上做的?快递公司装卸如果你时间多可以做自媒体,做影视剧讲解,拍视频,写文章,做专栏,写评论等,或者下班后做代驾。代驾送外卖做自媒体直播扛水泥有,就看你愿不愿意干喽,像工地上料,商超配送,美
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网