Skip to content

Latest commit

 

History

History
474 lines (372 loc) · 9.72 KB

transaction.md

File metadata and controls

474 lines (372 loc) · 9.72 KB

请求

JD Chain限制单笔交易数据大小不得超过 4M

/**
 * 交易请求;
 */
@DataContract(code= DataCodes.TX_REQUEST)
public interface TransactionRequest {

	/**
	 * 交易哈希;
	 */
	@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
	HashDigest getTransactionHash();

	/**
	 * 交易内容;
	 */
	@DataField(order = 2, refContract = true)
	TransactionContent getTransactionContent();

	/**
	 * 终端用户的签名列表;
	 */
	@DataField(order = 3, list = true, refContract = true)
	DigitalSignature[] getEndpointSignatures();
	
	/**
	 * 接入交易的节点的签名;
	 */

	@DataField(order=4, list=true, refContract=true)
	DigitalSignature[] getNodeSignatures();

}

交易内容:

/**
 * 交易内容;
 */
@DataContract(code = DataCodes.TX_CONTENT)
public interface TransactionContent {
	
	/**
	 * 执行交易的账本地址;
	 * 
	 * 注:除了账本的创世交易之外,任何交易的账本地址都不允许为 null;
	 */
	@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
	HashDigest getLedgerHash();

	/**
	 * 操作列表;
	 */
	@DataField(order = 2, list = true, refContract = true, genericContract = true)
	Operation[] getOperations();

	/**
	 * 生成交易的时间;<br>
	 * 以毫秒为单位,表示距离 1970-1-1 00:00:00 (UTC) 的毫秒数;<br>
	 */
	@DataField(order = 3, primitiveType = PrimitiveType.INT64)
	long getTimestamp();

}

操作

Operation接口实现类均为JD Chain交易中支持的操作类型

共识信息变更

@DataContract(code= DataCodes.TX_OP_CONSENSUS_SETTINGS_UPDATE)
public interface ConsensusSettingsUpdateOperation extends Operation{

	/**
	 * 配置列表
	 */
    @DataField(order = 0, primitiveType = PrimitiveType.BYTES, list = true)
    Property[] getProperties();
}

合约部署

@DataContract(code= DataCodes.TX_OP_CONTRACT_DEPLOY)
public interface ContractCodeDeployOperation extends Operation {
	/**
	 * 合约账户信息
	 */
	@DataField(order=2, refContract = true)
	BlockchainIdentity getContractID();
	
	/**
	 * 合约代码字节
	 */
	@DataField(order=3, primitiveType=PrimitiveType.BYTES)
	byte[] getChainCode();

	/**
	 * 合约版本
	 */
	@DataField(order=5, primitiveType=PrimitiveType.INT64)
	long getChainCodeVersion();
}

合约调用

@DataContract(code = DataCodes.TX_OP_CONTRACT_EVENT_SEND)
public interface ContractEventSendOperation extends Operation {

	/**
	 * 合约地址;
	 */
	@DataField(order = 2, primitiveType = PrimitiveType.BYTES)
	Bytes getContractAddress();

	/**
	 * 合约方法名;
	 * 
	 * @return
	 */
	@DataField(order = 3, primitiveType = PrimitiveType.TEXT)
	String getEvent();

	/**
	 * 合约方法调用参数;
	 * 
	 * @return
	 */
	@DataField(order = 4, refContract = true)
	BytesValueList getArgs();

	/**
	 * 合约版本;
	 */
	@DataField(order = 5, primitiveType = PrimitiveType.INT64)
	long getVersion();
}

注册数据账户

@DataContract(code= DataCodes.TX_OP_DATA_ACC_REG)
public interface DataAccountRegisterOperation extends Operation {
	
	/**
     * 数据账户信息;
     */
    @DataField(order=1, refContract = true)
	BlockchainIdentity getAccountID();

}

写KV操作

@DataContract(code= DataCodes.TX_OP_DATA_ACC_SET)
public interface DataAccountKVSetOperation extends Operation {

	/**
	 * 数据账户
	 */
	@DataField(order=2, primitiveType=PrimitiveType.BYTES)
	Bytes getAccountAddress();

	/**
	 * KV列表
	 */
	@DataField(order=3, list=true, refContract=true)
	KVWriteEntry[] getWriteSet();
	
	
	@DataContract(code=DataCodes.TX_OP_DATA_ACC_SET_KV)
	public static interface KVWriteEntry{

		@DataField(order=1, primitiveType=PrimitiveType.TEXT)
		String getKey();

		@DataField(order=2, refContract = true)
		BytesValue getValue();

		@DataField(order=3, primitiveType=PrimitiveType.INT64)
		long getExpectedVersion();
	}

}

注册事件账户

@DataContract(code = DataCodes.TX_OP_EVENT_ACC_REG)
public interface EventAccountRegisterOperation extends Operation {

    @DataField(order = 2, refContract = true)
    BlockchainIdentity getEventAccountID();

}

发布事件

@DataContract(code = DataCodes.TX_OP_EVENT_PUBLISH)
public interface EventPublishOperation extends Operation {

    /**
     * 事件地址
     */
    @DataField(order = 1, primitiveType = PrimitiveType.BYTES)
    Bytes getEventAddress();

    /**
     * 事件列表
     */
    @DataField(order = 2, list = true, refContract = true)
    EventEntry[] getEvents();


    @DataContract(code = DataCodes.TX_OP_EVENT_PUBLISH_ENTITY)
    interface EventEntry {

        @DataField(order = 1, primitiveType = PrimitiveType.TEXT)
        String getName();

        @DataField(order = 2, refContract = true)
        BytesValue getContent();

        @DataField(order = 3, primitiveType = PrimitiveType.INT64)
        long getSequence();
    }
}

账本初始化

@DataContract(code= DataCodes.TX_OP_LEDGER_INIT)
public interface LedgerInitOperation extends Operation{

	/**
	 * 账本初始化配置
	 */
	@DataField(order=1, refContract=true)
	LedgerInitSetting getInitSetting();
	
}

参与方状态变更

@DataContract(code= DataCodes.TX_OP_PARTICIPANT_STATE_UPDATE)
public interface ParticipantStateUpdateOperation extends Operation {
	/**
	* 参与方身份
	*/
    @DataField(order = 0, refContract = true)
    BlockchainIdentity getParticipantID();

	/**
	* 新状态
	*/
    @DataField(order = 1, refEnum = true)
    ParticipantNodeState getState();
}

角色赋权

@DataContract(code = DataCodes.TX_OP_ROLE_CONFIGURE)
public interface RolesConfigureOperation extends Operation {

	/**
	 * 角色权限列表
	 */
	@DataField(order = 2, refContract = true, list = true)
	RolePrivilegeEntry[] getRoles();

	@DataContract(code = DataCodes.TX_OP_ROLE_CONFIGURE_ENTRY)
	public static interface RolePrivilegeEntry {

		/**
		 * 角色名
		 */
		@DataField(order = 1, primitiveType = PrimitiveType.TEXT)
		String getRoleName();

		/**
		 * 开启的账本权限列表
		 */
		@DataField(order = 2, refEnum = true, list = true)
		LedgerPermission[] getEnableLedgerPermissions();

		/**
		 * 关闭的账本权限列表
		 */
		@DataField(order = 3, refEnum = true, list = true)
		LedgerPermission[] getDisableLedgerPermissions();

		/**
		 * 开启的交易权限列表
		 */
		@DataField(order = 4, refEnum = true, list = true)
		TransactionPermission[] getEnableTransactionPermissions();

		/**
		 * 关闭的交易权限列表
		 */
		@DataField(order = 5, refEnum = true, list = true)
		TransactionPermission[] getDisableTransactionPermissions();

	}
}

用户赋权

@DataContract(code = DataCodes.TX_OP_USER_ROLES_AUTHORIZE)
public interface UserAuthorizeOperation extends Operation {

	/**
	 * 用户角色列表
	 */
	@DataField(order = 2, refContract = true, list = true)
	UserRolesEntry[] getUserRolesAuthorizations();

	@DataContract(code = DataCodes.TX_OP_USER_ROLE_AUTHORIZE_ENTRY)
	public static interface UserRolesEntry {

		/**
		 * 用户地址;
		 */
		@DataField(order = 0, primitiveType = PrimitiveType.BYTES, list = true)
		Bytes[] getUserAddresses();

		/**
		 * 要更新的多角色权限策略;
		 */
		@DataField(order = 2, refEnum = true)
		RolesPolicy getPolicy();

		/**
		 * 授权的角色清单;
		 */
		@DataField(order = 3, primitiveType = PrimitiveType.TEXT, list = true)
		String[] getAuthorizedRoles();

		/**
		 * 取消授权的角色清单;
		 */
		@DataField(order = 4, primitiveType = PrimitiveType.TEXT, list = true)
		String[] getUnauthorizedRoles();

	}
}

注册用户

@DataContract(code = DataCodes.TX_OP_USER_REG)
public interface UserRegisterOperation extends Operation {

	/**
	 * 用户身份信息
	 */
	@DataField(order = 2, refContract = true)
	BlockchainIdentity getUserID();
	
}

结果

交易执行结果数据结构如下:

@DataContract(code = DataCodes.TX_RESULT)
public interface TransactionResult {

	/**
	 * 交易哈希;
	 */
	@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
	HashDigest getTransactionHash();

	/**
	 * 交易被包含的区块高度;
	 */
	@DataField(order = 2, primitiveType = PrimitiveType.INT64)
	long getBlockHeight();

	/**
	 * 交易的执行结果;
	 */
	@DataField(order = 3, refEnum = true)
	TransactionState getExecutionState();

	/**
	 * 交易中操作的返回结果;顺序与操作列表的顺序一致;
	 */
	@DataField(order = 4, list = true, refContract = true)
	OperationResult[] getOperationResults();

	/**
	 * 账本数据快照;
	 */
	@DataField(order = 5, refContract = true)
	LedgerDataSnapshot getDataSnapshot();
}

查询

SDK查询交易详情数据使用LedgerTransaction接口实现

结构

@DataContract(code = DataCodes.TX_RECORD)
public interface LedgerTransaction {

	/**
	 * 交易请求;
	 */
	@DataField(order = 1, refContract = true)
	TransactionRequest getRequest();

	/**
	 * 交易结果;
	 */
	@DataField(order = 2, refContract = true)
	TransactionResult getResult();
}

解析

  • 成功/失败:
getResult().getExecutionState();

TransactionState.SUCCESS为成功,其他失败。

  • 操作解析
for(Operation operation : tx.getRequest().getTransactionContent().getOperations()) {
	// 注册用户
    if(operation instanceof UserRegisterOperation) {
        UserRegisterOperation userRegisterOperation = (UserRegisterOperation) operation;
        // ...
    // 注册数据账户
    } else if(operation instanceof DataAccountRegisterOperation) {
        DataAccountRegisterOperation dataAccountRegisterOperation = (DataAccountRegisterOperation) operation;
        // ...
    } // ...
}

上诉仅以注册用户/注册数据账户为例,其他操作类型嗯参照所有操作类型进行解析。