使用Truffle框架和Geth编写一个自己的Dapp

一、编写智能合约

首先要写使用solidity语言编写自己的智能合约,我这里写得是一个很简单的工薪系统,网上也有很多教程,这里就不多说了。

写完之后如果想编译或者调试,建议使用remix来进行调试。

 

二、truffle安装以及初始化项目

写完之后下载truffle:

npm install truffle -g

 然后我们使用truffle初始化项目,首先要新建一个项目文件夹。如果只是想部署合约而不要求制作带有web界面的dapp,只需要执行:

truffle init

事实上,在一些老版本的truffle中,使用上面这条命令也可以生成带有界面的项目。

但我们要做成具有可交互界面的dapp的话,就要用下面的命令:

truffle unbox webpack 

上面这个是基于webpack框架的,也有基于react或者其他框架的,这要用truffle unbox react命令或者其他命令了。

我使用的是 webpack的框架。在unbox的过程中,有可能会因为各种原因出错。但这也不要紧,只需要上github把它的仓库下载下来,然后使用npm install全部安装或者用npm一个个安装缺失的包就好了。下面给出webpack-box的github地址:

https://github.com/truffle-box/webpack-box

 同样,其他的框架也可以在github上搜得到。

项目初始化完大概长这样,build是后面生成的所以应该还没有:

 

三、编译以及部署合约

首先打开contracts文件夹,在里面把你的合约复制进去。

 在migrations文件夹里新建一个2_deploy_contracts文件,文件内容如下,我这里有两个合约,只要根据合约的实际进行更改就好了:

修改truffle.js文件,network下面的是你的网络名称,比如我这里把它设成haha,然后下面设置私链的主机和端口号,我这里设成8545:

然后就可以编译合约了,先在geth下运行区块链,这里也可以用testrpc启动私链,用testrpc肯定会方便一点,因为不用挖矿,而且会有默认的账户,但是我这里使用的是geth:

geth --datadir data0 --networkid 1108 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3"  -rpccorsdomain "*" --nodiscover --ipcdisable console 2>>geth.log
 

然后解锁账号:

personal.unlockAccount(eth.accounts[0],"你的密码", 100000000)

 使用下面的命令编译:

truffle compile

似乎windows下有可能会报错,因为这条命令调用了目录下的truffle.js,所以你可以这样写:

然后,会产生错误和警告,警告大部分都不用管,编译完成后,可以看到它把一些文件写入了build目录:

如果要重新编译,要把build文件删除,不然会报错。

合约部署使用下面的命令:

truffle.cmd deploy --network "网络配置名" 

还记得在前面的truffle.js里面的network吗,我在那里面设置了haha网络。所以结果如下:


 

在geth中使用 txpool.status 可以看到有一个交易正在 pending

 

使用挖矿命令 

miner.start()

miner.stop() 

挖矿后

这个部署的合约地址可以保存下来,就是这个:

 

 

这里要挖矿是因为要把合约写入块内,必须挖矿确认,在后面可以看到,那些需要修改合约的函数也需要挖矿,而那些获取合约内容的就不用。 

到这里合约已经部署好了,下面说一下在geth上调用合约,虽然最后的dapp不需要在geth上调用合约(truffle封装好了),但是这是一种有效的调试手段。

 

四、在Geth上调用合约

首先在\build\contracts目录下找到合约对应的json文件,然后打开,将它的abi复制出来,在网上在线压缩成一行。

 在geth上设置address变量,就是前面部署时输出的合约地址,abi变量就是上面提到的abi,然后

var test = web3.eth.contract(abi).at(address);

 这样我们就拿到了合约。

调用合约很简单,对于不需要改变合约内容的函数(比如获取一个值),只需要call方法:

合约变量名.函数名.call({from:"账号地址"})

对于更改合约内容的函数,要用以下方法,并且要挖矿来确认(就像前面部署合约一样,据说可以用dev模式自动挖矿):

合约变量名.函数名.sendTransaction({from:"账号地址",gas:gas的量})

test.addFund.sendTransaction({from:"0x21817935bbacca1ae01824d5b6e06b5da53aa081", value: 10, gas:4700000})

 

 五、构建web界面

启动所需要的命令为,启动后可以看到它给你的示例界面:

npm run dev 

运行在8080端口 

 下面要安装google浏览器插件Metamask,它能帮助你更好的跟Dapp实现交互,安装就不细讲了。

安装好后修改网络 

通过json file的方式导入账号,json文件在你的私链的keystore里面可以找到你各个账号对应的json文件:

 

设置chainid

可以看到network后面跟着“1”,在metamask里面的setting中的New Network填入并保存

 

在app文件夹的相关里编写你需要的内容,其中js文件中要获取Metamask账号 可以这样写:

修改合约内容函数用sendTrasaction(要挖矿确认),不用修改的用call,示例:

 

使用函数时,Metamask会弹出窗口:

点击confirm,确认支付手续费

会有确认信息

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值