『壹』 solidity智能合约(3):使用truffle编译部署及测试合约
首先,我们将通过实际操作来演示如何使用Solidity编写以太坊智能合约,并让它们运行起来。
智能合约文件应保存在项目的`contracts`目录下。
接下来,在`migrations`目录下创建一个`test`目录,以规范地存放测试文件。如果直接在根目录下存放测试文件,虽然可以工作,但不够规范。
为了编译Truffle项目中的合约,请确保已切换到项目根目录,并在终端中输入以下命令:
首次运行此命令时,Truffle将编译项目中的所有合约。在之后的运行中,它将仅编译自上次编译以来有更改的合约。如果我们希望覆盖这一行为,可以选择使用`--all`选项重新运行上述命令。
编译完成后的目标文件`Artifacts`将存储在`build/contracts/`目录中,这是相对于项目根目录的位置(如果该目录不存在,Truffle将创建它)。
请注意,`Artifacts`文件是Truffle框架内部工作的一部分,它们在成功部署应用程序时扮演关键角色。不应编辑这些文件,因为它们将被合约编译和部署所覆盖。
合约编译成功后,接下来是迁移脚本(JavaScript文件)。这些脚本帮助我们把合约部署到以太坊网络上。它们负责存储我们的部署任务,并假设我们的部署需求会随时间变化。随着项目的发展,我们将创建新的迁移脚本来推动区块链的进一步发展。
部署合约的命令如下:
执行此命令将部署`migrations`目录中的所有迁移文件。最简单的迁移脚本只是一组管理部署的脚本。如果我们的迁移脚本之前已成功运行,`truffle migrate`将从上次运行的迁移开始执行,只部署新创建的迁移。如果没有新的迁移,`truffle migrate`将不会执行任何操作。在进行本地测试时,请确保在运行`migrate`命令之前安装并启动了Ganache等测试区块链。
最后,让我们来看一个测试脚本的例子。在测试脚本中,我们输入了数值100,合约返回的值是64(这个值是十六进制格式,转换为十进制就是100)。
『贰』 以太坊交易规则
从外部账户发送到区块链上的另一个账户的消息和签名的数据包。
包含如下内容:
发送者的签名
接收的地址
转移的数字货币数量等内容
以太坊上的交易都是需要支付费用,和比特币以比特币来支付一定的交易费用不同,以太坊上固定了这个环节,那么这个间接理解是以太坊的一种安全防范错误,防止了大量的无意义的交易,保证一定的安全性,特别是智能合约的创建、执行、调用都需要消耗费用,那么也保证了整个系统的稳定性,防止了一些链上无意义的恶意行为。
交易手续费
以太坊的核心是EVM,以太坊虚拟机,那么在EVM中执行的字节码都是要支付费用。也就是经常看到的Gas、Gas limit、Gas Price这几个概念。
Gas:字面理解就是汽油,以太坊和日常的汽车一样需要Gas才能运行。Gas是一笔交易过程中计算消耗的基本单位。有一个列表可以直观看到在以太坊中操作的Gas消耗量:
操作Gas消耗具体内容
step1执行周期的默认费用。
stop0终止操作是免费的。
suicide0智能合约账户的内部数据存储空间,当合约账户调用suicide()方法时,该值将被置为null。
sha320加解密
sload20在固定的存储器中去获取
sstore100输入到固定的存储器中
balance20账户余额
create100创建合约
call20初始化一个只读调用
memory1扩充内存额外支付的费用
txdata5交易过程中数据或者编码的每一个字节的消耗
transaction500交易费用
contract creation53000homestead中目前从21000调整到53000
所以有些公司或者个人觉得区块链技术去中介化,不需要中心服务器,这种开发模式是比较便宜的,但是事实上区块链的开发不比之前的那些传统软件开发来的便宜。
Gas Price:字面理解汽油价格,这个就像你去加油站,95#汽油今天是什么价格。一个Gas Price就是单价,那么你的交易费用=Gas*Gas Price,然后以以太币来ether来支出。当然你觉得我不想支付费用,你可以设置Gas Price为0,但是选择权在矿工手中,矿工有权选择收纳交易和收取费用,那么最简单的想想很难让一个矿工去接收一个价格很低的交易吧。另外提一句,以太坊默认的Gas Price是1wei。
Gas Limit:字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个Gas Limit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的Gas Limit,一个单独的区块也有Gas的限制。
假设几个场景来说明Gas的使用:
用户设置Gas Limit,那么在交易过程中,如果你的实际消耗的Gas used
用户设置Gas Limit,那么交易过程中,如果你的实际消耗的Gas used > Gas Limit,那么矿工肯定发现你的Gas不足,这个交易就无法执行完成,这个之后会回滚到执行之前的状态,这个时候矿工会收取Gas Price*Gas Limit。
区块的Gas Limit,区块中有一个Gas上限,收纳的交易会出现不同的用户指定的Gas Limit。那么矿工就会根据区块限制的Gas Limit来选择,“合理”选择打包交易。
具体交易
以太坊上交易可以是简单的以太币的转移,同时也可以是智能合约的代码消息。列个表格看下交易的具体内容:
代码内容
from交易发起者的地址、不能为空,源头都没有不合理。
to交易接收者的地址(这个可以为空,空的时候就表示是一个合约的创建)
value转移的以太币数量
data数据字段。这个字段存在的时候表示的是,交易是一个创建或者是一个调用智能合约的交易
Gas Limit字面理解就是Gas的限制,限制是必要的,没有限制就没有约束。这个Gas Limit是有两个意思的。首先针对单个交易,那么这个表示交易的发起者他愿意支付最多是多少Gas,这个交易发起者在发起交易的时候需要设置好。还有一个是针对区块的Gas Limit,一个单独的区块也有Gas的限制。
Gas Price一个Gas Price就是单价,那么你的交易费用=Gas*Gas Price,然后以以太币来ether来支出。以太坊默认的Gas Price是1wei。
nonce用于区别用户发出交易的标识。
hash交易ID,是由上述的信息生成的一个hash值
r、s、v交易签名的三部分,交易发起者的私钥对hash签名生成。
交易分三种类型
转账:简单明了的以太坊上的以太币的转移,就和比特币类似,A向B转移一定数量的以太币。这种交易包含:交易发起者、接收者、value的数量,其余类似Gas Limit、hash、nonce都会默认生成。所以你会看到一段代码:
web3.eth.sendTransaction({ from: "交易发起者地址", to:“交易接收者地址”, value: 数量});
智能合约创建:创建智能合约就是把智能合约部署到区块链上,那么这个时候to是一个空的字段。data字段则是初始化合约的代码。所以看到代码:
web3.eth.sendTransaction({ from: "交易发起者地址", data: "contract binary code"});
智能合约执行:合约创建部署在区块链上,那么执行就是会加上to字段到要智能合约执行的地址,然后data字段来指定调用的方法和参数的传递,所以看到代码:
web3.eth.sendTransaction({ from: "交易发起者地址", to:“合约执行者地址”, data:“调用的方法和参数的传递”});
以上大致就是交易的类型。
『叁』 浠ュお鍧婂備綍澶勭悊鏅鸿兘鍚堢害鐨勮嚜鐢卞害闂棰
浠ュお鍧婂備綍澶勭悊鏅鸿兘鍚堢害鐨勮嚜鐢卞害闂棰橈紵
浠ュお鍧婃槸褰撳墠鏈娴佽岀殑鍖哄潡閾句箣涓锛屽叾鏅鸿兘鍚堢害鎶鏈琚骞挎硾搴旂敤浜庡悇绉嶅満鏅銆傜劧鑰岋紝鏅鸿兘鍚堢害鐨勮嚜鐢卞害闂棰樹粛鐒舵槸涓涓鍊煎緱鍏虫敞鐨勮瘽棰樸傚湪浠ュお鍧婄敓鎬佺郴缁熶腑锛屾櫤鑳藉悎绾︾殑鎵ц岀粨鏋滃彈鍒板氭柟闈㈠洜绱犵殑褰卞搷锛屽傚悎绾︿唬鐮佺殑澶嶆潅搴︺佷氦鏄撹垂鐢ㄧ殑璁剧疆銆佸悎绾﹂棿鐨勪氦浜掔瓑绛夈傛湰鏂囧皢鎺㈣ㄤ互澶鍧婂湪澶勭悊鏅鸿兘鍚堢害鑷鐢卞害闂棰樻椂閲囧彇鐨勭瓥鐣ャ
浠ュお鍧婃櫤鑳藉悎绾︾殑鑷鐢卞害涓昏佸寘鎷浠ヤ笅涓ゆ柟闈锛
涓鏄鍚堢害鐨勭紪鍐欒嚜鐢卞害銆備互澶鍧婃敮鎸佸氱嶇紪绋嬭瑷锛屽紑鍙戣呭彲浠ュ湪涓嶅悓鐨勮瑷鍜屾嗘灦閲岃嚜鐢遍夋嫨锛岃繖寰堝ぇ绋嬪害涓婂炲己浜嗗悎绾︾殑鍙鎵╁睍鎬у拰鐏垫椿鎬с傜劧鑰岋紝杩欎篃甯︽潵浜嗗畨鍏ㄦх殑鎸戞垬銆傚洜涓轰笉鍚岀殑璇瑷鍜屾嗘灦鏈韬灏卞瓨鍦ㄦ紡娲烇紝濡傛灉鍚堢害缂栧啓鑰呮病鏈変粩缁嗚冭檻杩欎簺闂棰橈紝灏卞彲鑳藉艰嚧涓ラ噸鐨勫畨鍏ㄩ棶棰樸
浜屾槸鍚堢害鐨勬搷浣滆嚜鐢卞害銆備互澶鍧婁笂鐨勬櫤鑳藉悎绾﹀彲浠ヨ鍏朵粬鍚堢害鎴栬呭栭儴璐︽埛璋冪敤锛岃繖鎰忓懗鐫鍚堢害鐨勬墽琛岀粨鏋滀細鍙楀埌鍏朵粬鍚堢害鎴栬呰处鎴风殑褰卞搷銆傛ゅ栵紝浜ゆ槗璐圭敤銆佺綉缁滄嫢濉炵瓑鍥犵礌涔熶細瀵瑰悎绾︾殑鎵ц岀粨鏋滀骇鐢熷奖鍝嶃傝繖浜涘洜绱犵殑鑷鐢卞害寰堝ぇ绋嬪害涓婂炲姞浜嗗悎绾︾殑澶嶆潅搴︼紝鍚屾椂涔熷炲姞浜嗗悎绾︽墽琛岀殑椋庨櫓銆
涓轰簡搴斿规櫤鑳藉悎绾﹁嚜鐢卞害闂棰橈紝浠ュお鍧婇噰鍙栦簡涓绯诲垪鎺鏂姐傚叾涓鏈閲嶈佺殑涓椤规槸浠ュお鍧婅櫄鎷熸満锛圗VM锛夈侲VM鏄浠ュお鍧婁笂鐨勮櫄鎷熸満锛屾棬鍦ㄥ疄鐜板悎绾︾殑蹇閫熴佸彲闈犮佸畨鍏ㄦ墽琛屻侲VM閫氳繃瀛楄妭鐮佺殑鏂瑰紡鎵ц屾櫤鑳藉悎绾︼紝閬垮厤浜嗚瑷鍜屾嗘灦鐨勯檺鍒躲傚悓鏃讹紝EVM杩樻彁渚涗簡涓瀹氱殑鏈哄埗鏉ラ槻姝㈠悎绾︽墽琛屼腑鐨勫紓甯告儏鍐碉紝姣斿傚唴瀛樻孩鍑恒侀櫎闆剁瓑銆傝繖浜涙満鍒舵湁鍔╀簬鎺у埗鏅鸿兘鍚堢害鐨勮嚜鐢卞害锛屾彁楂樺叾鎵ц岀殑鍙闈犳у拰瀹夊叏鎬с
姝ゅ栵紝浠ュお鍧婅繕鎻愪緵浜嗕竴浜涢珮绾у姛鑳芥潵鎺у埗鏅鸿兘鍚堢害鐨勬墽琛屻傚叾涓鏈甯哥敤鐨勬槸鍚堢害鎵ц岀殑Gas闄愬埗銆傛瘡涓鏅鸿兘鍚堢害鎵ц岀殑鏈闀挎椂闂磋闄愬埗鍦ㄤ竴瀹氭暟閲忕殑Gas鍐咃紝杩欐牱鍙浠ラ伩鍏嶅悎绾︽墽琛岃繃闀挎椂闂磋屽艰嚧鍏朵粬鍚堢害鍜岃处鎴风殑绛夊緟銆傚悓鏃讹紝鍚堢害鎿嶄綔鐨凣as娑堣椾篃琚闄愬埗鍦ㄤ竴瀹氳寖鍥村唴锛岃繖鏈夊姪浜庨槻姝㈡伓鎰忓悎绾﹀崰鐢ㄥお澶氱殑璁$畻璧勬簮銆
鎬讳箣锛屾櫤鑳藉悎绾﹁嚜鐢卞害鏄浠ュお鍧婃櫤鑳藉悎绾﹂潰涓寸殑涓涓鎸戞垬锛屼絾杩欎篃鏄鍖哄潡閾炬妧鏈鍙戝睍鐨勫繀缁忎箣璺銆備互澶鍧婇氳繃EVM鍜孏as闄愬埗绛夋満鍒舵潵鎺у埗鍚堢害鐨勬墽琛岋紝鎻愰珮浜嗗悎绾︾殑鍙闈犳у拰瀹夊叏鎬э紝鍚屾椂涔熶负寮鍙戣呮彁渚涗簡鏇村氱殑鑷鐢卞害鍜岀伒娲绘с傜浉淇¢殢鐫鍖哄潡閾炬妧鏈鐨勪笉鏂鍙戝睍锛屾櫤鑳藉悎绾︾殑鑷鐢卞害闂棰樹篃灏嗗緱鍒版洿濂界殑瑙e喅銆
『肆』 以太坊的智能合约什么意思_以太坊的智能合约怎么解释
以太坊智能合约是运行在以太坊区块链上的代码,它能根据预设的规则自动执行任务,无需第三方介入。简单来说,智能合约就像是自动执行法律协议的程序。它能确保合约条款的准确执行,减少人为错误和欺诈的风险。
以太坊是一个分布式计算平台,提供了一个运行智能合约的环境。智能合约能够执行各种任务,从简单的支付转账到复杂的金融产品或服务交易,甚至可以用于管理复杂的业务流程。在以太坊上创建智能合约的过程涉及编写代码,并将这些代码部署到区块链上,确保合约能够以安全、可靠的方式执行。
智能合约具有数字形式的特点,这意味着它们是以计算机可读的代码形式存在的。这使得智能合约能够在分布式网络中运行,无需依赖中心化的机构或个人。这种去中心化的特点是智能合约的一大优势,能够提供透明、安全的交易环境。
智能合约的实现通常涉及多个方面,包括达成协议、合约执行以及特定的协议选择。在实现时,合约的内容被编译成计算机可执行的代码,这使得合约的执行过程既高效又准确。选择适合的协议对于智能合约的性能和安全性至关重要,这通常取决于被交易资产的性质。
智能合约的应用范围广泛,包括但不限于:多签名账户管理、执行合同条款、自动执行金融服务、管理协议、存储应用程序信息等。通过智能合约,可以在去中心化的环境中实现自动化、可信的交易和服务。
在以太坊上,智能合约的开发和部署涉及到以太币(Ether)作为交易费用。用户或开发者需要购买以太币,以便支付节点的运行费用,这些节点执行智能合约并维护以太坊网络的正常运行。基于以太坊的项目或应用可能还需要用户使用以太币支付服务费用。
总之,以太坊的智能合约是一种强大的工具,能够实现自动化、去中心化的交易和协议执行。通过智能合约,可以创建出更安全、高效、透明的业务流程,为各种应用提供支持,从金融到物联网、供应链管理,智能合约的潜力在不断扩展。
『伍』 智能合约的执行过程
智能合约的执行过程涉及多个关键步骤。首先,开发者使用支持智能合约的编程语言(如Solidity)编写合约代码,这些代码定义了合约的条款、条件和执行逻辑。编写完成后,合约代码被部署到区块链网络上,如以太坊等平台,此过程需要支付一定的费用(称为“燃料费”或Gas Fee)。
一旦合约被部署并激活,其执行将依赖于满足合约中预设的触发条件,这些条件可以是时间、事件或交易等。当条件满足时,智能合约将自动执行预定的操作,如转移资产、更新状态或调用其他合约等。这些操作由区块链网络上的节点进行验证,以确保执行的一致性和安全性。
执行结果随后被记录在区块链上,形成不可篡改的历史记录。由于智能合约的不可更改性和去中心化特性,整个执行过程无需人工干预,且高度透明和可靠。这种自动化和去中心化的执行方式,使得智能合约在金融、供应链管理、版权保护等多个领域具有广泛的应用前景。