调用cita-java-sdk时报错 out of quota

代码如下,使用 Java 8

package org.springblade.evidence.controller;


import com.citahub.cita.protocol.CITAj;
import com.citahub.cita.protocol.core.DefaultBlockParameter;
import com.citahub.cita.protocol.core.methods.request.Transaction;
import com.citahub.cita.protocol.core.methods.response.AppMetaData;
import com.citahub.cita.protocol.core.methods.response.AppSendTransaction;
import com.citahub.cita.protocol.http.HttpService;
import lombok.AllArgsConstructor;
import org.apache.commons.codec.binary.Hex;
import org.springblade.core.tool.api.R;
import org.springblade.evidence.entity.Evidence;
import org.springblade.evidence.service.EvidenceService;
import org.springframework.web.bind.annotation.*;
import java.nio.charset.StandardCharsets;

import java.io.IOException;
import java.math.BigInteger;
import java.util.Random;

/**
 * EvidenceController
 *
 * @author futingfei
 */

@RestController
@RequestMapping("evidence")
@AllArgsConstructor
public class EvidenceController {

	private EvidenceService service;

	@PostMapping("/upload")
	public R upload(@RequestBody Evidence evidence) throws IOException {
		CITAj citaService = CITAj.build(new HttpService("http://101.132.38.100:1337"));
//		String to = "0xffffffffffffffffffffffffffffffffff010000";
		Random r = new Random();
		String nonce = String.valueOf(Math.abs(r.nextLong()));
		AppMetaData appMetaData;
		appMetaData = citaService.appMetaData(DefaultBlockParameter.valueOf("latest")).send();
		long currentHeight = citaService.appBlockNumber().send().getBlockNumber().longValue();
		long validUntilBlock = currentHeight + 80;
		long quota = 1000000000;
		int version = appMetaData.getAppMetaDataResult().getVersion();
		BigInteger chainId = BigInteger.valueOf(1);
		String value = "0";
		String dataS = "evidence="+evidence.getEvidence()+"&timestamp"+evidence.getTimestamp();
		String data = String.valueOf(Hex.encodeHex(dataS.getBytes(StandardCharsets.UTF_8)));
		Transaction tx = Transaction.createContractTransaction(nonce, quota, validUntilBlock, version, chainId, value, data);
		String privateKey = "0x4e9baac008595db208b06e4c05f715c4c25ee18089ff4766d7c79742f2449f45";
		String rawTx = tx.sign(privateKey);
		AppSendTransaction result = citaService.appSendRawTransaction(rawTx).send();
		return R.status(service.save(evidence));
	}

	@GetMapping("/query")
	public R<Evidence> query(Long id) {
		Evidence res = service.getById(id);
		return R.data(res);
	}

}

报错截图为

本以为是 quota 不够大,但是设置到 long 类型的最大值之后依然报错。

可以麻烦帮我看一下吗?

你这是要存证吗?
为什么把to那行注释掉了?

如果不设置to字段的话,就会被当成创建合约。
创建合约会把data里面的内容当作代码去执行的,相当于C语言里面程序跑飞了,出任何情况都是有可能的。

是的,存证,现在改用了createFunctionCallTransaction接口就正常了,谢谢解答