近期我们发布了名为 scrypt-ts 的项目,允许开发者可以使用 Typesript 语言开发 BSV 智能合约。今天很高兴在这里宣布一个最新进展,大家可以使用 npm 直接发布和使用 scrypt-ts 的库合约了。
scrypt-ts 库合约?智能合约库可以提供可以在许多合约中重复使用的功能,开发人员可以使用现有的库来降低开发自己的合约的成本。
scrypt-ts 智能库合约与普通合约有以下不同:
一个库合约不能有任何 public/entry @methods,这意味着一个库不能通过 tx 直接部署或调用,它们只能在普通合约或其他库中被调用。
库合约不能有任何状态属性,即被标记为 @prop(true) 的属性,但声明为 @prop() 的属性是可以的。
使用 scrypt-ts 我们可以像下面这样创建一个库合约类:
class MyLib extends SmartContractLib {
@prop()
buf: ByteString;
constructor(buf: ByteString) {
super(buf);
this.buf = buf;
}
@method
append(content: ByteString) {
this.buf += content;
}
@method
static add(x: bigint, y: bigint): bigint {
return x + y;
}
}
库合约需要声明为扩展 SmartContractLib 的类。它和普通合约一样也可能有 @props 和 @methods ,它们都需遵循之前介绍过的规则。 库合约的方法可以在 @methods 被使用,如下所示:
class MyContract extends SmartContract {
@method
public unlock(x: ByteString) {
// 创建库合约的实例
let myLib = new MyLib(hexToByteString('0123'));
// 调用库合约实例方法
myLib.append(x);
// 调用库合约静态方法
assert(MyLib.add(1n, 2n) === 3n);
}
}
你可以像测试普通类一样测试库合约,例如编写一些单元测试:
describe('Test SmartContractLib `MyLib`', () => {
it('should pass unit test successfully.', () => {
expect(MyLib.add(1n, 2n)).to.eq(3n);
})
})
另外,你可以写一个普通合约来调用库合约,之后针对普通合约编写一些测试,比如:
// 测试用的普通合约
class TestLib extends SmartContract {
@method
public unlock(x: bigint) {
// 调用库合约方法
assert(MyLib.add(1n, 2n) === x);
}
}
describe('Test SmartContractLib `Lib`', () => {
before(async() => {
await TestLib.compile();
})
it('should pass integration test successfully.', () => {
let testLib = new TestLib();
// 直接测试普通合约的公共方法
let result = testLib.verify(self => self.unlock(3n));
expect(result.success, result.error).to.be.true;
}
})
如果你已经构建了一个库合约,你可以考虑将它发布为一个 npm 包。 请注意,为了使导入系统正常工作,你应该始终发布自动生成的 sCrypt 合约(包括 scrypt.index.json 文件)以及 javascript 输出。 包的结构可能是这样的:
node_modules
|__ my_package
|__ dist
|__ myLib.js
|__ myLib.d.ts
|__ scrypts
|__ myLib.scrypt
|__ scrypt.index.json
…
scrypt.index.json 文件将在 typescript 编译时生成在与 tsconfig.json 相同的目录中,该目录应放在根文件夹中,并且不要手动移动或修改它。 你可以通过在 tsconfig.json 中配置 outDir 选项来更改自动生成的 sCrypt 文件的文件夹,例如:
"compilerOptions": {
"plugins": [
{
"transform": "../dist/transformer",
"transformProgram": "true",
"outDir": "my_scrypts_dir"
}
]
}
库合约的用户可以使用 npm install 来安装它,然后将导出的库合约作为普通模块来使用。
请注意,目前尚不支持命名导入。 你只使用类似这样的导入语句:
import { MyLib } from “my_package”;
scrypt-ts-lib 是我们提供的一个智能合约库的集合,你可以在这里找到一些有用的工具,同样也欢迎大家发起 PR 贡献自己的库合约。
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z
为了减少我的小Rails应用程序中的代码重复,我一直致力于将我的模型之间的通用代码放入它自己的单独模块中,到目前为止一切顺利。模型的东西相当简单,我只需要在开头包含模块,例如:classIso这工作正常,但是现在,我将有一些Controller和View代码,这些代码也将在这些模型之间通用,到目前为止,我有这个用于我的可发送内容:#Thisisamodulethatisusedforpages/formsthatarecanbe"sent"#eitherviafax,email,orprinted.moduleSendablemoduleModeldefself.included(kl
尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。Ruby是一种美丽的语言,但有一个我讨厌写很多次的关键词“结束”。有什么方法可以写出简洁的代码而不用每次都写“end”吗?
当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在