智能合约编译器Remix IDE

Error: The method eth_getCompilers does not exist/is not available
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at <anonymous>:1:1




========》
智能合约编译器Remix IDE
废弃eth_compile函数族
动机:
eth_compile* RPC调用不在eth API负责范围内,而eth API应该是只包含以太网节点的核心功能。由于以太坊只在底层EVM字节处理,所以API层不应该暴露任何与高级语言相关的事情。管理,未获和升级编译器版本,标志和产生的ABI都会对实现增加额外的复杂因素。
此外,通过给Solidity,Serpent和LLL语言提高地位来限制其他基于EVM语言开发的使用会潜在地扼杀新方案的开发和采用。最后,eth_compile*函数族无法满足DApp应用程序某些使用场景,因为它们不允许固定到特定的编译器版本。所以在geth 1.6版之后就废弃了这个函数。
动作:
在文档中标记eth_compileSolidity, eth_compileSerpent和eth_compileLLL方法无效,同时建议改用恰当的开发工具替代。
编译器功能可能仍然会提供,但是只在特定节点RPC名字空间内。


所以可通过在线或离线方式来编译合约:

在线方式是直接进入网址:

https://remix.ethereum.org
进行编译。


离线方式有两种,如下:

1.离线安装remix-ide:
先安装npm和node.js,然后再:
由于Remix-ide已经发布成一个npm模块,所以:
npm install remix-ide -g
智能合约编译器Remix IDE
再启动remix-ide:
智能合约编译器Remix IDE
2.从github上clone代码仓库:
git clone https://github.com/ethereum/remix-ide.git
cd remix-ide
npm install
npm run setupremix  # this will clone https://github.com/ethereum/remix for you and link it to remix-ide
npm start

开发:
运行npm start(离线方式的第一种就是启动remix-ide即可),在本地浏览器打开http://127.0.0.1:8080。
智能合约编译器Remix IDE
这就可以开始编辑开发合约了,而大多数浪费在其他模块比如debuger等上的时间就可以省掉了。


编译:

直接点击编译如下:

智能合约编译器Remix IDE
每次在当前文件有改变或者其他文件被选中时,Remix默认触发编译指令,若当合约有许多依赖或者耗时要很长时,可能会禁止

自动编译autocompile。

在每次编译过后,合约会更新到一个全新的被编译过的状态。

Details详细模块对话框显示的是当前被选中合约的详细信息。从这个标签还可以将合约发布到Swarm(只有非抽象智能合约才可以发布到Swarm),Swarm是一个去中心化文件服务。发布的数据特别地包含abi和solidity源码。

在合约发布后,可点击details通过bzz URL方式查看找到它的元数据信息。
编译错误和提示会在合约区下方显示出来,每一次的编译,静态分析标签会创建一个报告,即使编译器不编译在定位报告问题时
这也很有价值。点击它可看到,它跳转到Analysis条目:

智能合约编译器Remix IDE

智能合约编译器Remix IDE


这里会给出最后的编译信息,它给出了合约代码的详细信息,可帮助避免代码错误和执行最佳做法。

运行:
Run标签可将交易发送到当前环境。
Run配置解释:
下面的设置会直接影响交易执行:
1.Environment:
JavaScript VM:表示所有的交易会在浏览器内的一个沙盒区块链内执行,也就是在上面做任何执行操作都不会写到真实的系统中去,意味着当重新加载一页时会重启一个新的区块链,旧的不会被保存。
Injected Provider:表示Remix会连接到一个注入的web3提供者。Mist和Metamask就是注入web3提供者的实例,因此可使用该选项。
Web3 Provider:表示Remix会连接到一个远程节点,必须提供URL地址给被选中的提供者:geth,parity或任何其他以太坊客户端。
2.Account:
和当前环境相关的账户列表(和它们相关的余额)
3.Gas Limit:
用来给所有在Remix中创建的交易设置gas的最大值。
4.Value:下一个被创建交易的值的数量(在每个交易执行后该值总会被重置为0)
智能合约编译器Remix IDE
初始化实例:
该区域包含被编译的合约和2个操作:
At Address: 表示假设给定地址是选中合约的一个实例,随后它可能会和一个已经部署的合约交互。关于这个问题点这里没有做检查,所以当使用这个功能时要特别小心,要确定这个地址的合约是可信任的。
Create: 表示发送一个交易部署选中的合约,当交易被挖矿时,新创建的实例将会被添加(这可能会耗时几秒),需要注意如果constructor带有参数,这里也必须指定这些参数。

挂起实例:
验证一个交易需要耗时几秒种,在这期间,GUI显示的是处于挂起模式,当交易被挖矿时,挂起交易的数量会更新同时该交易也会被添加进log中,在终端可看到,如下:
智能合约编译器Remix IDE

终端中有以下功能:

1.它集成一个JavaScript解释器和web3对象。它能让JS脚本执行并且与当前上下文交互。(注意web3只有在web provider和injected provider模式才有效)

2.它显示当和Remix IDE交互时所做出的重要动作(比如,发送一个新的交易)
3.它显示当前上下文中被挖矿的交易。还能够选择显示所有的交易或者只显示Remix所知道的合约交易(比如,从Remix IDE创建的交易)
  4.它允许从终端搜索数据和清除日志。

实例列表:
该部分包含要交互的实例列表。
  1.被调用函数在solidity用constant或pure声明的。该动作具有蓝色背景,点击它不会创建新的交易。因为点击它不会发生状态改变,所以没有
  必要去点击它,但是它会更新该函数的返回值。
  2.被调用函数无特殊关键字的。这种动作背景色为浅红色,点击它会创建一个新的交易,但是交易不能接受任意数量的以太币。
  3.被调用函数在solidity中用payable声明的。这种动作背景色为红色,点击它会创建一个新的交易并且该交易能够接受以太币。

更多的关于Solidity修改器,可参考地址:
https://solidity.readthedocs.io/en/develop/miscellaneous.html?highlight=pure#modifiers

若一个函数需要输入参数,则必须指定输入参数。

使用ABI:
使用Create或At Address是Remix的经典用法。但是通过使用它的ABI也是可以与合约交互的,ABI是一个描述它的接口的JSON数组。
若要通过ABI和合约交易,则可在Remix内创建一个扩展名为*.abi的文件,再把ABI内容拷贝进去。然后在At Address旁边的输入框内输入想要于它交易的合约地址。点击At Address,在下面就会弹出一个新的与合约产生的连接。
可参考网址:
https://blog.csdn.net/ddffr/article/details/76549320

使用记录器:

智能合约编译器Remix IDE

记录器允许以JSON文本形式保存交易并在随后可以在同样的环境或者另外一个环境来重新运行这些交易。

保存到JSON过程运行简单地检查交易列表,调整输入参数,改变链接库等。
记录器有许多用途,比如:
1.在一个受限环境内编码和测试合约后(比如在JavaScript VM模式),可能会更想要将它更容易地重新部署到一个更为永久的环境(比如一个Geth节点)以便检测在一个传统环境内所有事情表现的是否正常。
2.部署合约常要求不止创建一个交易
3.在一个dev环境工作常首要的要求就是配置状态。

保存的记录需要创建以下类型的内容:
在该记录中,执行了三个交易
第一个对应的的是库testLib的部署。
第二个对应的是合约test的部署,构造函数的第一个参数被设置为11,该合约依赖一个库,该使用属性linkReferences来做链接。
在这种情况下,使用之前创建的库的地址:created{1512830014773}number就是交易id(时间戳)它使得库被创建。第三个参数对应着合约test的函数set的调用(属性被设置为:created{1512830015080}),输入参数为1和0xca35b7d915458ef540ade6068dfe2f44e8fa733c。通过账户account[0]的值来创建这些交易:
  {
"accounts": {
    "account{0}": "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
},
"linkReferences": {
    "testLib": "created{1512830014773}"
},
"transactions": [
    {
    "timestamp": 1512830014773,
    "record": {
        "value": "0",
        "parameters": [],
        "abi": "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a",
        "contractName": "testLib",
        "bytecode": "60606040523415600e57600080fd5b60968061001c6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b604a6060565b6040518082815260200191505060405180910390f35b6000610d809050905600a165627a7a7230582022d123b15248b8176151f8d45c2dc132063bcc9bb8d5cd652aea7efae362c8050029",
        "linkReferences": {},
        "type": "constructor",
        "from": "account{0}"
    }
    },
    {
    "timestamp": 1512830015080,
    "record": {
        "value": "100",
        "parameters": [
        11
        ],
        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
        "contractName": "test",
        "bytecode": "60606040526040516020806102b183398101604052808051906020019091905050806000819055505061027a806100376000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632f30c6f61461006757806338cc48311461009e57806362738998146100f357806387cc10e11461011c575b600080fd5b61009c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610145565b005b34156100a957600080fd5b6100b1610191565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066101bb565b6040518082815260200191505060405180910390f35b341561012757600080fd5b61012f6101c4565b6040518082815260200191505060405180910390f35b8160008190555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008054905090565b600073__browser/ballot.sol:testLib____________636d4ce63c6000604051602001526040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b151561022e57600080fd5b6102c65a03f4151561023f57600080fd5b505050604051805190509050905600a165627a7a72305820e0b2510bb2890a0334bfe5613d96db3e72442e63b514cdeaee8fc2c6bbd19d3a0029",
        "linkReferences": {
        "browser/ballot.sol": {
            "testLib": [
            {
                "length": 20,
                "start": 511
            }
            ]
        }
        },
        "name": "",
        "type": "constructor",
        "from": "account{0}"
    }
    },
    {
    "timestamp": 1512830034180,
    "record": {
        "value": "1000000000000000000",
        "parameters": [
        1,
        "0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
        ],
        "to": "created{1512830015080}",
        "abi": "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec",
        "name": "set",
        "type": "function",
        "from": "account{0}"
    }
    }
],
"abis": {
    "0xbc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a": [
    {
        "constant": true,
        "inputs": [],
        "name": "get",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    }
    ],
    "0xc41589e7559804ea4a2080dad19d876a024ccb05117835447d72ce08c1d020ec": [
    {
        "constant": true,
        "inputs": [],
        "name": "getInt",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getFromLib",
        "outputs": [
        {
            "name": "",
            "type": "uint256"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": true,
        "inputs": [],
        "name": "getAddress",
        "outputs": [
        {
            "name": "",
            "type": "address"
        }
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    },
    {
        "constant": false,
        "inputs": [
        {
            "name": "_t",
            "type": "uint256"
        },
        {
            "name": "_add",
            "type": "address"
        }
        ],
        "name": "set",
        "outputs": [],
        "payable": true,
        "stateMutability": "payable",
        "type": "function"
    },
    {
        "inputs": [
        {
            "name": "_r",
            "type": "uint256"
        }
        ],
        "payable": true,
        "stateMutability": "payable",
        "type": "constructor"
    }
    ]
}
}


参考网址:https://remix.readthedocs.io/en/latest/