以太坊智能合约语言Solidity - 1 走进Solidity

以太坊智能合约语言Solidity - 1 走进Solidity,第1张

1. 走进Solidity 1.1 Remix IDE 界面初识

在本地编写我们可能会遇到各种各样的问题,所以使用在线的Remix编译器来编写合约:https://remix.ethereum.org是一个比较好的选择。 我们先来看看Remix的界面的基本情况,整体结构非常简单,具体情况如下

1.2 使用Remix IDE 编译和部署合约

关于在以太坊上或者其测试网上进行智能合约的测试和部署方式有很多

第一种方式:使用以太坊客户端Geth部署

具体内容,读者可以参见本人的github MD文档:https://github.com/jianquanqin/publicChain

第二种方式就是使用各种钱包,这种方式比较简单,详细内容如下:

现在我们来创建一个HelloWorld文件,然后编写如下代码

//制定solidity的版本号,^代表向上兼容
pragma solidity ^0.4.0;

//合约,有点类似于于java中的class
contract Helloworld{
		
		//状态变量
    string Myname = "zhengjianxun";
    
    //public是修饰符,默认public类型的状态变量和函数,可供外部、子合约和内部合约调用,函数默认使用public
    //使用修饰符view修饰的函数不能修改状态变量,更准确的说不能修改以太坊区块链的状态

		//Getname是合约中的函数名
		//返回值要使用returns + 返回值类型的形式
    function Getname() public view returns(string)
    {
        return Myname;
    }

    function changeName(string _newName) public
    {
        Myname = _newName;
    }
		//pure修饰符既不允许修改状态变量也不允许读取状态变量
    function pureTest(string _name) pure public returns(string){
        return _name;
    }
    //如下的代码就不能通过编译
    //function pureTest(string _name) pure public returns(string){
    //   Myname = _name;
    }
}

现在我们编译并部署以上代码,成功部署后我们就会看到三个已经部署好的合约(函数)

现在我们开始执行这些合约,这里有三种情况:

changeName:因为在以太坊上执行改变状态变量的代码需要花费以太币,所以每执行一次它,都会消耗一定数量的以太币,以下是执行日志

status	true Transaction mined and execution succeed
transaction hash	0xa06020339bae8e9bf411486d61e48e3df690f3ff6d49128cc6860adeaddf2037
from	0x17F6AD8Ef982297579C203069C1DbfFE4348c372
to	Helloworld.changeName(string) 0xE2DFC07f329041a05f5257f27CE01e4329FC64Ef
gas	80000000 gas
transaction cost	29532 gas 
execution cost	29532 gas 
hash	0xa06020339bae8e9bf411486d61e48e3df690f3ff6d49128cc6860adeaddf2037
input	0x535...00000
decoded input	{
	"string _newName": "shiyiwei"
}
decoded output	{}
logs	[]
val	0 wei

Getname:只能读取状态变量所以无论执行多少次都不会有花费

pureTest:既不能读取也不能修改状态变量,所以执行时也不会有花费

以上是未使用钱包直接在remix中部署合约的 *** 作过程,接下来我们讨论如何使用钱包将合约部署在正真的以太坊网络上

1.3 钱包

1.安装 MetaMask钱包

使用谷歌浏览器添加扩展插件即可,安装后可以注册一个钱包地址,以便后续部署以太坊智能合约使用

2.安装 Myetherwallet

https://www.myetherwallet.com/

2.ENS原理

ENS是以太坊的一个命名服务,因为钱包地址很长,所以我们申请一个以太坊的域名,以方便后续使用

3.在测试网获取以太币

去链接找机器人索要测试eth:https://gitter.im/kovan-testnet/faucet#

1.4 编译并部署合约至以太坊主网或者测试网

下载安装Atom编译器,这里使用Atom编译器纯属个人习惯,不常用Atom的朋友直接在Remix中编译代码即可

https://atom.io/

安装插件:linter-solium, autocomplete- solidity, language-ethereum, linter-solidity
关于Solidity的更多内容,读者也可以参考鄙人的专栏:https://blog.csdn.net/weixin_51487151/category_11681449.html?spm=1001.2014.3001.5482

新建文件并打开文件夹

/Users/qinjianquan/EthereumSolidityIpfs/demo.sol

1.编写下列代码复制至remix IDE编译

pragma solidity ^0.4.19;

contract HelloWorld {

string Input = "hellowworld";

function GetInput() public view returns(string) 
  {
    return Input;
  }

}

2.查看字节码

{
	"linkReferences": {},
	"object": "60806040526040805190810160405280600b81526020017f68656c6c6f77776f726c640000000000000000000000000000000000000000008152506000908051906020019061004f929190610062565b5034801561005c57600080fd5b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6101a4806101166000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806348a7fa9d14610046575b600080fd5b34801561005257600080fd5b5061005b6100d6565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009b578082015181840152602081019050610080565b50505050905090810190601f1680156100c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561016e5780601f106101435761010080835404028352916020019161016e565b820191906000526020600020905b81548152906001019060200180831161015157829003601f168201915b50505050509050905600a165627a7a723058201f9a99483774a3acd170e5ce9c943202156385c53367ee60e427622bca3c60040029",
	--

3.查看ABI

[
	{
		"constant": true,
		"inputs": [],
		"name": "GetInput",
		"outputs": [
			{
				"name": "",
				"type": "string"
			}
		],
		"payable": false,
		"stateMutability": "view",
		"type": "function"
	}
]

4.部署合约

在这里我们先使用remix 自带的私链部署合约,步骤如1.2节的内容

在remix IDE 中的deploy & run transactions 中点击deploy就可部署上述编译好的合约,并且可以通过合约名称(GetInput)来运行合约

合约部署好会生成合约地址:0xd9145CCE52D386f254917e481eB44e9943F39138

在确保你的合约通过所有测试后可以将其部署到以太坊主网,此时在remix IDE中将部署environment选择为Injected Web3,网络会自动打开你的Metamask钱包插件,然后就可以按步骤部署到以太坊主网,当然你也可以将其部署到MetaMask链接的其他测试网络上

1.5 类和对象

接下来我们对智能合约代码结构有个大概的了解

常规意义上一个类有它的属性和方法,理解智能合约时可以采用与之类比的方法

pragma solidity ^0.4.19;

//可以把合约是一个类,相当于图纸,对象是具体的事物,相当于计算机
contract Computer {
  //属性
  uint public _a;

  //构造函数
  function Computer()public {
    _a = 15;
  }
  //行为(方法)
  function start() pure public returns (string) {
    return "开机";
  }
  
}

完整的智能合约包括开始、执行以及销毁

pragma solidity ^0.4.18;

//合约是一个类,相当于图纸,对象是具体的事物,相当于计算机
contract computer {
  //属性
  uint public _a;
  address public _owner;

  //构造函数
  function computer() public {
    _a = 17;
    _owner = msg.sender;
  }
  //方法 开始
  function start() pure public returns (string) {
    return "start";
  }

  //方法 执行
  function msgSender() public view returns (address) {
    return msg.sender;
  }

  //方法 销毁
  function kill() public {
    //只有合约创建者才能销毁合约
    if(_owner == msg.sender) {
          selfdestruct(msg.sender);
    }
  }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2992491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存