Solidity合约记录——(二)如何开始书写合约

以往的老规矩是写代码即来Hello World,事实上Solidity实现这个功能并不难。见如下代码:

1 pragma solidity ^0.4.11;
2
3 contract HelloWorld {
4     string src = "Hello World!";
5
6     function print(string name) returns (string, string, string){
7         return ("Name is ", name, src);
8     }
9 }    

写Hello World 就遇见尴尬的一幕,Solidity原生是不支持字符串拼接也不建议字符串拼接,为了提高执行效率可以一次返回多个字符串。以下为执行结果:

Function [print] invoking...
Invoke args:
From
0xca35b7d915458ef540ade6068dfe2f44e8fa733c
To
0xdc544654fefd1a458eb24064a6c958b14e579154
Constant
false
Payload
11114af1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087a68616e676a6965000000000000000000000000000000000000000000000000
Invoke finish
Result
0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000084e616d652069732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087a68616e676a6965000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c48656c6c6f20576f726c64210000000000000000000000000000000000000000
Decoded
["string: Name is ","string: zhangjie","string: Hello World!"]
TxHash
0xc460c28c8d14d53c96b3199b9f0d04ba34d3b8f9f2de92dc6f8ed420324efe92
From
0xca35b7d915458ef540ade6068dfe2f44e8fa733c
To
0xdc544654fefd1a458eb24064a6c958b14e579154

那么真正开始针对具体业务需求而言,开发一个真实场景可用的智能合约应当分为以下几个步骤(引用内容):

开发流程

合约接口定义
按照良好的编程习惯,在编写业务方法前,首先定义接口,并交付给调用者。

数据结构定义
用户定义的合约接口中,如果有比较复杂的输入/输出数据,就有必要提前定义一些数据结构,并提供操作这些数据结构的一些常用方法(主要是一些序列化成JSON字符串的方法)。

业务合约编写
实现合约接口定义,并实现用户的业务逻辑。在业务合约的构造函数中,需要把业务合约注册到模块合约中。

如果用户只是想编写业务合约,做学习,测试用,则可以把业务合约注册到"juzix.io.debugModule"这个特殊名称的模块合约中,则用户可以不需要编写模块合约,从而在JUICE客户端IDE中直接调用业务合约的方法。

模块合约编写
编写模块合约,这是JUICE开放服务平台的要求,以便管理用户的DAPP应用、业务合约。在模块合约的构造函数中,需要把模块合约注册到链上,并在构造函数中说明模块合约将会使用到的所有业务合约。

用户编写了模块合约、并部署到JUICE区块链后,模块的名称将会显示在JUICE开放服务平台的“我的应用”中,点击“我的应用”的某个应用,将会跳转到用户开放的DAPP应用。如何设置应用的跳转URL,参考模块合约编写

 https://open.juzix.net/api_doc/part03/example/modules.md

编译部署、测试
通过JUICE客户端,或者在线IDE,都可以完成编译、部署、测试用户合约。

参考内容:https://open.juzix.net/doc

开始研究一个具体的应用场景,首先应当做到的是合约接口定义、数据结构定义。将整体的合约结构关系理清后,合约代码实现事实上应当是较为简单的。实现部分应当注意合约中可能存在的风险,但凡有可能出现问题但是较为极端的情况,如果不避免就一定会出现问题。合约代码不同于其他代码,部署后基本不可修改,仅能进行升级、冻结等操作,不同操作与具体平台相关。而后我们来分析一部分代码,同时假设一个应用场景来对其进行实现。

我们来看台湾一个智能合约书写实现:参考链接

首先将参与方所对应的角色都列举出来,而后将不同参与者的所需操作作为方法进行列举,作为角色对外接口;之后开始编码实现。

原文地址:https://www.cnblogs.com/tianxia2s/p/9365357.html

时间: 2024-08-02 09:38:07

Solidity合约记录——(二)如何开始书写合约的相关文章

使用remix的solidity在线编译环境部署一个faucet合约

一.浏览器打开https://remix.ethereum.org 地址 点击"+"新建一个sol文件,命名为faucet.sol 然后在代码区输入solidity代码 选择相关插件 将Solidity compiler.Deploy & run transactions插件激活,选择编译 编译成功后,会显示一个绿色的勾 再点击“Deploy & Run Transaction” 部署环境选择"Injected web3",这样把通过metamask

solidity开发以太坊代币智能合约

智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity. 让我们先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. contract SimpleStorage { uint storedData; functi

Windows API 编程学习记录<二>

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Spring Boot学习记录(二)--thymeleaf模板

Spring Boot学习记录(二)–thymeleaf模板 标签(空格分隔): spring-boot 自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好的和spring集成.下面开始学习. 1.引入依赖 maven中直接引入 <dependency> <groupId>org.springframework.boot</gr

前端常用功能记录(二)—datatables表格(转)

前端常用功能记录(二)—datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添花!DataTables提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化.统计等强大功能. 工作中对程序员的学习模式才深有体会,不是从入门到精通,而是从会用到了解.对于我来说,基本都是拿到一个知识先做个东西出来,再来细细品味个中的细节,然后

Solidity高级理论(二):Gas

solidity高级理论(二):Gas 关键字:Gas.结构体.节省小技巧 Gas是什么 在Solidity中,用户想要执行DApp都需要支付一定量的Gas,Gas可以用以太币购买,所以,用户每次使用DApp都会发费以太币. 一个 DApp 收取多少 gas 取决于功能逻辑的复杂程度.每个操作背后,都在计算完成这个操作所需要的计算资源,(比如,存储数据就比做个加法运算贵得多), 一次操作所需要花费的 gas 等于这个操作背后的所有运算花销的总和. 由于运行你的程序需要花费用户的真金白银,在以太坊

solidity编程开发语言——以太坊智能合约利器

这篇关于Solidity教程的博客展示了很多Solidity特性.本教程假定你对以太坊虚拟机和编程有一定的了解. 以太坊,"世界计算机"提供了一个非常强大的全球共享基础设施,使用名为Solidity的编程语言构建去中心化应用程序. 让我们开始我们的Solidity教程,介绍Solidity. 什么是Solidity? 以太坊Solidity是一种面向智能合约的高级语言,其语法与JavaScript类似.solidity是用于生成在EVM上执行的机器级代码的工具.solidity编译器获

netty 学习记录二

netty 最新版本是netty-5.0.0.Alpha1,去年10月份发布的,至今没有发新版本,估计这个版本还是比较稳定. 整包下载,里面包含一个 netty-example-5.0.0.Alpha1-sources.jar文件,提供了比较丰富的example例子,多看几遍还是非常有收获的,这里记录下. 先来看下channelHandler的两个不同继承: 方式一:直接从ChannelHandlerAdapter类里继承,读取操作从channelRead方法里执行 @Sharable publ

C#博客记录二

1.认识运算符 我认为其中 最重要的就是逻辑运算符,对于每个人来说学习web前端就是要有一个好的思维.能够更好的运用. 2.算数运算符 变量名++意味先输出,值后增加. ++变量名意味值先增加,后输出. --和++类型相同,只是值是减少. 3.赋值运算符和逻辑运算符 个人感觉赋值运算符记住就行,例如sim*=表示为sim=sm*,其它类似. 逻辑运算符的返回类型都为bool类型,主要常用的==,&&(这个表示两个为真就为真,其余为假)||(这个表示两个为假就为假,其余为真)!(个人理解为不