1-2、truffle与webjs亲密接触(truffle智能合约项目实战)

1-2、truffle与webjs亲密接触(truffle智能合约项目实战)

5,web3调用智能合约

在前面已经完成简单的合约编写

使用web3调用此函数

Web端的代码使用web3进行智能合约的访问

首先在cmd以管理员身份进入项目
Truffle develop(进入开发模式)

对合约编译部署,再使用web3js进行实例化调用合约

Compile
Deploy

回到web3中文文档

http://cw.hubwiz.com/card/c/web3.js-1.0/1/2/14/

其下方有个智能合约模块

进入到部署合约的地方

注意此部署方法和之前的将合约部署到链上是不同的

之前的deploy是truffle的一个命令

而这个的deploy是web3提供的一个函数

此方法仅仅是合约部署的,部署成功后,可以返回一个合约的示例

想要调用合约的前提就是要new一个合约的对象,在上一个视频remix本身部署合约实例

实际此处的方式用的不多,而比较常见的方式在本文档未做收录

实际也比较简单

首先声明变量(名称无所谓主要存智能合约)

通过合约的名称有then的回调函数,一旦部署成功,instance就是实例化成功的合约,前提合约已经成功部署到区块链上,可以将其交给变量

 MathContract.deployed().then(function(instance){myContract=instance})
 myContract.mulAtoB(3,4)

此时可以通过此调用合约的方法,说明合约已经创建成功实例,并且已经调用了

这是第一种方式,此方式适合智能合约内部进行相互调用

这节课会讲两种方式,都要记住

下一章节都会用到

第二种方式

这两种方法都是创建合约的实例也就是合约的对象,只有创建了对象,才能调用其函数

上方的ABI接口就是下方的

new web3.eth.Contract(jsonInterface[, address][, options])

需要合约的ABI和其地址

这里如果有两个一模一样的合约其部署后的ABI是一样的,但是合约地址时唯一的

new web3.eth.Contract(jsonInterface[, address][, options])

中括号是可选的,建议加上,后续再加入比较麻烦

第一个参数输入ABI

此时复制ABI,将中括号及其内容复制

注意不能直接复制(有换行),在百度搜索json压缩为一行,将其压缩后作为第一个参数

[{"constant":true,"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"mulAtoB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"}]

第二个参数是当前以及部署成功的合约地址

myContract = new web3.eth.Contract([{"constant":true,"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"mulAtoB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"}],'0x316b5270F33d597121003449cF7632E8658f08b0')

实际返回的是json结果

说明智能合约已经创建成功了

如何调用,不能直接调用

在method方法中找到我们要调用的函数名称如下,

此时调用如下

 myContract.methods.mulAtoB(3,4).call()


使用call()说明此方法为只读方法,此函数的执行不会影响到合约的写的操作,不会更改合约的状态

但是send()方法以后会修改合约的状态

完整的调用方式

两种使用web3js调用合约的方法已经讲完

而第二种方式更为常见,因为合约地址是唯一的,也适合项目外的合约的调用,如另外的账户想给此合约转账,就需要用到此合约的地址

搞定此后

在整个项目中有truffle-config,js文件

此文件

此文件的配置相当重要

Truffle默认关联的本地端口和ip

'http://127.0.0.1:9545/'

当我们合约要部署到公有链时,就要配置指定的端口和id

想要将编码设置Wie0.6版本,但设置报错,可以配置完成

trufflesuite.com/docs/advanced/configuration

官方给了网站可以通过此查看一些相关的配置

指定truffle默认私有链端口和ip

Truffle的缺陷都是使用命令操作,下一讲为界面方式,而truffle需要链接到界面的区块链

需要更改端口ip

修改配置


测试一下将版本改一下

退出开发模式,打开发现端口没有变,

但重新的部署可以重新编译部署

Deploy --reset

编译成功

奇怪配置文件应该加载成功了,但端口号并没有改变

这里端口改变了为什么没有加载成功

这里是个bug,发现truffle进来的是develop

故需要


此时成功了端口改变了

下一节进行区块可视化等

6,Ganache

在上节课对智能合约进行了调用操作,但此方法有缺点,后续查看信息需要web3提供的命令,命令容易忘记

在快速入门truffle

使用

需要链接以太坊网络

https://learnblockchain.cn/docs/truffle/quickstart.html

Truffle提供测试区块链即开发者模式,是本地系统不会和以太坊

可以通过ganache,桌面应用同样会创建一个个人区块链

所有信息界面

下载对应的电脑系统版本

Quickstart快速创建一个私有链

区块信息,通过此软件我们也可以部署合约

一般不会这么做,通过truffle链接此,作为显示的终端来的

Truffle端口为7545

要记住networkid5777 及端口

更改上节课的truffle项目的配置端口号为7545,而network_id设置为"*"也行,设置为5777也是可以的,这里不涉及版本就不用调了

truffle develop

进行转账,使用ganache提供的账户而不是控制台中的

truffle(develop)> web3.currentProvider

前面已经执行的端口是7545,而web3是内置truffle中的,所以其链接的网络也是7545

实现账户转账,对ganache中的两个账户

web3.eth.sendTransaction({from:'0xC356655708A4Af3374A9240f803B584cbCa54D6c',to:'0x5637bE68d44aE6E2c83D9f92b7E8211f846ce076',value:web3.utils.toWei('10','ether')})

查看如下


这里有新的区块,区块中有一笔交易,交易后面7919结尾的是交易的hash

想将前面的合约部署到ganache提供的私有链如何做

控制台本身链接到了7545直接deploy --reset

这里有两个合约

有很多交易信息

区块也多了4个

这些交易信息也部署到了区块中,真实场景可能交易部署到一个区块上

要根据合约的地址查看


有些区块的交易是没有的,看到有两笔交易,实际不止两笔交易,合约在部署时要调用合约的构造方法,若没有默认有构造方法,构造方法的调用也会产生交易

转账合约部署等都可以在ganache展示,基本的truffle,web3调用就完成了

下节讲基于web开发的智能合约,开发调试部署整个流程

相关推荐
dingzd9534 分钟前
Web3的核心技术:区块链如何确保信息安全与共享
web3·去中心化·区块链
清 晨35 分钟前
Web3与智能合约:区块链技术下的数字信任体系
web3·区块链·智能合约
CertiK2 小时前
Web3.0安全开发实践:Clarity最佳实践总结
web3·区块链·clarity
加密新世界2 小时前
Move on Sui入门 004-在sui链上发布Coin合约和Faucet Coin合约
区块链
YSGZJJ6 小时前
股指期货的套保策略如何精准选择和规避风险?
人工智能·区块链
web3探路者15 小时前
深入探索Solana链上的Meme生态:创新、潜力与挑战#区块链开发#dapp开发
web3·区块链·团队开发·dapp开发·区块链技术·链游开发·交易所开发
加密新世界1 天前
指南: 如何在 MEV 项目中使用 Yul
区块链
程序猿阿伟2 天前
《C++编写以太坊智能合约:安全至上的编程之道》
c++·安全·智能合约
MavenTalk3 天前
solana链上智能合约开发案例一则
rust·区块链·智能合约·dapp·solana
kejijianwen4 天前
Algen的跨链互操作性:增强区块链连接性
运维·centos·区块链