menu 牢记自己是菜
智能合约安全分析学习----Day4 私有链的合约配置
1054 浏览 | 2020-07-30 | 阅读时间: 约 3 分钟 | 分类: 智能合约 | 标签:
请注意,本文编写于 1338 天前,最后修改于 1153 天前,其中某些信息可能已经过时。

0x1 前言

啊!七月三十号了,马上就要开学了,感觉自己现在差的还是好远。但是与同学玩的还是蛮开心的。今年由于疫情原因,同学们的开学时间还是有很大差异的,周围上学期没开学的同学们也逐渐开始上课了。本身这篇文章应该是昨天晚上就可以产出的,但是因为好兄弟后天要实习了,下次再见可能就寒假了,所以昨天晚上出去喝酒了。自己的生物钟又被打破了,但是昨天还是蛮开心的。喝完酒我们去压马路,一路上从满是遗憾高中校门,一直压到噩梦满满的初中校门。确实,酒壮怂人胆,要不是我们昨天声音太大,把门口的保安吵醒了,我们可能就翻回初中了。虽然我们曾经的教学楼已经不复存在了,伤心。不说了继续今天的正题。整个以太坊的合约都使用的是Solidity语言进行开发的,看起来还是相当难受的。所以学习进度也有些许放缓。


0x2 合约的开发

以太坊的合约开发环境不是很多,主要是有两种方式:

  • DApp开发套件Treuffle
  • Solidity开发环境Remix IDE
  • Solidity开发环境EthFiddle

这里我们选择Remix IDE的线上开发环境进行实验。线上网址在这里;http://remix.ethereum.org
嗯界面看起来真的高级,那么我们开始来编写我们的第一个合约。合约是Solidity语言进行编写的,编写完成后,我们会那到我们的合约代码。使用我们的合约代码可以完成对合约的部署。

pragma solidity ^0.4.20;
contract hello{
    string greeting;
    
    function hello(string _greeting) public{
        greeting=_greeting;
    }
    
    function say() constant public returns (string){
        return greeting;
    }
}

代码很简单,就算是没有Solidity语言基础我们也可以大概看个明白。我们定义了一个字符串greeting,然后内部有一个函数命名say(),将我们的字符串进行输出。我们等会会将这个合约部署在一个账户上,我们就可以对合约进行调用了。
之后我们生成我们的合约:

我们找到“WEB3DEPLOY”下生成的东西,这就是我们的合约代码:

var _greeting = “hello world” ;
var helloContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
var hello = helloContract.new(
   _greeting,
   {
     from: web3.eth.accounts[2], 
     data: '0x608060405234801561001057600080fd5b506040516102a83803806102a8833981018060405281019080805182019291905050508060009080519060200190610049929190610050565b50506100f5565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061009157805160ff19168380011785556100bf565b828001600101855582156100bf579182015b828111156100be5782518255916020019190600101906100a3565b5b5090506100cc91906100d0565b5090565b6100f291905b808211156100ee5760008160009055506001016100d6565b5090565b90565b6101a4806101046000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063954ab4b214610046575b600080fd5b34801561005257600080fd5b5061005b6100d6565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009b578082015181840152602081019050610080565b50505050905090810190601f1680156100c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561016e5780601f106101435761010080835404028352916020019161016e565b820191906000526020600020905b81548152906001019060200180831161015157829003601f168201915b50505050509050905600a165627a7a72305820eb8b34cfee5708836c5c36a9d510c8737d5d2b956e4fb05d15f40a00024a5f8a0029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

这里我们对合约进行了一点点的修改:

  • 我们将var _greeting后面的参数改为了“hello world”,这样整个合约,就是一个打招呼的合约
  • 我们将部署合约改为了账户3:from: web3.eth.accounts[2]

0x3 合约的部署与运行

好了我们已经拿到了这个合约,下面我们就要完成我们的合约的部署了。进入控制台,查看一下我们的帐户。然后将我们的合约直接粘贴进去,由于各项参数我们已经修改过了,所以我们并不需要进行过多的操作。

这里很容易出现一下几个错误:

  • Error: authentication needed: password or unlock
    账户没有解锁:如果在局域网搭建的测试环境,部署合约时会报unlock的错误,需要先解锁账户。这里与转账操作前需解锁账户很像。如果长时间不操作,账户会自动上锁。
  • (anonymous): Line 1:47 Unexpected token ILLEGAL (and 6 more errors)
    代码中有非英文字符,一般是markdown的自动转码过程中将英文”” 转为了中文“”,请仔细检查一下。这个一般是因为复制粘贴的锅,检查一下就好了。
  • Error: insufficient funds for gas * price + value
    账户里没有足够的eth币,给创建合约的账户里弄些以太币。因为在你部署合约时,需要在挖矿状态下进行的,也是需要消耗gas的。
  • Error: intrinsic gas too low
    调高发布合约时的gas值。系统都觉得你太抠门了,gas都没办法支付给矿工了。

部署后开启挖矿操作,完成合约的部署。U2账户花费gas

运行一下,完成部署

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!