扣丁学堂区块链培训深入解析调用合约的方法

2018-07-09 14:53:11 551浏览

区块链如今正在深入人们的生活,本篇文章扣丁学堂区块链培训小编和大家分享一下深入解析调用合约的方法,对区块链开发感兴趣的小伙伴就随着小编一起来了解一下吧。



扣丁学堂区块链培训深入解析调用合约的方法



本文将讲解这三种调用方法的区别:


testInstance.testFunc.sendTransaction(); 会创建一个交易,调用之后会返回一个交易hash值,它会广播到网络,等待矿工打包, 它会消耗gas。


testInstance.testFunc.call(); 它完全是一个本地调用,不会向区块链网络广播任何东西,它的返回值完全取决于testFunc 方法的代码,不会消耗gas


testInstance.testFunc(); 它会比较特殊,由于有constant标识的方法不会修改状态变量,所以它不会被编译器执行。所以,如果testFunc() 有constant标识,它并不会被编译器执行,web3.js会执行call()的本地操作。相反如果没有constant标识,会执行sendTransaction()操作。



来验证一下:


写个合约,代码如下:



pragma solidity ^0.4.2;
contract Test {
    uint public testMem;
    function testFunc1() returns (string resMes){
        testMem++;
        resMes = "try to modify testMem,but has no constant label";
    }
    function testFunc2() constant returns (string resMes){
        testMem--;
        resMes = "try to modify testMem and has constant label";
    }
}



将合约部署到私有链,并获取合约实例testInstance 

调用testFunc1


> testInstance.testFunc1({from:eth.accounts[0]})
I0117 19:38:21.348763 internal/ethapi/api.go:1047] Tx(0x157d429be29953ea451ea95cf468a3a67c4a86e9b49d1b6b97cc15c579a27003) to: 0xc9bc867a613381f35b4430a6cb712eff8bb50310
"0x157d429be29953ea451ea95cf468a3a67c4a86e9b49d1b6b97cc15c579a27


可见,确实创建了一笔交易,开启挖矿,等待打包…再查看下


> testInstance.testMem()
1
> eth.getTransaction('0x157d429be29953ea451ea95cf468a3a67c4a86e9b49d1b6b97cc15c579a27003')
{
  blockHash: "0x9fa0c7d071e1d2e772de3f6f326595b9d9159b0056213416018c75f2d5c04ad2",
  blockNumber: 118,
  from: "0xcb1f9cd557b5dd81955a4df89e9b4c8a33023c12",
  gas: 90000,
  gasPrice: 20000000000,
  hash: "0x157d429be29953ea451ea95cf468a3a67c4a86e9b49d1b6b97cc15c579a27003",
  input: "0x561f5f89",
  nonce: 45,
  r: "0xb77558d48ab4efcaa24309b1003a7c4efabfdda26c3844c6aa18c58c6a08181a",
  s: "0x57fe6dde27fa7cfd2fb422e2adc9465125750b3271127b68bb65d496d99be531",
  to: "0xc9bc867a613381f35b4430a6cb712eff8bb50310",
  transactionIndex: 0,
  v: "0x1c",
  value: 0
}


可见,它确实是一笔交易,修改了合约的状态变量,并且有90000的gas消耗。

再来试下testFunc2


> testInstance.testFunc2({from:eth.accounts[0]})
"try to modify testMem and has constant label"


确实只是在本地执行,并没有创建交易,所以更不会修改合约的状态变量。


以上就是扣丁学堂区块链在线学习小编给大家分享的深入解析调用合约的三种方法,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂有专业的区块链培训班,不仅有时俱进的课程体系还有专业的老师授课,定能让你轻松学习,高薪就业。扣丁学堂区块链交流群:570711208。


扣丁学堂微信公众号

【关注微信公众号获取更多学习资料】



查看更多关于“区块链培训技术资讯”的相关文章>>



标签: 扣丁学堂区块链培训 深入解析调用合约的方法 区块链培训 区块链开发 区块链技术 区块链视频教程 区块链入门视频 区块链入门学习视频 区块链基础教程视频 区块链高级培训视频

热门专区

暂无热门资讯

课程推荐

微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
京ICP备12003911号-6   Copyright © 2013 - 2019

京公网安备 11010802030908号