Solidity笔记
Contract类的几种类型Contract: 正常可部署的合约Abstract Contract: 存在部分未实现的方法Interface: 所有方法均无实现Library:库,封装常用的工具类和方法,不能对状态变量和存储进行更改Modifier:类似拦截器,AOP编程;定义一个modifier可以修辞某方法变量关键字payable:可接受付款的地址变量memory:动态内存,不会被存储,使用完后被EVM回收public:外部可访问private:内部可访问函数可见性public: 内部外部均可见private: 只有当前合约内部可见external: 供外部调用,内部调用使用this关键字internal: 只有内部可见,可以被继承virtual:子类继承实现,实现方法需加override关键字payable:可接受付款的方法修饰符pure for functions: 禁止对状态变量的访问和修改view for functions: 禁止修改状态变量,但可以修改payable for functions: 可接受付款constant for state variables:...
Solidity笔记
Contract类的几种类型Contract: 正常可部署的合约Abstract Contract: 存在部分未实现的方法Interface: 所有方法均无实现Library:库,封装常用的工具类和方法,不能对状态变量和存储进行更改Modifier:类似拦截器,AOP编程;定义一个modifier可以修辞某方法变量关键字payable:可接受付款的地址变量memory:动态内存,不会被存储,使用完后被EVM回收public:外部可访问private:内部可访问函数可见性public: 内部外部均可见private: 只有当前合约内部可见external: 供外部调用,内部调用使用this关键字internal: 只有内部可见,可以被继承virtual:子类继承实现,实现方法需加override关键字payable:可接受付款的方法修饰符pure for functions: 禁止对状态变量的访问和修改view for functions: 禁止修改状态变量,但可以修改payable for functions: 可接受付款constant for state variables:...
truffle工具的应用
createtruffle create eg: truffle create contract/migration name compile truffle compile,编译所有合约文件 deploy/migrate 部署合约,同一个部署文件执行后,重新执行则不会再被部署。 说明: 1、如果要重新部署所有合约,则增加参数 --reset 2、如果总指定前缀序号重新部署合约,则增加参数 --reset --f 指定的序号开始 console 与合约交互,里面用到了web3的js库。 1、获取合约实例 let instance = await 合约名.deployed() 2、调用合约变量 instance.变量名.call() 3、调用合约函数 instance.函数名(参数) 如果要更改调用账号:参数增加 {from: ‘0x……‘} 如果要给合约转账:参数增加 {value: 11111},单位是wei
truffle工具的应用
createtruffle create eg: truffle create contract/migration name compile truffle compile,编译所有合约文件 deploy/migrate 部署合约,同一个部署文件执行后,重新执行则不会再被部署。 说明: 1、如果要重新部署所有合约,则增加参数 --reset 2、如果总指定前缀序号重新部署合约,则增加参数 --reset --f 指定的序号开始 console 与合约交互,里面用到了web3的js库。 1、获取合约实例 let instance = await 合约名.deployed() 2、调用合约变量 instance.变量名.call() 3、调用合约函数 instance.函数名(参数) 如果要更改调用账号:参数增加 {from: ‘0x……‘} 如果要给合约转账:参数增加 {value: 11111},单位是wei
智能合约的收付款和提现
前言:一开始总以为是必须要在函数上设置一个参数,让调用者用户把eth转过来,后来发现不是。只要是交易message(msg)中包含了msg.value信息,则代表这个包含了一个eth转账的动作。函数接收的地方标记payable,则这笔钱会自动存入到智能合约的账号地址中,并且花费的是调用者的gas费。 另外,即便是不通过智能合约的函数,其他用户也可以直接给这个智能合约的账户转账,但是有一个前提:合约中必须声明了receive函数或者是fallback函数,并且这两个函数一定要标记为payable,代表可以接收转账。下面介绍的付款、转账和提现等,都是指针对以太坊ETH的操作,并不是指合约自己的代币,合约自己发的代币的转账/销毁等逻辑合约自身可根据实际情况定义函数和逻辑实现。给智能合约付款的几种方式1、直接通过钱包转账到合约地址;(合约中必须声明了receive函数或者是fallback函数) 2、通过合约提供的专门收款函数调用,例如: //给合约转账 transfer function transferToContract() payable external { payable(a...
智能合约的收付款和提现
前言:一开始总以为是必须要在函数上设置一个参数,让调用者用户把eth转过来,后来发现不是。只要是交易message(msg)中包含了msg.value信息,则代表这个包含了一个eth转账的动作。函数接收的地方标记payable,则这笔钱会自动存入到智能合约的账号地址中,并且花费的是调用者的gas费。 另外,即便是不通过智能合约的函数,其他用户也可以直接给这个智能合约的账户转账,但是有一个前提:合约中必须声明了receive函数或者是fallback函数,并且这两个函数一定要标记为payable,代表可以接收转账。下面介绍的付款、转账和提现等,都是指针对以太坊ETH的操作,并不是指合约自己的代币,合约自己发的代币的转账/销毁等逻辑合约自身可根据实际情况定义函数和逻辑实现。给智能合约付款的几种方式1、直接通过钱包转账到合约地址;(合约中必须声明了receive函数或者是fallback函数) 2、通过合约提供的专门收款函数调用,例如: //给合约转账 transfer function transferToContract() payable external { payable(a...
关于Gas费
Gas:以太坊中用于支付矿工的费用,也就是处理交易或执行智能合约(也是交易的一种)都需要支付合理必要的gas费,否则你的交易将无人处理。Gas单位:N个gas,表示的是工作量,这个针对不同的操作工作量不同,但相对是固定的,可以通过以太坊黄皮书来查看。Gas价格:Gas Price,表示的是你愿意为每个gas支付多少钱,单位是以太币,wei,gwei等。最终gas费:gas费用 = gas数量 * gas price;其中gas数量是可以计算的、相对客观的,gas price是调用者可以调整、相对主观的。gas工作量怎么计算:如果是普通转账交易(不带额外数据),固定需要的单位为21000个gas,当然价格可以自己定。 如果是带额外数据,按字节收费,0字节4gas,大于0字节的68gas;黄皮书;gas费的策略:1、如果你的交易,提供的gas price被矿工接受,则交易被矿工放入交易池执行:在执行过程中,如果gas数量不足,则程序回滚,但gas 费不会退还; 2、如果你的交易,提供的gas price被矿工接受,则交易被矿工放入交易池执行:在执行过程中,如果gas数量超出,则多余的...
关于Gas费
Gas:以太坊中用于支付矿工的费用,也就是处理交易或执行智能合约(也是交易的一种)都需要支付合理必要的gas费,否则你的交易将无人处理。Gas单位:N个gas,表示的是工作量,这个针对不同的操作工作量不同,但相对是固定的,可以通过以太坊黄皮书来查看。Gas价格:Gas Price,表示的是你愿意为每个gas支付多少钱,单位是以太币,wei,gwei等。最终gas费:gas费用 = gas数量 * gas price;其中gas数量是可以计算的、相对客观的,gas price是调用者可以调整、相对主观的。gas工作量怎么计算:如果是普通转账交易(不带额外数据),固定需要的单位为21000个gas,当然价格可以自己定。 如果是带额外数据,按字节收费,0字节4gas,大于0字节的68gas;黄皮书;gas费的策略:1、如果你的交易,提供的gas price被矿工接受,则交易被矿工放入交易池执行:在执行过程中,如果gas数量不足,则程序回滚,但gas 费不会退还; 2、如果你的交易,提供的gas price被矿工接受,则交易被矿工放入交易池执行:在执行过程中,如果gas数量超出,则多余的...
以太坊EVM与智能合约执行
Ethereum Virtual Machine EVM用来执行以太坊上的交易;每笔交易在传入EVM前,都被转换为一个message对象。 一个message对象其实就是一次交易数据:from,to,amount,data四个主要信息。 例如:程序中的 {msg.sender} 就是指调用者的地址;{msg.data} 就是打包到交易中的data数据,针对智能合约的调用,它主要包含了函数和参数值;如果是普通转账:EVM直接修改statedb中的数据即可;如果是智能合约创建/调用:EVM则会执行合约中的代码,期间会查询或修改statedb的数据。EVM解释器四大组件:PC, stack, memory, gas池智能合约在EVM中调用原理和过程1、当调用一个智能合约函数时:首先,虚拟机通过智能合约地址,从statedb中load出该智能合约的代码,然后再做相应的字节码执行操作。 2、将智能合约代码和输入信息(input:from,to,data)放入EVM解释器执行。 3、通过交易传入的data信息(函数和参数值)和合约代码,即可执行相应的函数;每个函数都有一个hex值,这个值在交...
以太坊EVM与智能合约执行
Ethereum Virtual Machine EVM用来执行以太坊上的交易;每笔交易在传入EVM前,都被转换为一个message对象。 一个message对象其实就是一次交易数据:from,to,amount,data四个主要信息。 例如:程序中的 {msg.sender} 就是指调用者的地址;{msg.data} 就是打包到交易中的data数据,针对智能合约的调用,它主要包含了函数和参数值;如果是普通转账:EVM直接修改statedb中的数据即可;如果是智能合约创建/调用:EVM则会执行合约中的代码,期间会查询或修改statedb的数据。EVM解释器四大组件:PC, stack, memory, gas池智能合约在EVM中调用原理和过程1、当调用一个智能合约函数时:首先,虚拟机通过智能合约地址,从statedb中load出该智能合约的代码,然后再做相应的字节码执行操作。 2、将智能合约代码和输入信息(input:from,to,data)放入EVM解释器执行。 3、通过交易传入的data信息(函数和参数值)和合约代码,即可执行相应的函数;每个函数都有一个hex值,这个值在交...