开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
一、什么是Solidity
Solidity是以太坊虚拟机(EVM)智能合约的语言。智能合约与现实世界中的合约本质是一样的,只不过智能合约是以代码的形式存储在区块链上,并且它具备自执行的能力。也就是说当满足智能合约中代码执行的条件时,智能合约上相应的那些代码就会自动触发执行。智能合约还具备另外两个特性:去中心化和防篡改性。去中心化的意思是一份智能合约是被广泛部署在区块链节点上的,不存在中心化的控制行为。防篡改的特性使得智能合约一旦部署到链上,任何人都无法对它随意修改,因为其他节点可以很容易发现此合约被修改,修改是无法生效的。
区块链的一个主要特点,是实现了多方的共识。在比特币体系中,需要达成的共识操作是固化的,其共识的仅仅是价值所有者的改变。但在以太坊上,开发者可以自己编写需要共识的逻辑,在以太坊上开发者们倾向于选择Solidity语言,实现自定义的共识逻辑。因此,在以太坊生态里有很多用Solidity实现的开源项目,掌握Solidity语言,能够让你快速了解这些项目的情况,成为一名高阶Web3玩家。
二、Solidity编译部署
Solidity是一种高级编程语言,与其他高级编程语言一样需要编译成字节码才能被机器执行。为了便于理解,可以将Solidity和Java的编译、运行过程做一下对比:
Solidity代码经过编译后形成了OPCODE,这是一种标准的堆栈操作码,会对EVM进行一系列简单的堆栈操作,比如POP、PUSH、ADD、SUB等等,也有区块链特殊的指令,如ADDRESS, BALANCE, BLOCKHASH等。这个网站上有EVM支持的全部操作码,并且给出了每条操作码的解释和堆栈操作的简单示意图:ethervm.io/,这里先不细究,如果以后coding遇到问题再去查看。
三、简单实践
在开发工具上,初学者适合先选用Remix IDE,集成代码编写、编译、部署、调试与运行功能与一体。后面做复杂开发或者体系化开发工作,可以选用Hardhat或者truffle。
先从一个demo示例入手:
1.编写Solidity代码
2.编译
Remix IDE上提供了一键编译,对上面的代码进行编译后,我们可以得到此段代码的Bytecode片段:
608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100d9565b60405180910390f35b610073600480360381019061006e919061009d565b61007e565b005b60008054905090565b8060008190555050565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea2646970667358221220404e37f487a89a932dca5e77faaf6ca2de3b991f93d230604b1b8daaef64766264736f6c63430008070033
编译后的opcode:
PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x150 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2E64CEC1 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x6057361D EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0xD9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x73 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x9D JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x97 DUP2 PUSH2 0x103 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB3 JUMPI PUSH2 0xB2 PUSH2 0xFE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xC1 DUP5 DUP3 DUP6 ADD PUSH2 0x88 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD3 DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xEE PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xCA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10C DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP2 EQ PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BLOCKHASH 0x4E CALLDATACOPY DELEGATECALL DUP8 0xA8 SWAP11 SWAP4 0x2D 0xCA 0x5E PUSH24 0xFAAF6CA2DE3B991F93D230604B1B8DAAEF64766264736F6C PUSH4 0x43000807 STOP CALLER
3.部署
再用Remix进行合约部署,部署详情如下:
可以看到:
部署状态:true Transaction mined and execution succeed
部署账户:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
输入:0x608…70033,其实就是上一步部署后的bytecode内容,加前缀0x
以及交易hash,gas花费等情况,如果合约部署在以太坊公链或者测试链上,根据交易hash可以在对应的浏览器上查到此部署交易。
4.调用
此demo合约提供两个方法可以调用:store和retrieve,在Remix上也有直接调用合约方法的入口,并且可以看到每一次调用的交易详情,可以根据每次调用的交易hash在相应浏览器里查到相应的交易记录。
调用store方法:
调用retrieve方法:
四、小结
学习Solidity语言,首先应该理解区块链网络的特点,在此基础上,对比已经掌握的其他高级语言特性,来理解Solidity的编译、部署、运行整个生命周期。实践永远是学习编程语言最好的方式,在实践之前找到合适的工具,从简单的demo学起,边学理论知识,边动手实践,很快就可以get一门新的编程语言了。