一、编写智能合约
首先要写使用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地址:
同样,其他的框架也可以在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,确认支付手续费
会有确认信息